2017-04-03 39 views
1

我知道对象是通过值传递的,但是引用的值。引用在Java中如何工作?

所以说,我有一个类:

//Definition for singly-linked list. 
    public class ListNode { 
     int val; 
     ListNode next; 
     ListNode(int x) { val = x; } 
    } 

我做这样的事情:

ListNode n = new ListNode(3); 
ListNode n1 = new ListNode(4); 
n.next = n1; 

所以现在我有一个链表:

n -> n1 -> null 

现在我做一些假设如:

/* Previous code from above 
ListNode n = new ListNode(3); 
ListNode n1 = new ListNode(4); 
n.next = n1; */ 

ListNode ref = n; 
n = n.next; 

ref指向现在?

+6

“我知道对象通过引用传递。”不,他们不是。请参阅https://stackoverflow.com/questions/40480 –

+2

'ref'指向当时赋值时'n'参考的引用。所以它是“原始”的'n'。 –

+0

由于'n'指的是自身,因此ref会指向'n' –

回答

2

你的链接列表最初是如下

n -> n1 -> null,如果值它像 3 -> 4 -> null表示。

当你ListNode ref = n;然后ref指与值3

到节点现做n = n.next;参考变量n指具有值4 参考变量节点ref是由该assignement不受影响ref还是指节点与值3

如果n = n.next完成和值做ListNode ref = n;后反而被修改像n.val = 100那么作为refn两个本来指的同一对象ref.val == 100本来true

P.S.

引用和对象之间有区别。引用变量指的是对象。当两个引用引用同一个对象时,如果在一个引用中对对象状态进行修改*(通常使用.点运算符),则如果通过引用同一对象的其他引用读取对象状态,则会反映相同内容。但是如果其中一个引用被引用另一个对象(使用赋值运算符=),它不会影响其他引用,它仍然引用它所指的对象。

*注意并非总是状态被操作修改如String对象上的.trim()因为String类是不可变的。只记得调试和Java文档是你最大的帮助工具。如果您有任何疑问,请亲自尝试,调试您编写的代码,参阅java文档,您将可以顺利学习。快乐学习,欢呼声。