3
public class TestVO {

    public static void main(String[] args) {
        VO vo1 = new VO();
        VO vo2 = new VO();
        VO vo3;
        VO vo4 = new VO();

        vo1.setName("Sourav");
        vo2.setName("Anil");

        vo3 = vo1;
        vo4 = vo1;

        System.out.println(" " + vo4.getName());

        vo1.setName("Abhishek.");

        System.out.println(vo1.getName() + "  " + vo2.getName() + " " + vo3.getName() + " " + vo4.getName());
    }
}

-- 出力は次のとおりです: ---

Sourav

Abhishek.  Anil Abhishek. Abhishek.

VO は単純なクラスであり、 文字列名を含み、gettersetterを含みます。

最初のSystem.out.println * vo4.getName() * print : Sourav OK.それは大丈夫です。

しかし、2番目のSystem.out.println * vo4.getName() * print : Abhishek.

私の質問は、なぜ 2 枚目の印刷物がアビシェークなのかということです。. 参照ではなく、vo4 オブジェクトに vo1 オブジェクトのコピーを保持しています。つまり、新しい記憶を作るということです。vo1 と vo4 が違います。ではなぜ 2 回目で vo4.getName を変更するのか。vo1 オブジェクトを設定していますが、vo4 は自動的に変更されます。なぜそれが起こっているのですか??

4

8 に答える 8

26

参照ではなく、vo4 オブジェクトに vo1 オブジェクトのコピーを保持しています。

いいえ、次のように、変数vo1同じオブジェクトに向けvo4ました。

+-----+
| | vo1 |--------\
+-----+ \ +----------------+
                 --->| (オブジェクト) |
+-----+ / | 名前 = アビシェク |
| | vo4 |--------/ +----------------+
+-----+

コードをたどってみましょう:

VO vo1 = new VO();

私たちに与えます:

+-----+ +----------------+
| | vo1 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

それで:

VO vo2 = new VO();

これで、次のようになりました。

+-----+ +----------------+
| | vo1 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

+-----+ +----------------+
| | vo2 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

それで:

VO vo3;

... (オブジェクトを指していない)で作成vo3するだけです。null

それで:

VO vo4 = new VO();

したがって、次のようになります。

+-----+ +----------------+
| | vo1 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

+-----+ +----------------+
| | vo2 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+
+-----+
| | vo3 | (無効です)
+-----+

+-----+ +----------------+
| | vo4 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

今:

vo1.setName("Sourav");
vo2.setName("Anil");

私たちに与えます:

+-----+ +----------------+
| | vo1 |------------->| (オブジェクト) |
+-----+ | 名前 = スーラフ | ***変更はこちら***
                     +----------------+

+-----+ +----------------+
| | vo2 |------------->| (オブジェクト) |
+-----+ | 名前 = アニル | *** そしてここ ***
                     +----------------+
+-----+
| | vo3 | (無効です)
+-----+

+-----+ +----------------+
| | vo4 |------------->| (オブジェクト) |
+-----+ | 名前 = null |
                     +----------------+

興味深いのは次のとおりです。

vo3 = vo1;
vo4 = vo1;

それvo3は同じオブジェクトvo1を指しvo4、そのオブジェクトも指し示し、指していたオブジェクトを解放しますvo4(ガベージコレクションの対象になります)。私たちに与えること:

+-----+
| | vo1 |----\
+-----+ \
             \
+-----+ \ +----------------+
| | vo3 |------------->| (オブジェクト) |
+-----+ / | 名前 = スーラフ |
             / +----------------+
+-----+ /
| | vo4 |----/
+-----+

+-----+ +----------------+
| | vo2 |------------->| (オブジェクト) |
+-----+ | 名前 = アニル |
                     +----------------+

System.out.println(" " + vo4.getName());

...ご想像のとおり、「Sourav」が表示されます。

それで

 vo1.setName("Abhishek.");

... vo1vo3、およびvo4がすべて指しているオブジェクトを変更します。

+-----+
| | vo1 |----\
+-----+ \
             \
+-----+ \ +----------------+
| | vo3 |------------->| (オブジェクト) |
+-----+ / | 名前 = アビシェク |
             / +----------------+
+-----+ /
| | vo4 |----/
+-----+

+-----+ +----------------+
| | vo2 |------------->| (オブジェクト) |
+-----+ | 名前 = アニル |
                     +----------------+

...など、、、または「アビシェク」が表示さgetName()れます。vo1vo3vo4

于 2013-07-12T07:54:35.457 に答える
6

vo1 と vo4 の両方が同じオブジェクトを参照しているためです。

以下の代入は、vo1 によって参照されるオブジェクトを参照するように vo4 を作成します。

vo4 = vo1;

したがって、いずれかの参照 (vo1 または vo4) によって参照オブジェクトに加えられた変更は、同じオブジェクトに反映されます。

したがって、たとえば vo4.setName("xyz") を変更すると、vo4 によって参照されるオブジェクトが変更されますが、実際には vo1 も同じオブジェクトを参照しています。そのため、多くの参照 (この場合は vo1 と vo4) によって参照されている 1 つのオブジェクトに割り当てられた 1 つのメモリ位置で変更が行われます。

于 2013-07-12T07:54:23.800 に答える
0

次の図を準備する必要があります。ご覧のとおり、vo1、Vo3、Vo4 は同じオブジェクトを指しています。

ここに画像の説明を入力

于 2013-07-12T08:19:08.153 に答える