Должен ли внутренний класс быть статическим в Java? - PullRequest
4 голосов
/ 20 мая 2010

Я создал нестатический внутренний класс, подобный этому:

class Sample {
    public void sam() {
        System.out.println("hi");
    }    
}

Я назвал это в main методе, подобном этому:

Sample obj = new Sample();
obj.sam();

Это дало ошибку компиляции: non-static cannot be referenced from a static context Когда я объявил нестатический внутренний класс статическим, он работает. Почему это так?

Ответы [ 4 ]

10 голосов
/ 20 мая 2010

Для нестатического внутреннего класса компилятор автоматически добавляет скрытую ссылку на экземпляр объекта "owner". Когда вы пытаетесь создать его из статического метода (скажем, метода main), не существует собственного экземпляра. Это все равно что пытаться вызвать метод экземпляра из статического метода - компилятор не допустит этого, потому что на самом деле у вас нет экземпляра для вызова.

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

4 голосов
/ 20 мая 2010

Нестатический внутренний класс имеет внешний класс в качестве переменной экземпляра, что означает, что его можно создать только из такого экземпляра внешнего класса:

public class Outer{
    public class Inner{
    }

    public void doValidStuff(){
         Inner inner = new Inner();
         // no problem, I created it from the context of *this*
    }

    public static void doInvalidStuff(){
         Inner inner = new Inner();
         // this will fail, as there is no *this* in a static context
    }

}
2 голосов
/ 20 мая 2010

Внутреннему классу нужен экземпляр внешнего класса, потому что есть неявный конструктор, сгенерированный компилятором. Однако вы можете обойти это следующим образом:

public class A {

  public static void main(String[] args) {
    new A(). new B().a();
  }

  class B {
    public void a() {
      System.err.println("AAA");
    }
  }

}
1 голос
/ 20 мая 2010

Может быть, это поможет: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html Нестатический внутренний класс не может быть вызван в статическом контексте (в вашем примере нет экземпляра внешнего класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...