2011-09-13 2 views
1

В моем коде у меня есть эта строка:Netbeans: обращающийся статическое поле - Заменить со ссылкой класса

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

, а затем я определил свою функцию сеттера, как этого

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

no Между всеми заинтересованными классами будет использоваться только один экземпляр. И все они получат доступ к одному и тому же месту памяти. Но да, ваш pov правильный. –

Смежные вопросы