0

最後のステートメントの出力はなぜ1010ですか? これはどのタイプのコピーですか?深いか浅いか?

public class P {
    int k;
    public P() {
    }

    public static void main(String[] args) {
        P p = new P();
        P p1 = new P();
        p1.k = 4;
        p.k = 3;
        System.out.println("" + p1.k + p.k);
        p1 = p;
        System.out.println("" + p1.k + p.k);
        p.k = 9;
        p1.k = 10;
        System.out.println("" + p1.k + p.k);
    }
}
4

2 に答える 2

3

オブジェクト参照を使用しています。このステートメントp1 = pp1、 と同じオブジェクトを参照しますp。そのため、出力が得られます。参照先1010のオブジェクトを編集するためです。p1これは、参照先のオブジェクトと同じオブジェクトpです。

この図について考えてみましょう。参照前p = p1(黒矢印)。ステートメントの後に、(赤矢印)を参照します。p1o2o1

オブジェクト参照

これがディープ コピーかシャロー コピーかは、自分で簡単にテストできます。オブジェクト参照を含むクラスを作成します: class としましょうA

public class Main {
    public static void main(String[] args) {
        P p = new P(3);
        P p1 = new P(4);
        A a = new A(p);
        A a1 = new A(p1);
        System.out.println("a:  " + a.p.k);
        System.out.println("a1: " + a1.p.k);
        a1 = a;
        System.out.println("a:  " + a.p.k);
        System.out.println("a1: " + a1.p.k);
    }
}

class A {
    public P p;

    public A(P p) {
        this.p = p;
    }
}

class P {
    public int k;

    public P(int k) {
        this.k = k;
    }
}

出力は次のとおりです。

a:  3
a1: 4
a:  3
a1: 3

これは、浅いコピーであることを意味します。

于 2013-09-22T09:24:42.743 に答える
0

最初に、2 つのオブジェクトがありました。それらに o1 と o2 という名前を付けましょう。p は o1 を指し、p1 は o2 を指していました。

p1=p;p1 は、p が指すオブジェクトを指すことを意味します。したがって、p は引き続き o1 を指しますが、p1 も o1 を指します。(補足: o2 は、この時点でガベージ コレクションの対象となります)。

p または p1 を変更すると、実際にはオブジェクト o1 が変更されます。これは、o1.kp.k=9;が9 を保持し、o1.k が 10 を保持することを意味するためですreplacedp1.k=10;

それが役立つことを願っています。

于 2013-09-22T09:30:25.857 に答える