1

コードをテストした後 (以下を参照)、いくつかの基本を理解していないことがわかりました。

クラスA。

class A {

    private String s;
    private int[] array;
    private B b;

    public A(String s, int[] array, B b) {
        this.s = s;
        this.array = array;
        this.b = b;
    }
}

クラスB。

class B {

    public int t;

    public B(int t) {
        this.t = t;
    }

}

私が行った変更は にA a = new A(s, array, b);影響すると思いましたa。のすべてのフィールドaと変数sarraybが同じオブジェクトを参照していませんか?

    String s = "Lorem";
    int array[] = new int[] {
            10, 20, 30
    };
    B b = new B(12);
    A a = new A(s, array, b);
    s = "Dolor";
    array = new int[] {
            23
    };
    b = new B(777); // Initialized with a new value, a.b keeps the old one. Why?
    System.out.println(a);

出力。

String Lorem
Array [10, 20, 30]
B 12

そしてこれについて。

B b2 = new B(89);
B b3 = b2;
System.out.println(b3);
b2 = null;
System.out.println(b3); // b2 initialized with null, b3 keeps the old one. Why?

出力。

89
89

ただし、2 つのリストがある場合、これは両方が同じオブジェクトを参照していることを示しています。

    ArrayList<String> first = new ArrayList<String>();
    first.add("Ipsum");
    ArrayList<String> second = new ArrayList<String>();
    second = first;
    first.add("The Earth");
    System.out.println(second);  

出力。

[Ipsum, The Earth]
4

4 に答える 4

4

違いは、割り当て変更です。

代入 ( =) は、変数が別のものを指すようにするため、基になるデータは変更されません。したがって、同じデータを指す他の変数は変更されません。

変更 ( 以外のほとんどすべて=) は、変数が指すものを変更しません。基になるオブジェクトを変更するだけです。そのため、同じデータを指す他の変数は変更されます。

あなたの例:

b = new B(777);は割り当てなので、 だけbが別のものを指すように変更されます。a.b変わりません。

b2 = null;は割り当てなので、 だけb2が別のものを指すように変更されます。b3変わりません。

と言えばb2.t = 5、これは変更になります (新しい値を に割り当てるのではなくb2、メンバーの 1 つを変更することによって変更します) b3

それがそれを説明することを願っています。

于 2013-05-27T07:21:04.303 に答える
1

より明確にするために、これらのコード行を試してください..

String s = "Lorem";
int array[] = new int[] {10, 20, 30};
B b = new B(12);
//A a = new A(s, array, b);

s = "Dolor";
array = new int[] {23};
b = new B(777);
A a = new A(s, array, b);
System.out.println(a);


ArrayList<String> first = new ArrayList<String>();
first.add("Ipsum");
ArrayList<String> second = new ArrayList<String>();
second = first;
second.add("The Earth");
first.remove("The Earth");
System.out.println("second :"+second);

クラス A のインスタンスを作成している間 (クラス A コンストラクターの呼び出し時) に String 、配列、およびオブジェクト b が保持している現在の値が出力されます。クラス A インスタンスを作成した後、 String 、配列、およびオブジェクト b は a.array などとして参照されます。s、array、b に新しい値を割り当てても、クラス A インスタンスには影響しません。

配列リストの質問では、2 つの配列リストは同じ参照のみを参照します。別の参照が必要な場合は、次のようにします... (ただし、常に = 割り当て演算子は同じ参照のみを作成します)

    ArrayList<String> first = new ArrayList<String>();
    first.add("Ipsum");
    ArrayList<String> second = new ArrayList<String>(first);
    second.add("The Earth");
    System.out.println("first :"+first);        
    System.out.println("second :"+second);     
于 2013-05-27T08:06:01.337 に答える
1

いいえ。問題は、a を変更しているのではなく、s に新しい値を割り当てているということです。S は文字列であり、不変です。つまり、s の値を変更することはできません。ただし、S で参照を変更することはできます。これは、あなたが行っていることです。

于 2013-05-27T07:20:15.837 に答える