2011-09-13 20 views
1

在我的代碼,我有這樣一行:Netbeans的:訪問靜態字段 - 與類參考替換

private static ArrayList<Item> items = new ArrayList<Item>(); 

,然後我定義我的setter函數這樣

public void setItems(ArrayList<Item> items) { 
    this.items = items; 
} 

和NetBeans抱怨Accessing static field items, replace with class reference?

如果我將此類調用替換爲MyClass.items = items;這樣的類引用,它將不會傳播到當前對象中,不是嗎?

+0

一個設置靜態屬性的實例方法..可能想要重構那件作品:p。如果你想訪問'items'的對象的實例,你將不得不刪除靜態修飾符。 – Kevin

+0

所以不可能在類實例內改變靜態類成員的值? –

+0

你可以但爲什麼不爲它做一個靜態方法呢? – Kevin

回答

2

靜態變量永遠不會「傳播」到「當前」對象中。

它是靜態的,綁定到類。它甚至在沒有該類的實例的情況下生活,所以不需要「傳播」它。

btw:我會改變方法參數的名稱,在方法內有兩次相同的名字會引起混淆(如果參數沒有像靜態變量那樣命名,你不需要這個):

public void setItems(ArrayList<Item> itemList) { 
    items = itemList; 
} 
+0

所以如果我改變靜態成員的值,它會改變所有我的應用程序? –

+1

是的,這是一個靜態變量的性質 –

+0

好的,謝謝a_horse_with_no_name –

1

我不知道,如果你想items是靜態的。靜態屬性意味着該變量是那種全球性的。

如果您希望每個對象都有自己的items情況下,你會必須刪除static修飾符。

+0

不,我需要它是靜態的。這完全是因爲我需要替換'全局變量'行爲 –

+0

如果您需要替換全局變量行爲,靜態變量是**不是**的方式。 – Kevin

+0

和什麼比較好?我應該使用什麼樣的共享對象? –

2

那麼一旦你宣佈你班上的成員爲static那麼它就屬於這個班級。 也就是說,只有在創建第一個對象實例時纔會定義它。這將被存儲在類的堆棧中。 休息班的所有實例將共享成員變量。 當聲明一個非靜態變量時,無論何時我們爲該類創建對象,都會爲該變量分配一個單獨的內存,該內存將專用於該實例。

在這種情況下private static ArrayList<Item> items = new ArrayList<Item>();

是類的成員變量。雖然您可以使用this訪問該變量,但會造成混淆。在實例變量的情況下使用this,而通過類名稱本身訪問靜態成員變量。 我希望這清除了懷疑。

+0

'這是它只會在第一個對象實例被創建時定義一次'這是不正確的,從http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html'任何對象都可以改變一個類變量的值,但類變量也可以在不創建類的實例的情況下進行操作。「不是嗎?但其餘的答案是好的,謝謝 –

+0

@Merek Sebera:每個對象實例都有單獨的momory分配給靜態變量嗎?我想說的是,一旦類被加載到JVM中,靜態變量的內存將被分配一次。 – Amanpreet

+0

否所有感興趣的類之間只會共享一個實例。他們都將訪問相同的內存位置。但是,是的,你的pov是正確的。 –

相關問題