Подтвердить что ты не робот

Нестатический класс не может ссылаться на статический контекст

Возможный дубликат:
Почему я получаю "нестационарную переменную, на которую нельзя ссылаться из статического контекста" ?

Вот коды

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

ошибка говорит:

нестатический класс Node не может ссылаться на статический контекст

Почему я не должен ссылаться на класс Node в моем методе main()?

4b9b3361

Ответ 1

Нестатический вложенный класс в Java содержит неявную ссылку на экземпляр родительского класса. Таким образом, чтобы создать экземпляр Node, вам также понадобится экземпляр Stack. В статическом контексте (основной метод) нет экземпляра Stack для ссылки. Таким образом, компилятор указывает, что он не может построить Node.

Если вы сделаете Node статический класс (или обычный внешний класс), тогда ему не понадобится ссылка на Stack и может быть создана непосредственно в статическом основном методе.

Подробнее см. Специфика языка Java, глава 8, например, пример 8.1.3-2.

Ответ 2

Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам включающего класса, даже если они объявлены закрытыми. Статические вложенные классы не имеют доступа к другим членам включающего класса. Как член OuterClass, вложенный класс может быть объявлен закрытым, открытым, защищенным или закрытым.

Чтобы создать экземпляр внутреннего класса, вы должны сначала создать экземпляр внешнего класса. Затем создайте внутренний объект во внешнем объекте с помощью следующего синтаксиса: 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(); 
    }
}  

Ответ 3

Сделайте свой (Node) класс static

private static class Node {

Ответ 4

Или вы можете объявить класс Node вне public class Stack

Таким образом,

    public class Stack
    {

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

    }

Ответ 5

Java имеет два типа вложенных классов классов: статические и нестатические (aka internal). Класс Node - нестатический вложенный класс. Чтобы создать экземпляр Node, вы должны иметь экземпляр Stack:

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

Ответ 6

Если вы используете Eclipse IDE, вы увидите пояснения при наведении указателя мыши на ошибку. Он должен сказать что-то вроде этого:

Нет доступного экземпляра типа Stack. Должен квалифицировать выделение с помощью экземпляра типа Stack (например, x.new A(), где x является экземпляром Stack).

Вот рабочий код

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