Почему Java создает анонимный класс внутри как статический? - PullRequest
0 голосов
/ 10 мая 2018
abstract class Person {  
abstract void eat();  
}  

class TestAnonymousInner {  
  public static void main(String args[]){  
  Person p=new Person() {  
    void eat(){System.out.println("nice fruits");}  
    };  
  p.eat();  
  }  
}

Внутренний класс, сгенерированный компилятором

static class TestAnonymousInner$1 extends Person
{
    TestAnonymousInner$1(){}
    void eat()
    {
        System.out.println("nice fruits");
    }
}

По какой причине компилятор создает анонимный класс как статический?Что будет, если он нестатичный?

1 Ответ

0 голосов
/ 10 мая 2018

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

Это легко продемонстрировать, преобразовав ваш пример в

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 в качестве значения этого параметра. Это не относится к статическим вложенным классам.

...