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

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

Вот коды

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

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

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

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

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

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

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

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

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

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

 private static class Node { 

Или вы можете объявить class Node за пределами public class Stack

Вот так,

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

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

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

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

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

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

 public static void main(String[] args){ Stack stack = new Stack(); Node node = stack.new Node(); } 
  • Почему у нас нет статического метода в (нестационарном) внутреннем classе?
  • Как можно получить доступ к «этому» из внешнего classа из внутреннего classа?
  • Java (анонимные или нет) внутренние classы: полезно ли их использовать?
  • Как включить JSON в объект с помощью Jackson?
  • Могут ли внутренние classы получить доступ к закрытым переменным?
  • Частные внутренние classы в C # - почему они не используются чаще?
  • Вызвать метод активности из classа BroadcastReceiver
  • Внутренний class и локальные переменные
  • «Нестатическая переменная, на которую нельзя ссылаться из статического контекста» при создании объекта
  • Почему внутренние classы делают доступными частные методы?
  • BroadcastReceiver как внутренний class
  • Давайте будем гением компьютера.