2012-04-17 2 views
5

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

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

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); 
    } 

} 

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

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); 
    } 

} 
+2

Основной метод - статический. Он имеет доступ только к статическим переменным-членам и функциям охватывающего класса. Ошибка довольно понятна. – Perception

+0

Из вашего кода, похоже, вы пытаетесь создать одноадресную фабрику. Если это ваша цель, вы должны изменить 'private List list; 'to' private static List list; ' –

+0

@Perception: Итак, если он изменяет список' private List ', 'to' private static List list; 'в первом коде, он должен работать? – noMAD

ответ

4

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

Пример:

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

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

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

+0

должен быть 'final' not readonly – Lucas

0

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

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