public class StackWithLinkedList< P> {
private Node top = null;
public StackWithLinkedList(){}。
public void push(P val)/span>{
Node newNode = new Node(val)。
if (this.top != null) {
newNode.nextLink = top。
}
this.top = newNode;
}
public void traverse(){
Node currentNode = this.top。
while(currentNode != null){
System.out.println(currentNode.val)。
currentNode = currentNode.nextLink。
}
}
private class Node{
Node nextLink。
P值。
public Node(P val){
this.val = val;
}
}
}
看看traverse()中的這段代碼,
Node currentNode = this.top。
這里創建了一個Node型別的物件,指向已經存在的this.top節點物件。
所以這意味著,兩個參考指向記憶體中的同一個物件,不是嗎?
但是當我使用 traverse() 方法時,這兩個物件獨立作業,因為 currentNode 在遍歷后變成了 Null,但是 this.top 保持不變,持有所有被推送的節點。
我試著除錯,我看到this.top的記憶體地址與currentNode相同。
在最后, 我無法弄清楚這是為什么? 我無法弄清楚這是為什么?
uj5u.com熱心網友回復: 你把 "物件 "和 "參考 "混為一談。例如在這句話中 例如在這里: 看看traverse()中的這段代碼, 這里創建了一個Node型別的物件,指向已經存在的
現有的this.top節點物件。 這里沒有創建 這里定義的是一個 是的,這部分又是正確的。 將參考想象成一張紙。這張紙可以是空的(即參考是 現在 在代碼的后期, 但是,僅僅因為你在那張紙上寫了字,并不意味著另一張紙(通過 或者換一種說法。給 如果你做了 第一個只是改變了 編輯:你的困惑似乎來自于除錯視圖,它說
標籤:
Node currentNode = this.top。
Node型別的物件(沒有new,這就是你如何知道的)。Node型別的(本地)變數。而存盤在this.top中的參考也被分配給currentNode。所以這意味著,兩個參考
指向記憶體中的同一個物件,不是嗎?
null),或者它可以有一些地址寫在上面(即它指向某個物件)。
currentNode 是一張紙,它恰好寫有與 this.top 同樣的地址(這有點復雜,因為 this 是一張寫在上面的紙,如果你看一下這個地址,那么你會發現另一張標有 top 的紙,上面寫有一些地址,但是這并沒有從根本上改變作業方式)。
currentNode被重新分配(也就是說,這張紙的內容被改變)。首先是到一個不同的地址(即地址被潦草地涂掉并被另一個地址所取代),然后最終用null(即你潦草地涂掉內容并讓它 "空白")。this.top找到)已經改變了。沒有理由讓它改變:它們是兩張獨立的紙,在某一時刻碰巧有相同的東西寫在它們上面。
currentNode分配一個新的值,對currentNode之前參考的物件完全沒有影響currentNode.nextLink = null而不是(基本上)currentNode = null,那么這將是不同的:
currentNode = null意思是 "洗掉寫在標有currentNode的紙片上的地址。
currentNode.nextLink = null意思是 "到標有currentNode的紙片上的地址,在那里找到標有nextLink的紙片并洗掉寫在上面的地址。
currentNode的參考,第二個實際上改變了currentNode指向的object。
currentNode = {StackWithLinkedList$Node@801}。你似乎將其理解為"currentNode是{StackWithLinkedList$Node@801}物件",但這并不是它的意思。
currentNode 從來不是一個物件。它不可能是。Java 變數/欄位不能容納物件。所以這個顯示真正的意思是。 currentNode currently references the object represented as {StackWithLinkedList$Node@801}.


