我正在阅读Java 6的认证书。还有一个关于“阴影变量”的例子:
package scjp;
class Class1 {
int number = 28;
}
public class Example {
Class1 myClass = new Class1();
void changeNumber( Class1 myClass ) {
myClass.number = 99;
System.out.println("myClass.number in method : " + myClass.number);
myClass = new Class1();
myClass.number = 420;
System.out.println("myClass.number in method is now : " + myClass.number);
}
public static void main(String[] args) {
Example example = new Example();
System.out.println("myClass.number is : " + example.myClass.number );
example.changeNumber( example.myClass );
System.out.println("After method, myClass.number is : " + example.myClass.number);
}
}
这就是结果:
myClass.number is : 28
myClass.number in method : 99
myClass.number in method is now : 420
After method, myClass.number is : 99
我的问题是: 如果在开头,变量'number'是28.当我使用该方法时,它将变量更改为99和420.但是......,当方法完成时,为什么变量'number'的值为99而不是28? 我认为它会有原始价值(28)。
答案 0 :(得分:0)
您将所处理的实例的值更改为99;然后,您创建一个新实例并对其进行修改。
新创建的实例在changeNumber()的末尾被丢弃,因为它不再被引用。
答案 1 :(得分:0)
当您致电changeNumber()
时,会复制对example
的引用并将其传递给该方法。您更改number
的值,修改引用的对象,然后将新实例重新分配给myClass
,,这不会影响原始参考在main
。
一切都按预期进行,然后退出方法。返回main
方法,您仍然拥有example
的主要引用,该引用受第一次重新分配(number
)的影响,但不是myClass
的重新分配1}} 即可。这就是为什么你有99而不是原来的28。
答案 2 :(得分:0)
从第一行开始1- 数字= 28:
Main example = new Main();
///////主调用class1( myClass )---->设置数字= 28
2- System.out.println("myClass.number is : " + example.myClass.number );
////这里的输出是( myClass.number是:28 )
3- example.changeNumber( example.myClass );
///////在此方法中,您将设置 number = 99 然后将其打印(
方法中的 myClass.number:99
),然后创建新对象(表示数字= 28 ,并且前一个对象中的数字仍为= 99 ),新对象(myClass = new Class1 ();)将打印(方法中的 myClass.number现在为:420)
4- System.out.println("After method, myClass.number is : " + example.myClass.number)
; /////此行将打印 (方法后,myClass.number为:99) ,因为这是来自第一个对象创建(myClass)