Java分配

时间:2013-03-13 01:17:58

标签: java variable-assignment assignment-operator

我正在读考试,我正在查看示例程序,我很困惑。这是代码:

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。

1 个答案:

答案 0 :(得分: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)
但是,在您的main方法中,Q变量没有改变:
(main) Q -----> (Q object)
因为X只是Q的副本,所以不是Q本身。所以Q仍然指向未修改的Q对象,Y对象被修改。