0

据我所知,当一个对象分配给另一个对象(例如 o2 = o1)时,o2 指向 o1 指向的实际对象。因此,实际对象的任何变化对于两个对象都是可见的。假设我们有两个名为 A1 和 A2 的类,如下所示:

class A1{
    int a;  A2 a2;
    A1(int a, A2 a2) { 
        this.a = a; this.a2 = a2; }
    public void setA(int a) { this.a = a;}
    public void setA2(A2 a2) { this.a2 = a2;}
    public int getA() { return a;}
    public A2 getA2() { return a2;}
}

class A2 {
    int b;
    A2(int b) { this.b = b;}
    public void setB(int b) { this.b = b;}
    public int getB() { return b;}
}

在我们的主要功能中:

A1 o1 = new A1(10, new A2(20));
A1 o2 = o1;
System.out.println("o2==="+o2.toString());
o1.setA(12);
o1.setA2(new A2(22));
System.out.println("o2==="+o2.toString());

结果如下:

o2=(10,20)
o2=(12,22)

通过 A1 o2 = o1 语句,o2.a2 指向 o1.a2(它们是引用类型)。因此,通过执行 o1.setA2(new A2(22)) 语句,为 o1.a2 创建了一个新对象,但 o2.a2 指向的前一个对象不应更改。因此我希望第二个输出必须是(12,20)。请帮助我为什么第二个输出是(12,22)而不是(12,20)???

4

3 回答 3

0

o2 指向原始 A1 对象,因此对这个 A1 对象所做的更改将被 o1 和 o2 看到。

A1 o1 = new A1(10, new A2(20)); //o1 points to a new A1 object
A1 o2 = o1; //o2 now points to the A1 object o1 points to
System.out.println("o2==="+o2.toString());
o1.setA(12); //setting the original A1 objects a to 12;
o1.setA2(new A2(22)); // setting the original A1 object's A2's b to 22.
System.out.println("o2==="+o2.toString());  // o2 still refers to the original A1 object so it will reflect the changes
于 2013-07-25T03:08:59.053 回答
0

据我所知,当一个对象分配给另一个对象(例如 o2 = o1)时,o2 指向 o1 指向的实际对象。因此,实际对象的任何变化对于两个对象都是可见的

A1 o2 = o1;

这是您将一个对象分配给另一个对象的部分。

o1.setA(12);
o1.setA2(new A2(22));

您改变 o1 ,因此,实际对象的任何更改对于两个对象都是可见的

System.out.println("o2==="+o2.toString());

在这里,我们看到 o1 的变化反映在 o2 中。

更新

假设 m1 是 o1.a2 的位置。当 A1 o2 = o1 执行时,o1.a2 和 o2.a2 都指向 m1。当调用 o1.setA2(new A2(22)) 时,首先创建新的 A2 对象(让 m2 为新对象的位置),然后 o1.a2 指向 m2。但 o2.a2 必须指向 m1。如果我们使用 o1.getA2().setB(22),那么第二个输出确实是 (12,22),但在这种情况下,不清楚为什么会发生这种情况???

发生的情况是您认为 java 通过引用传递但不是。Java 按值传递引用

简单的例子:

public static void method1(A a){
  a.setB("B");  
}

public static void method2(A a){
  a= new A();
  a.setB("B");
}

public static void main(String args []){
    A a = new A();
    a.setB("A");
    method2(a);
    System.out.println(a.getB()); // will print "A"
    method1(a.getB()); // will print "B"

}
于 2013-07-25T03:35:04.827 回答
0

由于 o1 和 o2 指向同一个对象,所以 o1 和 o2 都会看到 o1 上的变化。
您说“setA2(new A2(22)) 语句,为 o1.a2 创建了一个新对象,但 o2.a2 指向的前一个对象不应更改。”
这可能是错误的。在这种情况下,创建了 o1.a2,这意味着 o1.a2 指向一个新对象,但请注意,o2.a2 与 o1.a2 拥有相同的引用。因此,可以预期输出为 o2=(12,22)。

于 2013-07-25T03:37:34.627 回答