我是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
正如您所注意到的,如果您为实例变量指定与构造函数参数相同的名称,则赋值如下
course = course;
不会初始化实例变量,因为构造函数的参数
course
是一个局部变量,隐藏了同名的实例变量。您正在将局部变量分配给其自身。
因此实例变量仍然存在
null
。
你必须写
this.course = course;
为了让作业发挥作用。
另一方面,如果实例变量的名称与构造函数参数的名称不同,则可以将构造函数的参数分配给实例变量,而无需使用
this
前缀。
两者
course = newCourse;
和
this.course = newCourse;
会很好用。
请注意,即使不是强制性的,使用
this
前缀也有发现错误的优势。
例如,如果你写错了
newCourse = course;
编译器不会抱怨,但你的
course
实例变量不会被初始化。
另一方面,如果你写错了
this.newCourse = course;
编译器会给出编译错误,因为
newCourse
不是实例变量。
我认为你应该阅读关于“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
更安全,避免错误。
变量名才是最重要的。 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 中激活警告,以防止这种情况发生)。
先生,通过本教程我已经获得了关于构造函数的完整知识。读完这篇教程,你就不会再有任何困惑了。您可以了解定义构造函数、程序等的语法、功能、规则。我认为您应该访问一次本教程以获取有关构造函数的完整知识。