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