【发布时间】:2013-02-28 19:09:20
【问题描述】:
我正在准备考试,我正在查看一个示例程序,但我很困惑。代码如下:
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。
【问题讨论】:
-
Java 中的一切都是按值传递
X = Y;是方法的本地对象,因此它不会触及main中的对象,因为本地引用 @987654324 @ 现在指向一个完全不同的对象,留下10而不是12。 -
那么,为什么“public static void f(A X)”中P的key值从3变成了4?
-
在
public static void f(A X)中,Y 仍然指向同一个对象(您永远不会覆盖 X 在该方法中指向的内容,因此当您执行Y.key = X.key +1时,Y 引用 X 引用的内容,即 Object在main) 中创建,以便反映更改。 -
如果您真的想弄清楚这一点,请重写变量名称,如果您不密切注意,它们会令人困惑并且可能会导致您走错路。 在你掌握了这个概念之后让他们挑战。
-
好的。感谢您的帮助!
标签: java variable-assignment assignment-operator