2012-04-17 12 views
5

Ich habe gerade experimentiert und festgestellt, dass, wenn ich den Rolling Code ausführe, es nicht kompiliert und ich kann nicht herausfinden, warum.Java - eine statische Referenz auf die nicht statische Feldliste erstellen

Meine IDE sagt 'Kann nicht eine statische Referenz auf die nicht statische Feldliste machen', aber ich verstehe nicht wirklich, was oder warum das ist. Auch was sonst gilt es, das heißt: ist es nur private Variablen und Methoden oder auch und warum ?:

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

} 

Allerdings, wenn ich es auf die folgenden ändern, es funktioniert:

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

Die Hauptmethode ist statisch. Es hat nur Zugriff auf statische Elementvariablen und Funktionen der einschließenden Klasse. Der Fehler ist ziemlich selbsterklärend. – Perception

+0

Aus Ihrem Code sieht es so aus, als wollten Sie eine Singleton Factory erstellen. Wenn das Ihr Ziel ist, sollten Sie 'private List Liste ändern; 'zu' private statische Liste Liste; ' –

+0

@Perception: Also, wenn er die' private List-Liste ändert; 'zu' private statische Liste Liste; 'im ersten Code sollte es funktionieren ??? – noMAD

Antwort

4

statische Felder sind Felder, die für alle Instanzen der Klasse gemeinsam genutzt werden.
nicht statische/Mitgliedsfelder sind spezifisch für eine Instanz der Klasse.

Beispiel:

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

Hier macht es Sinn, dass eine bestimmte Auto eine beliebige Anzahl von Reifen haben kann, aber die maximale Anzahl ist die gleiche für alle Autos.
Wenn wir die tireMax Variable änderbar änderten, würde die Änderung des Wertes bedeuten, dass alle Autos jetzt mehr (oder weniger) Reifen haben können.

Der Grund für das zweite Beispiel ist, dass Sie die list einer neuen MyList-Instanz abrufen. Im ersten Fall befinden Sie sich im statischen Kontext und nicht im Kontext einer bestimmten Instanz, sodass auf die Variable list nicht zugegriffen werden kann.

+0

sollte "final" nicht readonly sein – Lucas

0

Im ersten Beispiel rufen Sie nicht statische Felder aus statischen Inhalten auf, was nicht möglich ist. In der zweiten rufen Sie ext-Funktion auf MyList-Objekt, das Zugriff auf dieses Feld hat.

Verwandte Themen