【问题标题】:Shadowing variables in methods方法中的阴影变量
【发布时间】:2013-01-28 13:29:31
【问题描述】:

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

【问题讨论】:

  • 很明显的事情,我建议你从 OOP 开始。
  • 先生,我不像您那样是专家。不过谢谢你的回答。

标签: java scjp shadowing


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,您的回答很有帮助。 (其他人今天心情都不好)。
【解决方案2】:

你把你对待的实例的值改为99;之后您创建一个新实例并对其进行修改。

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

【讨论】:

    【解决方案3】:

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

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

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

    3- example.changeNumber( example.myClass );///////在这个方法中你将设置 number=99 然后打印它( myClass.number 在方法中:99 ) ,然后创建新对象(即 number=28 ,而前一个对象中的编号仍然 =99),新对象 (myClass = new Class1 ();) 将打印 (myClass.number in method is now : 420)

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

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 2013-06-15
      • 2022-01-27
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多