2012-12-11 91 views
0

我是新來的java。 這個問題可能不太清楚。讓我解釋一下使用代碼。 下面的代碼是一個打印出鏈接列表中的值的函數。 該函數的第一行創建一個引用,以指向HeadNode引用指向的同一個對象。因此,對currentNode的任何更改都會影響HeadNode指向的對象。 現在,在while循環中,我正在改變currentNode,但是我觀察到linkedList在我退出函數後沒有改變。爲什麼?如何在不改變函數參數值的函數中創建參考?

static void PrintLinkedList(ListNode HeadNode) 
    { 
     ListNode currentNode = HeadNode; 
     while(currentNode != null) 
     { 
      System.out.println(currentNode.getData()); 
      currentNode = currentNode.getNext(); 
     } 
    } 

UPDATE:

把這個quesiton了我的理由是,當我實現了一個函數來扭轉鏈表,我tempNode下面的代碼執行後成爲空:

static ListNode ReverseLinkedList(ListNode headNode) 
    { 
     ListNode headNodeTemp = headNode; 
     headNodeTemp.setNext(null); 
     ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
     ListNode currentNode = headNodeTemp; 
     while(tempNode != null) 
     {... 

回答

2

因此,對currentNode的任何更改都會影響HeadNode指向的對象。

不,currentNode是對對象的引用HeadNode也是指。你永遠不會改變那個物體,你所改變的只是currentNode所指的那個物體。

currentNode = currentNode.getNext(); 

使currentNode指向下一個對象,它不改變任何對象。

更改的對象,你需要調用一個方法或設置屬性,

currentNode.mutate(); 
currentNode.property = 17; 

將改變指向的對象,當對象是通過HeadNode查詢這些變化將是可見的。

currentNode = currentNode.getNext(); 

只是使currentNode指向另一個對象。

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    headNodeTemp.setNext(null); 

這裏,我們稱之爲改變了所指對象的方法。按照名稱,它將next字段設置爲null。而對象headNodeTemp指向的是對象headNode指向。

ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 

你應該移動

ListNode tempNode = headNode.getNext(); 

線以上setNext(null)線。

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    ListNode tempNode = headNode.getNext(); 
    headNodeTemp.setNext(null); 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 
+0

但currentNode引用該對象。因此,currentNode中的任何更改都會更改該對象。對? – user1701840

+0

不,''currentNode'只是一個保存對象地址的變量。 'currentNode'的改變改變'currentNode'指向的內容。要改變'currentNode'指向的對象,你必須調用一個方法或設置一個屬性。 'currentNode.mutate();'會改變對象。 –

+0

請閱讀我的,我希望澄清它。如果沒有,請ping我。如果你不想改變對象,你不能調用任何改變它的方法。但我認爲這可能是一個問題。 –

0

您正在混淆對象和引用。

currentNode = x不會更改currentNode指向的對象。相反,它將currentNode變量更改爲指向不同的對象。

這不會影響碰巧指向舊對象的任何其他字段或變量。

0

與其他帖子一致。所有參數都是Java中的傳值 - 演示:

public static void main(String[] args) { 

    List a = new ArrayList(); 
    a.add("Fred"); 

    changeA(a); 
    // contents of a is "Fred" not "Barney" (change to 'a' not reflected back here) 
    // because all arguments are Pass-By-Value 

    addToA(a); 
    // contents of a is "Fred" AND "Barney" 

    int b = 10;  

    changeB(b); 
    // b = 10 (not 20) 
} 

static void changeA(List a) { 
    a = new ArrayList(); // a is now a different object 
    a.add("Barney"); 
} 

static void addToA(List a) { 
    a.add("Barney"); 
} 

static void changeB(int b) { 
    b = 20; 
}