我是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
3条答案
按热度按时间pobjuy321#
如您所注意到的,如果给示例变量起的名称与构造函数参数相同,则赋值
不初始化示例变量,因为构造函数的参数
course
,它是一个局部变量,隐藏同名的示例变量。您正在将局部变量赋给自身。因此示例变量保持不变
null
.你得写信
为了让任务生效。
另一方面,如果示例变量的名称与构造函数参数的名称不同,则可以不使用
this
前缀。二者都
和
会很好的。
请注意,使用
this
前缀即使不是强制性的,也有发现bug的优势。例如,如果你写错了
编译器不会抱怨,但你的
course
示例变量将不会初始化。另一方面,如果你写错了
编译器将给出一个编译错误,因为
newCourse
不是示例变量。anauzrmj2#
我认为你应该读一下关于“这个”关键字的官方文件。
将this与字段一起使用this关键字最常见的原因是,字段被方法或构造函数参数隐藏。
例如,point类是这样编写的
但可能是这样写的:
构造函数的每个参数都会隐藏对象的一个字段-在构造函数x中是构造函数第一个参数的本地副本。若要引用点字段x,构造函数必须使用此.x。
关于你的问题:
现在,这会被认为是不正确的吗?即使它看起来运行良好,是否应该避免?
这取决于你的项目或团队的代码风格。从技术上讲,这两种方法都是可行和正确的
name = newName
较短,且使用this.name = name
更安全地避免错误。vngu2lb83#
重要的是变量名。java总是在最接近的范围内使用变量,因此如果使用同名的参数,它将使用该参数。为了避免这种情况,您需要使用
this
. 此处(删除无关代码):您可以指定
course
到参数course
,所以这个领域course
保持不变。例如,如果您这样做:它不会编译,因为
final
关键字表示不允许将新值赋给变量(在本例中为参数course
).所以你需要使用
this
分配给字段。使用它从来不是“不正确的”
this
,但您可能认为最好不要将参数命名为与字段相同的名称(如果这样做,IDE中会有一些警告要激活,以防止出现这种情况)。