-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

私の質問は次のとおりです。変数「番号」が最初に 28 の場合、メソッドを使用すると、変数が 99 と 420 に変更されます。しかし、メソッドが終了すると、変数「番号」はなぜ28 の代わりに 99 の値? 元の値(28)を持つと思いました。

4

3 に答える 3

0

を呼び出すchangeNumber()と、への参照exampleがコピーされ、メソッドに渡されます。の値number変更して、参照されるオブジェクトmyClassを変更してから、新しいインスタンスをに再割り当てします。これは、の元の参照には影響しませんmain

すべてが期待どおりに進み、メソッドを終了します。メソッドに戻ると、へmainのプライマリ参照がまだあります。これは、(の)exampleの最初の再割り当ての影響を受けますが、の再割り当ての影響は受けません。そのため、元の28ではなく99があります。numbermyClass

于 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 is : 28 )

3- example.changeNumber( example.myClass );///////このメソッドでは、number=99を設定してから出力し( myClass.number in method : 99 )、次に新しいオブジェクトを作成します(これはnumber=28 を意味し、前のオブジェクトの番号はまだ残っています=99 )、新しいオブジェクト(myClass = new Class1();)が出力されます (メソッドの myClass.number は現在: 420 です)

4- System.out.println("After method, myClass.number is : " + example.myClass.number);///// この行は(メソッドの後、myClass.number is : 99)と表示されます。これは、作成された最初のオブジェクト (myClass) からのものであるためです。

于 2013-01-28T13:49:24.920 に答える
0

扱うインスタンスの値を 99 に変更します。その後、新しいインスタンスを作成して変更します。

新しく作成されたインスタンスは、参照されなくなったため、changeNumber() の最後で破棄されます。

于 2013-01-28T13:34:14.653 に答える