Недавно наткнулся на странный вид создания экземпляра интерфейса. Я знаю, что создавать экземпляры абстрактных классов и интерфейсов нельзя, но данная запись выглядит как-то странно. Вопрос заключается в следующем: как можно охарактеризовать данную запись? public class TestApp { public static void main(String[] args) { Animal animal = new Animal() { //? @Override public void say() { System.out.println("i am animal") } } } public interface Animal { void say() } }
Ответ Это - конструкция создания экземпляра анонимного класса. Она создаёт класс, унаследованный от класса/интерфейса Animal. Экземпляры абстрактных классов и интерфейсов создавать, действительно, нельзя, но в данном случае анонимный класс (пере)определяет метод say и класс перестаёт быть абстрактным. Фактически, данный код Animal animal = new Animal() { @Override public void say() { System.out.println("i am animal") } } эквивалентен следующему: class AnonAnimal implements Animal { @Override public void say() { System.out.println("i am animal") } } Animal animal = new AnonAnimal()