web-dev-qa-db-ja.com

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

可能性のある複製:
「静的コンテキストから参照できない非静的変数」を取得する理由

ここにコードがあります

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

エラーは言う:

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

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

38
Bin

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

Nodeを静的クラス(または通常の外部クラス)にすると、Stackへの参照が不要になり、静的mainメソッドで直接インスタンス化できます。

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

56
Emil Sit

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

内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。次に、次の構文を使用して、外部オブジェクト内に内部オブジェクトを作成します。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(); 
    }
}  
11

Javaには 2種類のネストされたメンバークラス :静的および非静的(別名インナー)があります。 Nodeクラスは、非静的なネストされたクラスです。 Nodeのインスタンスを作成するには、Stackのインスタンスが必要です。

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

Node)クラスをstaticにする

private static class Node {
2
Bhesh Gurung

または、クラスNode outside of public class Stack

そのようです、

    public class Stack
    {

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

    }
2
Austin

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

Stack型の囲まれたインスタンスにはアクセスできません。 Stack型の囲みインスタンスで割り当てを修飾する必要があります(例:x.new A()ここでxはStackのインスタンスです)。

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

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