方法中的阴影变量

时间:2013-01-28 13:29:31

标签: java scjp shadowing

我正在阅读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)。

3 个答案:

答案 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)