我有以下snipet代码:
class Phone {
String phoneNumber = "123456789";
void setNumber () {
String phoneNumber;
phoneNumber = "987654321";
}
}
class TestPhone {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.setNumber();
System.out.println (p1.phoneNumber);
}
}
我期待“987654321”作为结果,但我得到“123456789” 就像方法setNumber没有任何效果一样 请有人帮我理解
答案 0 :(得分:9)
您在方法中重新声明phoneNumber变量,遮蔽类中的字段,因此在阴影类字段中将看不到对局部变量所做的任何更改。不要这样做;摆脱重复变量声明,以便在该字段中看到方法中所做的更改。
例如,改变这个:void setNumber () {
String phoneNumber; // *** this is a local variable, visible ONLY in the method!
phoneNumber = "987654321"; // this has no effect on the field
}
到此:
void setNumber () {
// String phoneNumber;
phoneNumber = "987654321"; // this will change the field!
}
答案 1 :(得分:2)
void setNumber () {
String phoneNumber;
phoneNumber = "987654321";
this.phoneNumber = "9876"; //this will change your field and give expected result
}
是保证设置字段值的另一种方法。
在long方法中,局部变量可以在没有的情况下遮蔽场 知道所以可能存在局部变量,总是使用
this
是一个 避免阴影的好点
答案 2 :(得分:0)
方法中的变量是阴影类变量...
这就是奇怪行为的原因......
答案 3 :(得分:0)
正如其他用户已经回答的那样,shadowing变量phoneNumber
由在setNumber
方法的范围内再次声明。
phoneNumber
内的变量setNumber
在其范围之外未知,而更改它不会影响声明为phoneNumber变量>班级成员。
这就是为什么明确地使用this
引用班级成员是一个好习惯。
附注:尝试使用访问修饰符而不是让它裸露(no modifier具有类和包访问级别)。根据经验,始终从限制性最强的访问修饰符开始,并且只在必要时才展开它。