1

私は試験勉強をしていて、サンプル プログラムを調べていて混乱しています。コードは次のとおりです。

public class Problem1 {
public static void f(A X)
{
    A Y = X;
    Y.key = X.key + 1;
}

public static void f(B X)
{
    B Y = new B();
    Y.key = X.key + 2; //Y.key = 12
    X = Y; //X points to Y? 
}

public static void main(String[] args)
{
    A P = new A();
    P.key = 3;
    B Q = new B();
    Q.key = 10;
    f(P);
    System.out.println(P.key);
    f(Q);
    System.out.println(Q.key);
    P = Q;
    f(P);
    System.out.println(P.key);
    }
    }

    class A
    {
public int key;
    }
    class B extends A 
    {

    }

f(P)で大丈夫です。私が持っている質問は、f(Q) です。Y という名前の新しい B が作成され、そのキーは 12 であることがわかりました。私が持っている質問は、X = Y は X を Y に向けるべきではないということです。Q のキー値を 10 ではなく 12 にしますか? コードは 4,10,11 を出力します。12 ではなく 10 を出力する理由がわかりません。

4

1 に答える 1

3

Java では、P、Q、X などのクラス型の各変数は、オブジェクト (または null) への参照です。メモリのどこかにオブジェクトがあり、変数がそれを指していると想像できます:
P -----> (P object)
を呼び出すf(P)と、最初の f メソッドは同じオブジェクトへの参照を受け取りますが、それは別の参照です:
(main) P -----> (P object)
(f) X -----> (P object)
次に f はさらに別の参照を作成します
(f) Y -----> (P object) :キーを変更すると、同じオブジェクトで変更されます。

2 番目のケースでf(Q)は、2 番目の f メソッドが再び同じオブジェクトへの (異なる) 参照を受け取ります。
(main) Q -----> (Q object)
(f) X -----> (Q object)
次に、新しいオブジェクトを作成します。 (f) Y -----> (Y object)
次に、このオブジェクトのキーを変更し、X 変数をこのオブジェクトを指すように設定します
(f) X -----> (Y object, key=12)
。 、メイン メソッドでは、Q 変数は変更されていません
(main) Q -----> (Q object)
。X は Q の単なるコピーであるため、Q 自体ではありません。したがって、Q はまだ変更されていない Q オブジェクトを指しており、Y オブジェクトは変更されています。

于 2013-03-13T01:39:35.187 に答える