gpt4 book ai didi

java - 分配空值或更改值之间有什么区别?

转载 作者:行者123 更新时间:2023-11-29 07:49:55 25 4
gpt4 key购买 nike

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赋值node,给mm赋null后,node并没有变成null。但是当我把node赋值给nn,我改变了nn的值,node的值就变了!你知道为什么吗?

最佳答案

您需要了解对象变量(“指向”或“引用”对象)之间的区别。

让我们浏览一下您的代码。

第一部分

ListNode node=new ListNode(3);
ListNode mm=node;
mm=null;

ListNode node=new ListNode(3);

这里我们做了两件事:

  1. 我们创建了一个新的 ListNode object,其 val 等于 3。这个对象存在于内存中,在堆上。
  2. 我们已将这个新对象 分配给名为node变量。所以节点引用或者指向这个对象。
node ---------> ListNode(val = 3)

接下来,

ListNode mm=node;

现在我们有另一个名为 mm变量,它现在指的是节点同一个对象指的是。

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 ---------> 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 成员的值。”但请记住,nodenn 指的是相同的对象。所以我们在上一行所做的更改也反射(reflect)在这个输出中!



结论

  • 在许多程序中,我们可能有许多指向一个特定对象的变量。无论我们使用哪个变量来获取该对象,都会通过指向他的任何变量进行更改并显示出来。

  • 变量自身的改变对其他变量没有任何意义!这就是为什么将 null 分配给 mmnode 没有影响。使对象“消失”的唯一方法是确保没有对该对象的剩余引用。此时它有资格进行垃圾收集

关于java - 分配空值或更改值之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21963249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com