2009-11-20 26 views
1

我知道這是一個愚蠢的問題,但它真的讓我煩惱。幫我理解這個指針與價值問題

採取以下:

public <TParseable> LinkedList<TParseable> readAllParseable(
      Parseable<TParseable> parseable, boolean close) throws IOException 
{ 
    LinkedList<TParseable> list = new LinkedList<TParseable>(); 
    byte[] delim = parseable.getDelimiterValue(); 
    boolean skipNL = parseable.skipNewLines(); 

    while(ready()) 
    { 
    byte[] data = readTo(delim); 
    parseable.parse(data); 

    System.out.println(parseable); 

    list.add((TParseable)parseable); 
    } 
    return list; 
} 

的println語句,輸出呼叫parseable.parse(data)後各一次的預期toString()價值parseable。但是,返回的列表具有正確數量的元素,但它們都等於循環完成之前可解析的最後一個值。

這是因爲list.add(xxx)參數是通過指針而不是值傳遞的嗎?

回答

2

您發佈的代碼中只有一個parseable實例。當您撥打add(parseable)時,您將在列表中添加一個引用(「指針」在Java中不是很正確)至parseable

通過調用它多次,而不會改變反對parseable是指,你只是增加了同一對象更多引用到列表中。

新對象只能由new關鍵字創建。

+0

這就是我想的,只是想檢查。 – jdc0589 2009-11-20 05:31:45

0

您每次都將相同的可解析對象放入列表中。每次可解析時都會解析一些數據,它使用相同的可解析對象進行處理。

0

對象parseable通過整個方法是一樣的。我假設你撥打parseable.parse(data)時,它會改變可解析的內部數據。由於您一直將相同的對象放入列表中,因此您每次迭代都只使用同一個對象。

+0

是的。它應該是一個返回對象的新實例的靜態方法,但不幸的是,沒有辦法用接口或抽象方法來做到這一點......最近我真的很擔心。 – jdc0589 2009-11-20 05:34:23

+0

如果您發現自己希望在接口上使用靜態方法來創建新對象,那麼您需要的是工廠模式。 – tster 2009-11-20 06:11:55

0

我認爲你的概念問題是術語之一。如果我改變「價值」到「國家」,也許這將有助於澄清事情......

的println語句,通話後 預期的toString()的可解析 狀態每次輸出到 可解析.parse(數據)。 但是,返回的列表具有 元素的正確數目,但它們在完成循環之前都可以解析,但它們都等於最後的狀態的 。

在現實中,你的程序只使用一個可解析的情況下,和方法調用該實例正在改變其狀態

這是因爲list.add(XXX) 參數是通過指針,而不是 值傳遞?

號這是因爲該實例的狀態(如圖toString())正在發生變化。

實際上,Java對方法和構造函數調用中的所有參數使用傳值語義,而不管類型如何。有一點讓人困惑的是,當你在Java中傳遞Object /數組時,傳遞的「值」是一個引用。受支持的編程語言

的三個基本參數傳遞機制是:

  • 傳遞的價值,你複製這可能是一個原始值,指針/參考值,或值(在一些語言)結構化的價值。 (在某些語言中,返回時可以複製一個值,但這只是傳值的邏輯擴展。)

  • pass-by-reference在調用者中傳遞變量地址的地方,允許被調用者更改該變量,和/或查看改變變量的其他內容。

  • 這是一種在Algol-60中使用的「巧妙」機制,這個機制實施起來很昂貴,而且大多數程序員都難以有效使用。

我會遠離使用術語「傳遞指針」。這實際上只是另一種說法,「按指標傳遞價值」......如果你試圖把它看成是不同的東西,你最終會感到困惑。