Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

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

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

Комментариев нет:

Отправить комментарий