public class ListNode{
ListNode next=null;
int val;
public ListNode(int val){ this.val=val; } }
ListNode node=new ListNode(3);
ListNode mm=node; mm=null;
System.out.println(node==null); -------> false
ListNode nn=node; nn.val=100;
System.out.println(node.val); --------->100
首先我将节点分配给mm,但是在将null指定给mm之后,节点没有更改为null。但是当我将节点分配给nn,并且我更改了nn的值时,节点的值会发生变化!你知道为什么吗?
答案 0 :(得分:4)
您需要了解对象和变量(“指向”或“引用”对象)之间的区别。
让我们来看看你的代码。
ListNode node=new ListNode(3);
ListNode mm=node;
mm=null;
ListNode node=new ListNode(3);
这里我们做了两件事:
ListNode
对象,其中val
等于三。这个对象存在于内存中,在堆上。node
的变量。因此node
指的是或指向此对象。node ---------> ListNode(val = 3)
接下来,
ListNode mm=node;
现在我们有另一个名为mm
的变量,它现在指的是node
引用的同一个对象。
node ---------> ListNode(val = 3)
/
mm ---------/
最后,
mm=null;
这里我们说mm
现在没有提及(null
)。但是,内存中的对象保持不变。
node ---------> ListNode(val = 3)
mm ---------> (nothing)
ListNode nn=node;
nn.val=100;
System.out.println(node.val); // Prints "100"
ListNode nn=node;
同样,我们还有另一个名为nn
的变量,它现在指的是node
引用的同一个对象。
node ---------> ListNode(val = 3)
/
nn ---------/
下一步
nn.val=100;
在这里,我们实际上是在说:“接受nn
引用的任何对象,并将他的val
成员设置为100。”
node ---------> ListNode(val = 100) [note value changed!]
/
nn ---------/
最后,
System.out.println(node.val);
我们在这里说“取任何node
引用的对象,并获得他的val
成员的价值。”但请记住,node
和nn
指的是同一个对象。因此,我们在前一行上所做的更改也会反映在此输出中!
在许多程序中,我们可能有许多指向一个特定对象的变量。无论我们使用哪个变量来访问该对象,都会通过任何指向他的变量进行更改并显示。
对变量本身的更改意味着没有到其他变量!这就是为null
分配mm
对node
没有任何影响的原因。使对象“消失”的唯一方法是确保该对象有没有剩余引用。此时,它有资格进行垃圾收集。
答案 1 :(得分:1)
node
和mm
是两个独立的变量,引用同一个对象。当您为mm
指定null时,您只需删除mm
中存储的对象的引用,而不会影响对象或node
中存储的值。另一方面,当您更改对象中的值时,引用该对象的任何变量都不会更改,只会更改对象内部的值,因此当您打印其中任何一个引用的值时,您会看到更新的值。 / p>