Код, как показано, создает анонимный класс в статическом контексте. Внутренний класс (или нестатический вложенный класс) должен иметь ссылку на включающий объект (*). В этом случае вмещающий объект отсутствует, поскольку он создается в статическом методе, поэтому использование статического вложенного класса является единственной допустимой опцией.
Это легко продемонстрировать, преобразовав ваш пример в
public class TestInner {
public static void main(String args[]){
Person p = new Testperson();
p.eat();
}
public class Testperson extends Person {
void eat() {
System.out.println("nice fruits");
}
}
}
Компиляция этого приведет к ошибке
нестатическая переменная, на которую нельзя ссылаться из статического контекста
Хотя он будет прекрасно компилироваться, если вы измените его на:
public class TestInner {
public static void main(String args[]){
Person p = new Testperson();
p.eat();
}
public static class Testperson extends Person {
void eat() {
System.out.println("nice fruits");
}
}
}
*: компилятор изменит конструктор (ы) внутреннего класса, чтобы он принял включающий объект в качестве параметра, и вызовы конструктора будут переписаны так, чтобы передать this
в качестве значения этого параметра. Это не относится к статическим вложенным классам.