我正在读考试,我正在查看示例程序,我很困惑。这是代码:
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。
答案 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对象被修改。