44

重複の可能性:
「静的コンテキストから参照できない非静的変数」が表示されるのはなぜですか?

ここにコードがあります

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

エラーは言う:

非静的クラスNodeは静的コンテキストから参照できません

main() メソッドで Node クラスを参照してはいけないのはなぜですか?

4

6 に答える 6

64

Javaの非静的ネストクラスには、親クラスのインスタンスへの暗黙の参照が含まれています。したがって、をインスタンス化するNodeには、のインスタンスも必要になりますStackStack静的コンテキスト(メインメソッド)では、参照するインスタンスはありません。したがって、コンパイラは、を構築できないことを示しますNode

静的クラス(または通常の外部クラス)を作成する場合Node、それはへの参照を必要とせずStack、静的mainメソッドで直接インスタンス化できます。

例8.1.3-2などの詳細については、Java言語仕様の第8章を参照してください。

于 2012-11-14T06:05:54.000 に答える
13

非静的ネストクラス(内部クラス)は、プライベートとして宣言されている場合でも、それを囲むクラスの他のメンバーにアクセスできます。静的にネストされたクラスは、それを囲むクラスの他のメンバーにアクセスできません。OuterClassのメンバーとして、ネストされたクラスは、private、public、protected、またはpackageprivateとして宣言できます。

内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。次に、次の構文を使用して、外部オブジェクト内に内部オブジェクトを作成します。OuterClass.InnerClass innerObject = outerObject.new InnerClass();

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

また

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

    public static void main(String[] args){
             Node node = new Stack().new Node(); 
    }
}  
于 2012-11-14T06:05:19.117 に答える
3

または、クラスNodeを外部で宣言することもできますpublic class Stack

そのようです、

    public class Stack
    {

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

    }
于 2012-11-14T06:03:55.050 に答える
3

Java には、静的メンバー クラスと非静的メンバー クラス (内部) の 2 種類のネストされたメンバー クラスがあります。クラスはNode非静的ネスト クラスです。のインスタンスを作成するには、 のインスタンスNodeが必要ですStack

Stack s = new Stack();
Node n = s.new Node();
于 2012-11-14T06:09:48.673 に答える
2

あなたの(Node)クラスを作るstatic

private static class Node {
于 2012-11-14T06:02:54.920 に答える
1

Eclipse IDE を使用している場合は、エラーにカーソルを合わせると説明が表示されます。次のように表示されます。

タイプ Stack の外側のインスタンスにアクセスできません。タイプ Stack の囲みインスタンスで割り当てを修飾する必要があります (例: x は Stack のインスタンスである xnew A())。

ここに作業コードがあります

public static void main(String[] args){
    Stack stack = new Stack();
     Node node = stack.new Node(); 
}
于 2012-11-14T06:09:29.110 に答える