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 的键值变为 12 而不是 10?代码打印出 4,10,11。我很困惑为什么它打印 10 而不是 12。

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) 当它更改密钥,它会在同一个对象中更改它。

在第二种情况下,f(Q)第二个 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 回答