我有两节课。它们都引用构造函数中的相同变量。我很困惑,当我使用this.name
时,我不需要更改参数的名称,Java编译器知道我指的是主变量?
在第二个类示例中,参数名称已更改,但未使用this
。
这两个班级有什么不同?
他们都被认为是“好的编程”吗?
class Account {
private string name;
private int amount;
Account(String name, int amount) {
this.name = name;
this.amount = amount;
}
}
class Account {
private string name;
private int amount;
Account(String n, int a) {
name = n;
amount = a;
}
}
答案 0 :(得分:2)
在这种情况下,Account(String name, int amount)
如果您的代码显示name = "ABC";
,则设置参数name
,而不是成员。如果要设置成员,则需要通过this.name
引用它。
所以name = name;
什么都不做(将参数设置为自身)。 this.name = name;
将成员设置为参数。
答案 1 :(得分:2)
你的两个代码都没有错。但是,在Java中,使用无意义的名称前缀或后缀来区分实例变量和局部变量的参数被认为是不好的做法。我想建议使用任何名称使代码最容易理解。
答案 2 :(得分:1)
要么都没事。如果您希望私有实例变量也称为name,则只能使用this.name。如果您的实例变量与所引用的参数名称不同,则无关紧要。
答案 3 :(得分:1)
这两个班级之间有什么不同?
功能上没有。编译器将更改您的第二个示例如下:
Account(String n, int a)
{
this.name = n;
this.amount = a;
}
两种方式都考虑"良好的编程"?
我更喜欢第一种编写代码的方式。
答案 4 :(得分:1)
Java允许对实例变量和局部变量/参数使用相同的名称。
当方法/构造函数参数名称与实例变量名称相同时,我们需要显式使用this
关键字来通知JVM我们正在尝试使用此实例变量;不是局部变量。否则,对于没有this
的相同命名变量,JVM会选择更具体的范围变量。
对于第一种情况,您对名为name
的参数和实例变量使用相同的变量名称,因此您需要使用this
明确定义哪个是您的实例变量:
this.name = name;
对于第二种情况,没有命名混淆,因此如果您不使用this
,则识别实例变量没有问题。
<强> N.B。强>
在访问实例变量时,最好使用this
来提高可读性。