提问人:Andrew 提问时间:4/15/2023 最后编辑:Andrew 更新时间:10/4/2023 访问量:94
对对象指针/相等性感到困惑
Confused about object pointers/equality
问:
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?现在我糊涂了......有点像新手编码员,所以如果有人能为我解决这个问题,我将不胜感激。谢谢!!
答:
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
评论
var x = 4; var y = x; y = 2;
– x 仍然是 4。=
x=y, x=z
y=z
:=