2012-11-14 29 views
28

Eventuali duplicati:
Why do I get “non-static variable this cannot be referenced from a static context”?classe non-statico non è possibile fare riferimento da un contesto statico

Ecco i codici

public class Stack 
{ 
    private class Node{ 
     ... 
    } 
    ... 
    public static void main(String[] args){ 
     Node node = new Node(); // generates a compiling error 
    } 
} 

l'errore dice:

non statici della classe Nodo non può essere referenziato da un contesto statico

Perché non dovrei fare riferimento alla classe Node nel mio metodo main()?

+0

"Node" dovrebbe * non * essere una classe interna di "Stack". IMHO ... – paulsm4

+0

@ paulsm4 perché no? – anthropomorphic

risposta

42

Una classe innestata non statica in Java contiene un implicito riferimento ad un un'istanza del genitore classe. Pertanto, per creare un'istanza di Node, è necessario disporre anche di un'istanza di Stack. In un contesto statico (il metodo principale), non vi è alcuna istanza di Stack a cui fare riferimento. Pertanto il compilatore indica che non è possibile costruire un Node.

Se si specifica Node una classe statica (o una normale classe esterna), non è necessario un riferimento a Stack e può essere istanziata direttamente nel metodo principale statico.

Vedere Java Language Specification, Chapter 8 per dettagli, come Esempio 8.1.3-2.

+1

+1 Ottima spiegazione. –

+2

'Nodo x = new Stack(). New Node();' è un altro modo per risolvere questo problema, ma trovo che quando faccio lo ** Stack ** class ** generico ** - Stack , e scrivi codice come: 'Nodo x = nuovo Stack () .new Node();', è sbagliato di nuovo con lo stesso messaggio di errore. Sai perché? – Bin

+0

@zbjosh Prova a digitare 'x' come' Stack .Node'. –

2

Fai la tua (Node) classe static

private static class Node { 
+1

Lo so, ma puoi spiegarlo in dettaglio? – Bin

+0

Non è possibile accedere ai membri non statici dal contesto statico. Il metodo principale è statico mentre il nodo non è statico. Pertanto, è possibile utilizzare un'istanza di classe esterna per creare un'istanza della classe membro interna non statica. Ma, in questo caso, penso che avrebbe più senso renderlo statico. Hai solo bisogno di una definizione del Nodo che possa rimanere attaccata alla "classe" esterna e sarai comunque in grado di istanziarla quando è necessario senza la necessità di avere un'istanza della classe esterna. –

2

Oppure si potrebbe dichiarare il nodo di classe fuori di public class Stack

Come così,

public class Stack 
    { 

     public static void main(String[] args){ 
      Node node = new Node();   
}   
    } 
    class Node{ 

    } 
9

classi annidate non statici (classi interne) hanno accesso ad altri membri della classe che li accoglie, anche se sono dec lared privato. Le classi nidificate statiche non hanno accesso ad altri membri della classe che li include. Come membro di OuterClass, una classe nidificata può essere dichiarata privata, pubblica, protetta o privata del pacchetto.

Per creare un'istanza di una classe interna, è necessario innanzitutto creare un'istanza della classe esterna. Quindi, creare l'oggetto interno all'interno dell'oggetto esterno con la seguente sintassi: OuterClass.InnerClass innerObject = outerObject.new InnerClass();

public static void main(String[] args){ 
     Stack stack = new Stack(); 
     Node node = stack.new Node(); 
    } 

o

public class Stack 
{ 
    private class Node{ 
     ... 
    } 
    ... 
    ... 
    ... 

    public static void main(String[] args){ 
      Node node = new Stack().new Node(); 
    } 
} 
+0

sembra difficile ... – Bin

+0

Lo provo, ma è sbagliato con lo stesso messaggio di errore ... – Bin

+0

qual è l'errore? –

0

Se si utilizza l'IDE Eclipse, verrà visualizzata la spiegazione quando si passa il mouse sopra l'errore. Dovrebbe essere qualcosa di simile a:

Nessuna istanza di tipo acclusa è accessibile. È necessario qualificare l'allocazione con un'istanza di tipo Stack acclusa (ad es. X.new A() dove x è un'istanza di Stack).

Qui sta lavorando codice

public static void main(String[] args){ 
    Stack stack = new Stack(); 
    Node node = stack.new Node(); 
} 
1

Java ha two types of nested member classes: statico e non statico (aka interno). La classe Node è una classe nidificata non statica. Al fine di creare un'istanza di un Node è necessario disporre di un'istanza di un Stack:

Stack s = new Stack(); 
Node n = s.new Node(); 
Problemi correlati