2017-04-03 43 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文檔,您將可以順利學習。快樂學習,歡呼聲。