Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java分配_Java_Variable Assignment_Assignment Operator - Fatal编程技术网

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
中创建的对象)因此,这些变化是反映出来的。如果你真的想弄明白这一点,请重写变量名,如果你不密切注意,它们会让你感到困惑,并可能导致你走上错误的道路。在你掌握了概念之后,让它们具有挑战性。好的。谢谢你的帮助!