2012-11-14 9 views
28

Powiel możliwe:
Why do I get “non-static variable this cannot be referenced from a static context”?klasa non-static nie można odwoływać się od statycznego kontekście

Oto kody

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

błąd mówi:

non-static class Węzeł nie można odwoływać się od statycznego kontekście

Dlaczego nie powinienem skierować klasę węzła głównego sposobu mojego()?

+0

„Node” powinno * nie * być wewnętrzna klasa „komin”. IMHO ... – paulsm4

+0

@ paulsm4 czemu nie? – anthropomorphic

Odpowiedz

42

Non-statyczne zagnieżdżone klasy Java zawiera niejawny odniesienie do przykład rodzica klasa. Aby utworzyć instancję Node, musisz również mieć instancję Stack. W kontekście statycznym (główna metoda) nie ma instancji, do której można się odwoływać. W związku z tym kompilator wskazuje, że nie może zbudować Node.

Jeśli uczynisz Node klasą statyczną (lub zwykłą klasą zewnętrzną), to nie będzie potrzeby odwoływania się do Stack i może być utworzona bezpośrednio w statycznej metodzie głównej.

Szczegółowe informacje, takie jak przykład 8.1.3-2, można znaleźć w Java Language Specification, Chapter 8.

+1

+1 Doskonałe wyjaśnienie. –

+2

'Węzeł x = nowy stos() .Nowy węzeł();' to inny sposób na rozwiązanie tego problemu, ale uważam, że gdy zrobię ** ** klasę ** ** - stos i napiszę kod taki jak: 'Węzeł x = nowy stos () .new Node();', to jest znowu źle z tym samym komunikatem o błędzie. Wiesz dlaczego? – Bin

+0

@zbjosh Spróbuj wpisać 'x' jako' Stack .Node'. –

2

Dodać (Node) Klasa static

private static class Node { 
+1

Wiem, ale czy możesz wyjaśnić to szczegółowo? – Bin

+0

Nie można uzyskać dostępu do nie statycznych elementów ze statycznego kontekstu. Główna metoda jest statyczna, podczas gdy węzeł nie jest statyczny. Tak więc możesz użyć instancji klasy zewnętrznej, aby utworzyć instancję niestatycznej wewnętrznej klasy członków. Ale w tym przypadku wydaje mi się, że bardziej sensowne byłoby uczynienie go statycznym. Potrzebna jest tylko jedna definicja węzła, która może pozostać przy zewnętrznej "klasie", a nadal będzie można ją utworzyć w razie potrzeby bez potrzeby posiadania instancji zewnętrznej klasy. –

2

Albo można zadeklarować klasy Node poza z public class Stack

Ci się tak,

public class Stack 
    { 

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

    } 
9

dla statycznych klas zagnieżdżonych (klasy wewnętrzne) mają dostęp do innych elementów klasy otaczającej, nawet jeśli są one dec lared prywatny. Statyczne klasy zagnieżdżone nie mają dostępu do innych elementów klasy otaczającej. Jako członek klasy OuterClass klasa zagnieżdżona może być zadeklarowana jako prywatna, publiczna, chroniona lub jako pakiet prywatna.

Aby utworzyć instancję klasy wewnętrznej, należy najpierw utworzyć instancję klasy zewnętrznej. Następnie należy utworzyć wewnętrzną obiektu w zewnętrznej przedmiotu ze składni: OuterClass.InnerClass innerObject = outerObject.new InnerClass();

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

lub

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

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

Wygląda na to, że jest trudny ... – Bin

+0

Testuję, ale jest źle z tym samym komunikatem o błędzie ... – Bin

+0

jaki jest błąd? –

0

Jeśli używasz środowiska IDE Eclipse, zobaczysz wyjaśnienie po najechaniu kursorem na błąd. Powinien on brzmieć mniej więcej tak:

Żadna obudowa typu stosu nie jest dostępna. Musi kwalifikować alokację przy użyciu otaczającej instancji typu Stack (na przykład x.new A(), gdzie x jest instancją Stack).

Tutaj jest kod działa

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

Java ma two types of nested member classes: statyczne i nie statyczne (aka wewnętrzna). Klasa Node jest niestatyczną klasą zagnieżdżoną. W celu utworzenia instancji Node trzeba mieć instancję Stack:

Stack s = new Stack(); 
Node n = s.new Node(); 
Powiązane problemy