分配null或更改值之间的区别是什么?

时间:2014-02-23 02:06:25

标签: java

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的值时,节点的值会发生变化!你知道为什么吗?

2 个答案:

答案 0 :(得分:4)

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

让我们来看看你的代码。

第一部分

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

ListNode node=new ListNode(3);

这里我们做了两件事:

  1. 我们创建了一个新的ListNode 对象,其中val等于三。这个对象存在于内存中,在堆上。
  2. 我们已将此新的对象分配给名为node变量。因此node 指的是指向此对象。
  3. 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成员的价值。”但请记住,nodenn指的是同一个对象。因此,我们在前一行上所做的更改也会反映在此输出中!



    结论

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

    • 对变量本身的更改意味着没有到其他变量!这就是为null分配mmnode没有任何影响的原因。使对象“消失”的唯一方法是确保该对象有没有剩余引用。此时,它有资格进行垃圾收集

答案 1 :(得分:1)

nodemm是两个独立的变量,引用同一个对象。当您为mm指定null时,您只需删除mm中存储的对象的引用,而不会影响对象或node中存储的值。另一方面,当您更改对象中的值时,引用该对象的任何变量都不会更改,只会更改对象内部的值,因此当您打印其中任何一个引用的值时,您会看到更新的值。 / p>