2012-04-17 5 views
5

Ho appena sperimentato e ho scoperto che quando eseguo il rolling code, non viene compilato e non riesco a capire perché.Java: creazione di un riferimento statico all'elenco di campi non statici

Il mio IDE dice "Impossibile creare un riferimento statico all'elenco di campi non statici", ma non capisco veramente cosa o perché sia. Anche ciò che altrimenti non si applica a, vale a dire: è solo di variabili e metodi privati ​​o troppo e perché ?:

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

} 

Tuttavia, quando lo cambio al seguente, funziona:

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

Il metodo principale è statico. Ha solo accesso a variabili membro e funzioni della classe che li include. L'errore è abbastanza auto-esplicativo. – Perception

+0

Dal tuo codice, sembra che tu stia cercando di creare una fabbrica singleton. Se questo è il tuo obiettivo, dovresti cambiare l'elenco delle liste private; 'a' Elenco di liste statiche private; ' –

+0

@Perception: Quindi se cambia la' Lista di liste private; 'a' Elenco di liste statiche private; 'nel primo codice, dovrebbe funzionare ??? – noMAD

risposta

4

I campi statici sono campi condivisi tra tutte le istanze della classe.
i campi non statici/membri sono specifici di un'istanza della classe.

Esempio:

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

Qui ha senso che un dato macchina può avere qualsiasi numero di pneumatici, ma il numero massimo è lo stesso per tutte le vetture.
Se rendessimo modificabile la variabile tireMax, la modifica del valore significherebbe che tutte le auto possono ora avere più (o meno) pneumatici.

Il motivo per cui il secondo esempio funziona è che si sta recuperando lo list di una nuova istanza MyList. Nel primo caso, ci si trova nel contesto statico e non nel contesto di un'istanza specifica, quindi la variabile list non è accessibile.

+0

dovrebbe essere 'final' non in sola lettura – Lucas

0

Nel primo esempio si chiama campo non statico dal contenuto statico, che non è possibile. Nel secondo si chiama la funzione ext sull'oggetto MyList, che ha accesso a quel campo.