问题描述
如代码所示,当变量 x 被替换为 list 时,当 ListNode 的新实例被替换为 x.next 时,它会同时反映在 x 和 list 上(参见注释 1)。我认为这是因为 x 指的是列表。 但是,当新实例被替换为 x 时,它仅反映在 x 上,而不是列表上(请参阅注释 2)。 你能解释一下为什么会这样吗?
public class Sample {
public static void main(final String[] args) {
final ListNode list = new ListNode(0,null);
ListNode x = list;
//1.ListNode new instance is substituted for both x and list as x refers to list
x.next = new ListNode(1,null);
//2.ListNode new instance is substituted only for x,not list
x = new ListNode(1,null);
}
}
class ListNode {
int data;
ListNode next;
ListNode(final int data,final ListNode next) {
this.data = data;
this.next = next;
}
}
解决方法
https://github.com/indrabasak/Books/blob/master/Head%20First%20Java%2C%202nd%20Edition.pdf
阅读本书的第 3 章“原语和参考资料”。你的生活会变得更轻松。
,与 C++ 等其他语言不同,大多数 Java 变量(原语除外)都是对 Object
的引用。所以,之后:
ListNode x = list;
x
和 list
都引用同一个对象 (x == list
)。您所做的任何修改(例如更改 x.next
字段)都将应用于这两个变量。
但是,您始终可以更改 x
所引用的对象(但不能更改 list
,因为它是 final
)并且您可以这样做:
x = new ListNode(1,null);
在那之后x != list
。
您可以使用原始类型(如 int
)进行测试以查看发生了哪些变化。