对象引用的奇怪行为,"ghost" 对象

Weird behavior of object references, "ghost" object

当我偶然发现这种情况时,我正在弄乱一些示例代码来检查我是否理解对象在相互引用时的行为:

public class exampleClass {
    int testInt;
    exampleClass pointedObj;
    public static void main(String args[]) {
        exampleClass Obj1= new exampleClass();
        exampleClass Obj2= new exampleClass();
        exampleClass Obj3= new exampleClass();
        
        Obj1.pointedObj= Obj3;
        Obj2.pointedObj= Obj3;
        
        Obj1.testInt= 1;
        Obj2.testInt= 2;
        Obj3.testInt= 3;
        
        Obj3= Obj2;
        
        System.out.println(Obj1.pointedObj.testInt);
        System.out.println(Obj2.pointedObj.testInt);
        System.out.println(Obj3.pointedObj.testInt);
        
        System.out.println(Obj1.testInt);
        System.out.println(Obj2.testInt);
        System.out.println(Obj3.testInt);
    }
}

我希望在控制台上看到:

2
2
2
1
2
2

但我得到的是:

3
3
3
1
2
2

这让我发疯。如果对象的 none 具有所述值,为什么指向的对象仍然具有值“3”?我确定周围有类似的问题,但我没有能力搜索这个特定的东西。

我已经很感激任何帮助了。

存储在任何对象变量中的实际“值”是对对象的引用,而不是对象本身。当您将一个这样的变量的值赋给另一个变量时,您就是在分配该引用。

让我们看一下代码。

首先你创建了三个对象。让我们调用实际对象 A、B 和 C。您将对这些对象的引用分配给变量。

    exampleClass Obj1= new exampleClass(); // reference to object A
    exampleClass Obj2= new exampleClass(); // reference to object B
    exampleClass Obj3= new exampleClass(); // reference to object C

然后你做一些作业。在这里,您正在获取存储在 Obj3 中的引用并将其存储在某些实例成员中。

    Obj1.pointedObj= Obj3;  // Object A's pointedObj now points to object C
    Obj2.pointedObj= Obj3;  // Object B's pointedObj now points to object C

然后您对另一个实例成员进行一些分配。

    Obj1.testInt= 1; // Object A's testInt is now 1
    Obj2.testInt= 2; // Object B's testInt is now 2
    Obj3.testInt= 3; // Object C's testInt is now 3

最后,您将 Obj2 分配给 Obj3。所以 Obj3 现在指向对象 B。但这不会改变您之前分配给 pointedObj 成员的内容。它们仍然包含对 objectC 的引用。

    Obj3= Obj2;