Java - создание статической ссылки на список нестатических полей

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

Моя 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>
 Perception18 апр. 2012 г., 01:46
@noMAD - Да, хотя для этого простого примера он действительно должен просто объявить список в своем основном методе в любом случае.
 noMAD18 апр. 2012 г., 01:45
@ Перцепция: так что если он изменитprivate List list; вprivate static List list; в первом коде это должно работать ???
 noMAD18 апр. 2012 г., 01:50
@Perception: Спасибо, только еще одно последнее сомнение, это также относится ко всем статическим методам, верно? Не простоmain()?
 Sam Dufel18 апр. 2012 г., 01:45
Из вашего кода похоже, что вы пытаетесь создать фабрику синглтона. Если это ваша цель, вы должны изменитьprivate List list;  вprivate static List list;
 Perception18 апр. 2012 г., 01:43
Основной метод - статический. Он имеет доступ только к статическим переменным-членам и функциям окружающего класса. Ошибка довольно очевидна.

Ответы на вопрос(2)

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

Решение Вопроса

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

Пример:

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

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

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

 18 апр. 2012 г., 02:05
должно бытьfinal не только для чтения

Ваш ответ на вопрос