提问者:小点点

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


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=obj 3,所以我认为您可以将obj.child替换为obj.child,以便换句话说,“obj.child=obj 2”行可能意味着“obj 3=obj 2”。但是,在打印语句中它返回false。

然而,如果你做了这样的事情

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

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

这里也一样:

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

现在它们实际上是相等的…所以你可以用obj. child代替obj.child?现在我很困惑…有点新手程序员,所以如果有人能为我澄清这一点,我将不胜感激。谢谢!!


共1个答案

匿名用户

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

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