1

なぜこれがそのように機能するのですか...(私にとっては直感に反します)

テスト.java:

public class Test {

    public TestObject obj1;
    public TestObject obj2;

    public Test() {
        obj1 = new TestObject();
        obj1.setInt(1);
        obj2 = obj1;
        System.out.println("Should be the same: " + obj1.getInt() + ", " + obj2.getInt());
        obj1.setInt(2);
        System.out.println("Should be different? (2, 1): " + obj1.getInt() + ", " + obj2.getInt());
        obj2.setInt(3);
        System.out.println("Should be different? (2, 3): " + obj1.getInt() + ", " + obj2.getInt());
    }

    public static void main(String[] args) {
        new Test();
    }

}

TestObject.java

public class TestObject {

    int integer;

    public void setInt(int n) {
        integer = n;
    }

    public int getInt() {
        return integer;
    }

}

これにより、驚くべきことに、「int integer」が同じになるように「両方のオブジェクト」が変更されます。

論理的に (私の論理が理にかなっている場合)、あるオブジェクトを別のオブジェクトと等しく設定するのは 1 回限りであり、いずれかのオブジェクトを変更しても自動的に他方が変更されることはないと想定します。2 つの参照を持つオブジェクトが実際には 1 つしかないなど、私が見逃しているものはありますか? か何か... ?

4

4 に答える 4

3

2 つの参照を持つオブジェクトは 1 つしかないのではないでしょうか?

はい。

このコード:

obj2 = obj1;

参照割り当てです。オブジェクトはコピーされません。

于 2013-05-31T00:53:15.810 に答える
2

割り当てを行った後は、 と のobj1両方がobj2同じオブジェクトへの参照になります。だから後

obj2 = obj1;

両方の参照が同じオブジェクトを指しています。すべての結果が一致する必要があります。コピーしたい場合は、次のようなことができます

obj2 = new TestObject(obj1.getInt());

または、インスタンスを取得してコピーを作成する新しいコンストラクターを作成します (少し優れた API)。

于 2013-05-31T00:53:11.960 に答える
0

両方のオブジェクトは、割り当てを行ったのと同じメモリ オブジェクトを指しています。

obj2 = obj1;

どちらの参照を使用してどのような変更を行っても、変更は同じメモリ オブジェクトに対して行われます。

于 2013-05-31T00:54:54.357 に答える
0

obj2 = obj1; と入力したとき。あなたは基本的に、obj2 と obj1 の両方のポインターが同じメモリ アドレスを指す必要があると言いました。したがって、同じオブジェクトを指します。次のように入力する必要があります。

...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...
于 2013-05-31T00:55:11.923 に答える