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

Confused about object pointers/equality

提问人:Andrew 提问时间:4/15/2023 最后编辑:Andrew 更新时间:10/4/2023 访问量:94

问:

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,但是在前面的代码中,obj3 只是被“替换”,但对象保持不变。

这里也是一样:

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

现在他们实际上是平等的......所以你可以用 obj3 代替 obj.child?现在我糊涂了......有点像新手编码员,所以如果有人能为我解决这个问题,我将不胜感激。谢谢!!

Java OOP 相等性

评论

3赞 knittl 4/15/2023
这回答了你的问题吗?Java 是“按引用传递”还是“按值传递”?
0赞 knittl 4/15/2023
var x = 4; var y = x; y = 2;– x 仍然是 4。
1赞 that other guy 4/16/2023
听起来你读的是数学相等,所以这意味着.它实际上是赋值,在数学中有时是写的,意思是“忘记以前的 x 定义,改用这个新定义”=x=y, x=zy=z:=
0赞 kaya3 4/16/2023
我建议你尝试使用这样的可视化来逐步完成你的程序。
0赞 Andrew 4/16/2023
@knittl 按值传递的东西是用于将对象传递到方法中。但是,此示例全部在 main 方法中。基本上我是在说为什么 obj.child = obj3 与说 obj2 = obj3 不同,假设 obj.child 是 obj2

答:

2赞 Yassin Hajaj 4/16/2023 #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 obj3 = new Practice(11);
// 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) +
//                 +--------------+ 

评论

0赞 Andrew 4/16/2023
有道理,所以obj.child存储的是指针而不是实际对象?但是说obj.child.value和说obj2.value有什么不同呢?
0赞 Yassin Hajaj 4/16/2023
在最后一个示例(第 5 行)中,它们没有什么不同。运行你的代码将向你证明这一点。 将返回 true。obj.child.value == obj2.value