2012-11-14 2 views
28

Mögliche Duplizieren verwiesen werden:
Why do I get “non-static variable this cannot be referenced from a static context”?nicht-statische Klasse kann nicht von einem statischen Kontext

Hier werden die Codes sind

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

der Fehler sagt:

nicht-statische Klasse Knoten können nicht von einem statischen Kontext referenziert werden

Warum soll ich nicht die Node-Klasse in meiner Methode main() beziehen?

+0

„Knoten“ sollte * * nicht eine innere Klasse von „Stack“ sein. IMHO ... – paulsm4

+0

@ paulsm4 warum nicht? – anthropomorphic

Antwort

42

Eine nicht-statische geschachtelte Klasse in Java enthält ein implizites Bezugnahme auf eine Instanz des Mutter Klasse. Um also eine Node zu instanziieren, müssten Sie auch eine Instanz von Stack haben. In einem statischen Kontext (der Hauptmethode) gibt es keine Instanz von Stack, auf die Bezug genommen wird. Daher gibt der Compiler an, dass er kein Node konstruieren kann.

Wenn Sie Node eine statische Klasse (oder reguläre äußere Klasse) machen, benötigt es keinen Verweis auf Stack und kann direkt in der statischen Hauptmethode instanziiert werden.

Einzelheiten siehe Beispiel Java Language Specification, Chapter 8, Beispiel 8.1.3-2.

+1

+1 Große Erklärung. –

+2

'Knoten x = new Stack(). New Node();' ist eine andere Möglichkeit, um dieses Problem zu lösen, aber ich finde, wenn ich die ** Stack ** Klasse ** generische ** - Stack , und schreibe Code wie: 'Knoten x = new Stack () .new Node();', es ist wieder falsch mit der gleichen Fehlermeldung. Weißt du, warum? – Bin

+0

@zbjosh Versuchen Sie 'x' als' Stack .Node' einzugeben. –

2

Machen Sie Ihre (Node) Klasse static

private static class Node { 
+1

Ich weiß es, aber können Sie es im Detail erklären? – Bin

+0

Sie können nicht aus statischem Kontext auf nicht statische Mitglieder zugreifen. Die Hauptmethode ist statisch, während der Knoten nicht statisch ist. Sie können also entweder eine Instanz der äußeren Klasse verwenden, um die nicht statische innere Memberklasse zu instanziieren. Aber in diesem Fall würde es meiner Meinung nach mehr Sinn machen, es statisch zu machen. Sie brauchen nur eine Definition des Knotens, die bei der äußeren "Klasse" bleiben kann, und Sie können ihn immer noch instanziieren, wann immer es notwendig ist, ohne dass eine Instanz der äußeren Klasse benötigt wird. –

2

Oder Sie könnten die Klasse Node außerhalb von public class Stack

Wie so,

public class Stack 
    { 

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

    } 
9

Nicht-statische verschachtelte Klassen deklarieren (innere Klassen) haben Zugriff auf andere Mitglieder der einschließenden Klasse, selbst wenn sie dez sind Lared privat. Statisch verschachtelte Klassen haben keinen Zugriff auf andere Member der umschließenden Klasse. Als Mitglied der OuterClass kann eine verschachtelte Klasse als private, public, protected oder package private deklariert werden.

Um eine innere Klasse zu instanziieren, müssen Sie zuerst die äußere Klasse instanziieren. Dann erzeugen die innere Objekt innerhalb des äußeren Objekt mit dieser Syntax: OuterClass.InnerClass innerObject = outerObject.new InnerClass();

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

oder

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

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

sieht es knifflig ... – Bin

+0

Ich teste es, aber es ist falsch mit der gleichen Fehlermeldung ... – Bin

+0

Was ist der Fehler? –

0

Wenn Sie Eclipse IDE verwenden, sehen Sie die Erklärung, wenn Sie den Mauszeiger über den Fehler bewegen. Es sollte so etwas sagen:

Keine umschließende Instanz des Typs Stack ist zugänglich. Muss die Zuordnung mit einer umschließenden Instanz vom Typ Stack (z. B. x.new A(), wobei x eine Instanz von Stack ist) qualifizieren.Hier

arbeitet Code

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

Java hat two types of nested member classes: statische und nicht-statische (auch bekannt als innere). Die Node Klasse ist eine nicht statische geschachtelte Klasse. Um eine Instanz eines Node zu erstellen, müssen Sie eine Instanz eines Stack haben:

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