-1

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

4

3 回答 3

0

您将处理的实例的值更改为 99;之后,您创建一个新实例并对其进行修改。

新创建的实例在 changeNumber() 结束时被丢弃,因为它不再被引用。

于 2013-01-28T13:34:14.653 回答
0

当您调用 时changeNumber(),将复制对的引用example并将其传递给该方法。您更改 的值number,这会修改被引用的对象,然后将新实例重新分配给myClass这不会影响 中的原始main引用。

一切都按预期进行,然后退出该方法。回到main方法,您仍然有对 的主要引用example,它受第一次重新分配 (of number) 的影响,但不受 重新分配的影响myClass。这就是为什么你有 99,而不是原来的 28。

于 2013-01-28T13:36:29.753 回答
0

1-从第一行开始,数字= 28:

Main example = new Main();///////主调用class1( myClass )---->设置number=28

2- System.out.println("myClass.number is : " + example.myClass.number );////这里的输出是(myClass.number 是:28

3- example.changeNumber( example.myClass );///////在此方法中您将设置number=99然后打印它( 方法中的 myClass.number :99 ),然后创建新对象(这意味着number=28,并且前一个对象中的数字仍然存在=99 ),新对象(myClass = new Class1();)将打印(方法中的 myClass.number 现在是:420)

4- System.out.println("After method, myClass.number is : " + example.myClass.number);///// 此行将打印(After method, myClass.number is : 99)因为这是从创建的第一个对象 (myClass)

于 2013-01-28T13:49:24.920 回答