可能性のある複製:
「静的コンテキストから参照できない非静的変数」を取得する理由
ここにコードがあります
public class Stack
{
private class Node{
...
}
...
public static void main(String[] args){
Node node = new Node(); // generates a compiling error
}
}
エラーは言う:
非静的クラスNodeは静的コンテキストから参照できません
Main()メソッドでNodeクラスを参照しないのはなぜですか?
Javaの非静的なネストされたクラスには、親クラスのinstanceへの暗黙的な参照が含まれています。 Node
の場合、Stack
のインスタンスも必要です。静的コンテキスト(メインメソッド)では、参照するStack
のインスタンスはありません。コンパイラは、Node
を構築できないことを示します。
Node
を静的クラス(または通常の外部クラス)にすると、Stack
への参照が不要になり、静的mainメソッドで直接インスタンス化できます。
例8.1.3-2などの詳細については、 Java言語仕様、第8章 を参照してください。
非静的なネストされたクラス(内部クラス)は、プライベートであると宣言されている場合でも、囲んでいるクラスの他のメンバーにアクセスできます。静的にネストされたクラスは、包含するクラスの他のメンバーにアクセスできません。 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();
}
}
Javaには 2種類のネストされたメンバークラス :静的および非静的(別名インナー)があります。 Node
クラスは、非静的なネストされたクラスです。 Node
のインスタンスを作成するには、Stack
のインスタンスが必要です。
Stack s = new Stack();
Node n = s.new Node();
(Node
)クラスをstatic
にする
private static class Node {
または、クラスNode outside of public class Stack
そのようです、
public class Stack
{
public static void main(String[] args){
Node node = new Node();
}
}
class Node{
}
Eclipse IDEを使用している場合、エラーにカーソルを合わせると説明が表示されます。次のように表示されるはずです。
Stack型の囲まれたインスタンスにはアクセスできません。 Stack型の囲みインスタンスで割り当てを修飾する必要があります(例:x.new A()ここでxはStackのインスタンスです)。
ここに作業コードがあります
public static void main(String[] args){
Stack stack = new Stack();
Node node = stack.new Node();
}