对对象指针/相等性感到困惑

问题描述 投票:0回答:1
public class Practice {
    public int value;
    public Practice child;
    public Practice(int value) {
        this.value = value; 
    }

    public static void main(String[] args) {
        Practice obj = new Practice(10);
        Practice obj2 = new Practice(9);
        Practice obj3 = new Practice(11);

        obj.child = obj3;
        obj.child = obj2;

        System.out.println(obj2 == obj3);


    }

}

在这段代码中,因为我做了 obj.child = obj3,所以我认为你可以用 obj3 代替 obj.child,换句话说,“obj.child = obj2”这行可能意味着“obj3 = obj2”。但是,在 print 语句中它返回 false。

但是,如果你做类似的事情

obj.child = obj3;
obj.child.value = obj2.value;

然后你实际上是在操纵 obj3 因为它的值发生变化,但是在前面的代码中 obj3 只是“替换”但是对象保持不变。

这里也一样:

obj.child = obj3;
obj2 = obj.child;

现在它们实际上是相等的……所以你可以用 obj3 代替 obj.child?现在我很困惑......有点新手编码所以如果有人能为我解决这个问题我将不胜感激。谢谢!

java oop equality
1个回答
1
投票

这是每行代码之后发生的事情。

1

Practice obj = new Practice(10);
// HEAP
// ====
//                +--------------+
//      obj ----> + Practice(10) +
//                +--------------+

2

Practice obj2 = new Practice(9);
// HEAP
//                +--------------+
//      obj ----> + Practice(10) +
//                +--------------+
//
//                 +-------------+
//      obj2 ----> + Practice(9) +  
//                 +-------------+   

3

Practice obj = new Practice(10);
// HEAP
// ====
//                +--------------+
//      obj ----> + Practice(10) +
//                +--------------+
//
//                 +-------------+
//      obj2 ----> + Practice(9) +  
//                 +-------------+        
//  
//                 +--------------+       
//      obj3 ----> + Practice(11) +
//                 +--------------+    

4

obj.child = obj3;
// HEAP
// ====
//                +--------------+
//      obj ----> + Practice(10) +
//                +    child -------------+
//                +--------------+        |
//                                        |
//                 +-------------+        |
//      obj2 ----> + Practice(9) +        |
//                 +-------------+        | 
//                                        |
//                 +--------------+       |
//      obj3 ----> + Practice(11) +  <----+
//                 +--------------+ 

5

obj.child = obj2;
// HEAP
// ====
//                +--------------+
//      obj ----> + Practice(10) +
//                +    child -------------+
//                +--------------+        |
//                                        |
//                 +-------------+        |
//      obj2 ----> + Practice(9) + <------+
//                 +-------------+         
//                                        
//                 +--------------+       
//      obj3 ----> + Practice(11) +
//                 +--------------+ 
© www.soinside.com 2019 - 2024. All rights reserved.