2012-11-14 5 views
28

Можно создать дубликат:
Why do I get “non-static variable this cannot be referenced from a static context”?не статический класс не может ссылаться из статического контекста

Ниже приведены коды

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

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

нестатическая класс Node нельзя ссылаться из статического контекста

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

+0

«Узел» должен * не * быть внутренний класс «Стек». IMHO ... – paulsm4

+0

@ paulsm4 почему нет? – anthropomorphic

ответ

42

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

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

Для получения более подробной информации, например, в примере 8.1.3-2, см. Java Language Specification, Chapter 8.

+1

+1 Отличное объяснение. –

+2

'Node x = new Stack(). New Node();' это еще один способ решить эту проблему, но я нахожу, что когда я делаю ** Stack ** class ** generic ** - Stack и записываю код вроде: 'Node x = new Stack () .new Node();', это снова неправильно с тем же сообщением об ошибке. Ты знаешь почему? – Bin

+0

@zbjosh Попробуйте ввести 'x' как' Stack .Node'. –

2

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

private static class Node { 
+1

Я знаю это, но можете ли вы объяснить это подробно? – Bin

+0

Вы не можете получить доступ к нестационарным элементам из статического контекста. Основной метод - статический, а узел - нестатический. Таким образом, вы можете использовать экземпляр внешнего класса для создания нестатического внутреннего класса-члена. Но в этом случае я думаю, что было бы более целесообразно сделать его статичным. Вам просто нужно одно определение узла, которое может придерживаться внешнего «класса», и вы все равно сможете создавать экземпляр, когда это необходимо, без необходимости иметь экземпляр внешнего класса. –

2

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

Как так,

public class Stack 
    { 

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

    } 
9

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

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

это выглядит сложно ... – Bin

+0

Я тестирую его, но это неправильно с тем же сообщением об ошибке ... – Bin

+0

Какая ошибка? –

0

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

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

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

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

Java имеет two types of nested member classes: статические и нестатическая (иначе внутренний). Класс Node является нестатическим вложенным классом. Для того, чтобы создать экземпляр Node вы должны иметь экземпляр Stack:

Stack s = new Stack(); 
Node n = s.new Node(); 
Смежные вопросы