проблема создания объекта внутреннего класса в Java - PullRequest
6 голосов
/ 11 марта 2011


Вот код.

public class Test {
        class InnerClass{

               }

   public static void main(String[] args){
            InnerClass ic = new InnerClass();
        }
    }

Там написано сообщение об ошибке

non-static variable this cannot be referenced from a static context
after creation of object ic.

Может кто-нибудь дать мне причину?

Спасибо

Ответы [ 3 ]

23 голосов
/ 11 марта 2011

InnerClass должно быть static само по себе, т.е.

public class Test {

   static class InnerClass{    
   }

   public static void main(String[] args){
      InnerClass ic = new InnerClass();
   }
}

Если InnerClass равно , а не static, его можно создать только в контексте родительского экземпляра Test. Весьма барочный синтаксис для этого:

public class Test {

   class InnerClass{    
   }

   public static void main(String[] args){
      Test test = new Test();
      InnerClass ic = test.new InnerClass();
   }
}
2 голосов
/ 11 марта 2011

Ваш внутренний класс зависит от экземпляра класса Test. main - это статический метод, поэтому вы не можете создать экземпляр InnerClass.

Я думаю, что вы хотите объявить свой внутренний класс как static:

class Test {
    static class InnerClass { }

    public static void main(String[] args){
        InnerClass ic = new InnerClass();
    }
}

Подробнее о вложенных классах: http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

Краткое объяснение

В основном есть два типа вложенных классов: «статический вложенный класс» и «внутренний класс»

Статический вложенный класс используется для логической группировки двух классов и может использоваться для увеличения инкапсуляции. Их можно использовать, как и любые другие классы, и, за исключением видимости, они не имеют определенного доступа к полям внешнего класса. Их можно логически создать в статическом контексте.

Внутренний класс (т.е. не статический ) привязан к конкретному экземпляру внешнего класса. Это означает, что вы должны иметь экземпляр внешнего класса для создания экземпляра внутреннего класса. Взгляните на второй фрагмент кода Скаффмана для примера создания экземпляра. Поскольку внутренние классы связаны с экземпляром внешнего класса, они имеют доступ к каждому полю относительно этого конкретного экземпляра.

Надеюсь, теперь все стало понятнее.

0 голосов
/ 11 марта 2011

Во-первых, «вложенный» класс является статическим, а «внутренний» класс - нет.

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

...