Вопрос по instantiation, java, static, class, private-members – Java - создание статической ссылки на список нестатических полей

5

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

Моя IDE говорит "Невозможно сделать статическую ссылку на список нестатических полей", но я не совсем понимаю, что это или почему. Кроме того, к чему еще это относится, то есть к частным переменным и / или методам и почему?

<code>public class MyList {

    private List list;

    public static void main (String[] args) {
        list = new LinkedList();
        list.add("One");
        list.add("Two");
        System.out.println(list);
    }

}
</code>

Однако, когда я изменяю его на следующее, он работает:

<code>public class MyList {

    private List list;

    public static void main (String[] args) {
        new MyList().exct();
    }

    public void exct() {
        list = new LinkedList();
        list.add("One");
        list.add("Two");
        System.out.println(list);
    }

}
</code>
@ Перцепция: так что если он изменитprivate List list; вprivate static List list; в первом коде это должно работать ??? noMAD
@Perception: Спасибо, только еще одно последнее сомнение, это также относится ко всем статическим методам, верно? Не простоmain()? noMAD
@noMAD - Да, хотя для этого простого примера он действительно должен просто объявить список в своем основном методе в любом случае. Perception
Основной метод - статический. Он имеет доступ только к статическим переменным-членам и функциям окружающего класса. Ошибка довольно очевидна. Perception
Из вашего кода похоже, что вы пытаетесь создать фабрику синглтона. Если это ваша цель, вы должны изменитьprivate List list;  вprivate static List list; Sam Dufel

Ваш Ответ

2   ответа
4

статические поля - это поля, которые являются общими для всех экземпляров класса.
нестатические поля / поля-члены специфичны для экземпляра класса.

Пример:

public class Car {
  static final int tireMax = 4;
  int tires;
}

Здесь имеет смысл, что любой автомобиль может иметь любое количество шин, но максимальное количество одинаково для всех автомобилей.
Если мы сделалиtireMax переменная переменная, изменение значения будет означать, что все автомобили теперь могут иметь больше (или меньше) шин.

Причина, по которой ваш второй пример работает, заключается в том, что вы получаетеlist нового экземпляра MyList. В первом случае вы находитесь в статическом контексте, а не в контексте конкретного экземпляра, поэтому переменнаяlist не доступен

должно бытьfinal не только для чтения
0

В первом примере вы вызываете нестатическое поле из статического содержимого, что невозможно. Во втором случае вы вызываете функцию ext для объекта MyList, который имеет доступ к этому полю.

Похожие вопросы