Java分配
我正在准备考试,我正在浏览一个样本程序,我感到困惑。代码如下:Java分配,java,variable-assignment,assignment-operator,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 stati
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)。我得到一个新的B名为Y,它的关键是12。我的问题是,X=Y不应该指向X到Y吗?使Q的键值为12而不是10?代码打印出4,10,11。我不明白为什么它打印的是10而不是12 在java中,类类型的每个变量,如p、Q、X等,都是对对象的引用(或null)。您可以想象内存中某处有一个对象,变量指向它:
P----->(P对象)
调用
f(P)
时,第一个f方法接收对同一对象的引用,但它是不同的引用:(主)P---------->(P对象)
(f)X----->(P对象)
然后f又提出了另一个参考:
(f)Y----->(P对象)
当它改变关键点时,它会在同一个对象中改变它
在第二种情况下,f(Q)
,第二个f方法再次接收对同一对象的(不同)引用:(主)Q----->(Q对象)
(f)X----->(Q对象)
然后生成一个新对象:
(f)Y----->(Y对象)
然后更改此对象中的键,并将X变量设置为指向此对象:
(f)X----->(Y对象,键=12)
但是,在main方法中,Q变量没有改变:
(主)Q----->(Q对象)
因为X只是Q的复制品,它不是Q本身。因此Q仍然指向Q对象,它没有被修改,Y对象被修改。Java中的所有内容都是通过值传递的
X=Y
是该方法的本地对象,因此它不会接触到main
中的对象,因为本地引用X
现在指向一个完全不同的对象,使您只打印10
而不是12
。那么,为什么在公共静态无效f(A X)”中P的键值从3更改为4(A X)
,Y仍然指向同一个对象(在该方法中,您永远不会覆盖X指向的对象,因此当您执行Y.key=X.key+1
时,Y引用X引用的对象,即在main
中创建的对象)因此,这些变化是反映出来的。如果你真的想弄明白这一点,请重写变量名,如果你不密切注意,它们会让你感到困惑,并可能导致你走上错误的道路。在你掌握了概念之后,让它们具有挑战性。好的。谢谢你的帮助!