使用方法后的Java结果不符合预期

我有以下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没有任何影响任何人都可以帮助我理解请

您在方法中重新声明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! } 

除了@Hovercraft Full Of Eels

 void setNumber () { String phoneNumber; phoneNumber = "987654321"; this.phoneNumber = "9876"; //this will change your field and give expected result } 

是另一种保证设定领域价值的方法。

在long方法中,局部变量可以在不知道的情况下遮蔽字段,因此可能存在局部变量,总是使用this是避免阴影的好点

方法中的变量是阴影类变量…

这就是怪异行为的原因……

正如其他用户已经回答的那样,您通过在setNumber方法的范围内再次声明它来隐藏变量phoneNumber

setNumber的变量phoneNumber在其范围之外是未知的,并且更改它不会影响声明为类成员的不同phoneNumber变量。

这就是为什么明确地使用它来引用类成员是一个好习惯。

附注:尝试使用访问修饰符而不是让它裸露( 没有修饰符具有类和包访问级别)。 根据经验,始终从限制性最强的访问修饰符开始,并仅在必要时展开它。