2012-11-14 161 views
28

可能重複:
Why do I get 「non-static variable this cannot be referenced from a static context」?非靜態類不能從靜態上下文中引用

這裏是代碼

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

錯誤說:

非靜態類節點不能從靜態上下文

在我的main()方法爲什麼不應該參考節點類引用?

+0

「節點」應該*不*是一個內部類「堆棧」的。恕我直言... – paulsm4

+0

@ paulsm4爲什麼不呢? – anthropomorphic

回答

42

Java中的非靜態的嵌套類包含與母體的實例的隱式引用類。因此,爲了實例化Node,您還需要具有Stack的實例。在靜態上下文中(主要方法),沒有提到Stack的實例。因此,編譯器指出它不能構造一個Node

如果您Node靜態類(或定期外類),那麼就不會需要Stack的引用,並可以在靜態main方法直接實例化。

參見Java Language Specification, Chapter 8對於細節,如實施例8.1.3-2。

+1

+1很好的解釋。 –

+2

'Node x = new Stack()。new Node();'是解決這個問題的另一種方法,但是我發現當我製作** Stack **類時**通用** - Stack ,代碼如下:'Node x = new Stack ().new Node();',它再次出現錯誤,並顯示相同的錯誤消息。你知道爲什麼嗎? – Bin

+0

@zbjosh嘗試輸入'x'作爲'Stack .Node'。 –

2

讓你(Node)類static

private static class Node { 
+1

我知道了,但你能詳細解釋一下嗎? – Bin

+0

您無法從靜態上下文訪問非靜態成員。主要方法是靜態的,而Node是非靜態的。因此,您可以使用外部類的實例來實例化非靜態內部成員類。但是,在這種情況下,我認爲將它變爲靜態會更有意義。您只需要一個可以堅持外部「類」的Node的定義,並且您仍然可以在需要時實例化它,而無需擁有外部類的實例。 –

2

或者你也可以聲明類節點以外的public class Stack

像這樣

public class Stack 
    { 

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

    } 
9

非靜態內部類(內部類)可以訪問封閉類的其他成員,即使它們是十二進制私人化。靜態嵌套類不能訪問封閉類的其他成員。作爲OuterClass的成員,可以將嵌套類聲明爲private,public,protected或package private。

要實例化一個內部類,必須首先實例化外部類。然後,創建外部對象內的內對象與此語法:OuterClass.InnerClass innerObject = outerObject.new InnerClass();

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

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

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

它看起來很棘手...... – Bin

+0

我測試了它,但是它的錯誤信息是相同的...... – Bin

+0

錯誤是什麼? 「 –

0

如果您使用Eclipse IDE,則將鼠標懸停在錯誤上時會看到解釋。它應該這樣說:

沒有可以訪問類型堆棧的封閉實例。必須用封閉的Stack類型實例來限定分配(例如x.new A(),其中x是Stack的一個實例)。

這裏是工作的代碼

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

Java有two types of nested member classes:靜態和非靜態(又名內)。 Node類是一個非靜態嵌套類。爲了創建一個Node的實例,你必須有一個Stack的實例:

Stack s = new Stack(); 
Node n = s.new Node(); 
相關問題