Создание экземпляра интерфейса

1,00
р.
Недавно наткнулся на странный вид создания экземпляра интерфейса. Я знаю, что создавать экземпляры абстрактных классов и интерфейсов нельзя, но данная запись выглядит как-то странно.
Вопрос заключается в следующем: как можно охарактеризовать данную запись?
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()