Доступ к статическому полю исключен путем ссылки на класс?
Я не понимаю, почему это работает, пожалуйста, помогите обучить меня.
Config CFIG = new Config();
Tile selectedTile = CFIG.tileGallery.get(1);
System.out.println("This is the name:" + selectedTile.getName());
Feature selectedFeature = CFIG.featureGallery.get(3);
System.out.println("This is the name:" + selectedFeature.getName()+
" " + selectedFeature.getEffect(0));
Я инициализирую объект CFIG
, который устанавливает обе переменные-члены класса Config
tileGallery
ArrayList и featureGallery
ArrayList. Когда я запускаю код, он работает, выводя выбранные тестовые значения. Однако для обоих декларативных операторов Netbeans выдает предупреждение "Доступ к статическому полю"
Используя подсказку "Заменить ссылкой на класс", он изменяет операторы на:
Tile selectedTile = Config.tileGallery.get(1);
Feature selectedFeature = Config.featureGallery.get(3);
Когда я запускаю его, он все еще работает!
Вопрос, Конфиг. не определяет, из какого объекта Config вызывать данные. Теперь у меня есть только один объект Config, но даже если я инициализирую второй объект Config, он все равно не выглядит запутанным.
Что тут происходит?
РЕДАКТИРОВАТЬ: Andih интересно, что код класса Config. Я не добавил его, потому что это было немного, и подумал, что вы можете легко предположить, что он сделал, поскольку это имеет отношение к проблеме. Однако, вот оно, на всякий случай.
public class Config {
public static ArrayList<Tile> tileGallery;
public static ArrayList<Feature> featureGallery;
public Config (){
this.tileGallery = Tile.ReadTileXML();
this.featureGallery = Feature.ReadFeatureXML();
}
}
2 ответа
Без точного кода вашего Config
класс трудно сказать, но похоже, что ваш Config
класс использует статические поля, такие как
public class Config {
public Config() {
titleGallery = new ArrayList();
titleTallery.add(new Title());
}
public static List<Title> titleGalery;
}
Вот что говорит намек.
В этом случае все ваши Config
экземпляры имеют одинаковый titleGalery, и вы можете получить к ним доступ через Config.titleGalery
,
Если вы хотите разные Config
экземпляры с другим значением, вам придется удалить static
ключевое слово, чтобы получить независимые поля экземпляра.
public class Config {
public Config() {
titleGallery = new ArrayList();
titleGallery.add(new Title());
}
// old: public static List<Title> titleGalery;
public List<Title> titleGalery;
}
Ключевое слово static означает, что это поле принадлежит классу, а не экземпляру класса. Даже если вы создадите сотню объектов, это поле будет общим для них. Эти статические поля "tileGallery" и "featureGallery" из каждого экземпляра будут указывать на один и тот же объект в памяти.
Статическая переменная получает память только один раз в области класса во время загрузки класса.