在 Java 的构造函数和其他方法中使用“this” - 什么时候可以跳过它?

问题描述 投票:0回答:4

我是Java新手,所以如果这是一个愚蠢的问题,请原谅我。我试图在这个论坛上找到明确的答案,但没有高兴。

我知道'这个'是什么。它知道它指的是一个实际实例,并有助于在定位变量时缩小上下文范围,但我发现尽管不使用 'this' 短语,但可以毫无问题地执行代码。事实证明,这取决于您在声明方法时如何命名参数。如下所示,如果我的参数命名与我正在初始化/修改的状态相同,则代码将返回 'null'

这只适用于声明变量的类。如果它试图访问/修改在其父类中声明的变量,您仍然必须在任何子类中使用 'this'

现在,这会被认为是不正确的吗?即使它看起来工作正常,也应该避免它吗?

谢谢!

class Student {

  protected String name;
  protected int age;
  protected String course;

  public Student(String passName, int passAge, String course) {
    name = passName;
    age = passAge;
    course = course;   // here my parameter is named the same as the state and it will return 'null' unless we use 'this'

  }

  public void update(String newName, int newAge, String newCourse) {
    name = newName;
    age = newAge;
    course = newCourse;   // here I set the name of my parameter to be different and it works

  }

  public void display() {
    System.out.println("Name: " + name + "\n Age: " + age + "\n Course: " + course + "\n");
  }

  public static void main(String[] args) {

    Student s1 = new Student("John", 20, "Java 101");
    s1.display();

    s1.update("Johnny", 21, "Java 101");
    s1.display();
  }
}

输出:

Name: John
 Age: 20
 Course: null

Name: Johnny
 Age: 21
 Course: Java 101
java this
4个回答
3
投票

正如您所注意到的,如果您为实例变量指定与构造函数参数相同的名称,则赋值如下

course = course; 

不会初始化实例变量,因为构造函数的参数

course
是一个局部变量,隐藏了同名的实例变量。您正在将局部变量分配给其自身。

因此实例变量仍然存在

null

你必须写

this.course = course;

为了让作业发挥作用。

另一方面,如果实例变量的名称与构造函数参数的名称不同,则可以将构造函数的参数分配给实例变量,而无需使用

this
前缀。

两者

course = newCourse;

this.course = newCourse;

会很好用。

请注意,即使不是强制性的,使用

this
前缀也有发现错误的优势。

例如,如果你写错了

newCourse = course;

编译器不会抱怨,但你的

course
实例变量不会被初始化。

另一方面,如果你写错了

this.newCourse = course;

编译器会给出编译错误,因为

newCourse
不是实例变量。


1
投票

我认为你应该阅读关于“this”关键字的官方文档

将 this 与 Field 一起使用 使用 this 关键字的最常见原因是字段被方法或构造函数隐藏 参数。

比如Point类是这样写的

public class Point {
    public int x = 0;
    public int y = 0;
        
    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

但也可以这样写:

public class Point {
    public int x = 0;
    public int y = 0;
        
    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

构造函数的每个参数都会隐藏对象的字段之一 - 构造函数 x 内部是构造函数第一个的本地副本 争论。要引用 Point 字段 x,构造函数必须使用 这个.x.

关于您的问题:

现在,这会被认为是不正确的吗?甚至应该避免吗? 虽然看起来运行良好?

这取决于您的项目或团队中的代码风格。从技术上来说,两种方式都是可行且正确的,使用

name = newName
更短,使用
this.name = name
更安全,避免错误。


0
投票

变量名才是最重要的。 Java 总是在最接近的可用范围内使用该变量,因此如果您使用同名的参数,它将使用该参数。为了避免这种情况,您需要使用

this
限定该字段。 这里(删除无关代码):

  public Student(String course) {
    course = course;
  }

您将

course
的值分配给参数
course
,因此字段
course
保持不变。例如,如果您这样做:

  public Student(final String course) {
    course = course;
  }

它不会编译,因为

final
关键字意味着您不允许为变量分配新值(在本例中为参数
course
)。

所以你需要使用

this
来分配给该字段。

  public Student(final String course) {
    this.course = course;
  }

使用

this
永远不会“不正确”,但您可能会认为最好的做法是不要将参数命名为与字段相同的名称(如果您这样做,则会在 IDE 中激活警告,以防止这种情况发生)。


-1
投票

先生,通过本教程我已经获得了关于构造函数的完整知识。读完这篇教程,你就不会再有任何困惑了。您可以了解定义构造函数、程序等的语法、功能、规则。我认为您应该访问一次本教程以获取有关构造函数的完整知识。

© www.soinside.com 2019 - 2024. All rights reserved.