【问题标题】:Java AssignmentsJava 作业
【发布时间】: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


【解决方案1】:

在 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对象被修改了。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多