Доступ к статическому полю исключен путем ссылки на класс?

Я не понимаю, почему это работает, пожалуйста, помогите обучить меня.

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, который устанавливает обе переменные-члены класса ConfigtileGallery 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" из каждого экземпляра будут указывать на один и тот же объект в памяти.

Статическая переменная получает память только один раз в области класса во время загрузки класса.

Другие вопросы по тегам