2012-12-21 71 views
2

靜態方法是否與非靜態方法不同?讓說,我有我的項目下面的類/方法:參數傳遞到靜態方法和非靜態方法的區別

public abstract class A { 
    public static void populateList(List<Item> list) { 
     list.add(new Item("something")); //Item is custom class 
    } 

和:現在

public class B { 
    public void tryToPopulateList(List<Item> list) { 
     list.add(new Item("something2")); 
    } 

,如果我通過我的列表A類使用A.populateList(myList)然後指向list在方法體是一樣的在調用者中指向myList,因此這種靜態方法實際上改變了myList而不僅僅是它的本地副本。
但是如果我打電話:

B b = new B(); 
b.tryToPopulateList(myList); 

然後指向list的方法比指針myList所以我想這是創造了該方法的本地副本和「something2」添加到該副本不同。結果是原來的myList在這種情況下不會被改變。
這種行爲是否正常?你有任何解釋或鏈接到explenation傳遞參數如何在靜態函數中工作?
是的,我知道如果我想更改列表,我會更好地從函數中返回新的列表,但我只是很好奇,因爲我沒有在任何地方找到這個主題。謝謝。

編輯
正如評論所說,參數將被視爲相同的方式在靜態和非靜態方法。我在這裏沒有列出的代碼中犯了一個錯誤。

+2

您確定在第二種情況下沒有修改原始副本。我認爲,應該修改。請重新檢查一下。 –

+1

「靜態」與實例方法中的參數處理沒有區別。 – madth3

+0

那麼,至少不是在我的項目。我將在普通的Java應用程序中重新測試它,但在調試時,我可以清楚地看到方法體中的對象「list」與被調用者傳遞的「myList」具有不同的地址。另外返回者列表是未修改的(具有零項...不爲空)。 Item類的定義可以改變什麼?它只是String和bool持有者。 – Tom

回答

0

這是一條底線,Java中的所有方法參數都是按參考值。

2

正常情況下,應該沒有區別。 Java中的所有方法參數都是逐引號傳遞的,這意味着列表的地址(指針)被複制到被調用方法的參數中。

我只能想到您描述的行爲可能發生的一種情況:您是否使用提供面向方面編程功能的框架?您的非靜態方法調用可能被攔截。

+0

那麼,如果它有任何區別,那麼這是Android項目,並且此項目中只有外部庫是GSON。 – Tom