2012-04-17 9 views
5

Właśnie eksperymentowałem i odkryłem, że po uruchomieniu kodu zmiennego, nie kompiluje się i nie mogę zrozumieć dlaczego.Java - tworzenie statycznego odwołania do niestatycznej listy pól

Moje IDE mówi: "Nie można utworzyć statycznego odwołania do niestatycznej listy pól", ale tak naprawdę nie rozumiem, co to jest ani dlaczego. Również to, co jeszcze jest do zastosowania, to znaczy: jest to tylko zmienne i metody prywatne lub też dlaczego ?:

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

} 

Jednak, kiedy go zmienić na następujących, to działa:

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

Główna metoda jest statyczna. Ma tylko dostęp do statycznych zmiennych składowych i funkcji klasy otaczającej. Błąd jest dość oczywisty. – Perception

+0

Z Twojego kodu wygląda na to, że próbujesz utworzyć fabrykę singletonów. Jeśli to jest twój cel, powinieneś zmienić 'prywatną listę list; 'do' listy statycznych list prywatnych; ' –

+0

@Perception: Więc jeśli zmienia' listę list prywatnych; 'na' list statycznych list prywatnych; 'w pierwszym kodzie powinien działać ??? – noMAD

Odpowiedz

4

Pola statyczne to pola, które są współużytkowane we wszystkich instancjach klasy.
Pola niestatyczne/elementy są specyficzne dla instancji klasy.

Przykład:

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

Tutaj ma sens, że każdy dany samochód może mieć dowolną liczbę opon, ale maksymalna liczba jest taka sama we wszystkich samochodach.
Jeśli zmieniliśmy zmienną tireMax, modyfikacja wartości oznaczałaby, że wszystkie samochody mogą mieć więcej (lub mniej) opon.

Powód, dla którego działa drugi przykład, polega na pobraniu list nowej instancji MyList. W pierwszym przypadku znajdujesz się w kontekście statycznym, a nie w kontekście konkretnej instancji, więc zmienna list jest niedostępna.

+0

powinien być "końcowy" nieprzypisany – Lucas

0

W pierwszym przykładzie wywołujesz pole niestatyczne z treści statycznej, co nie jest możliwe. W drugim wywołamy funkcję ext na obiekcie MyList, który ma dostęp do tego pola.