Существует абстрактный класс:
public abstract class Drink
{
public void taste(){
System.out.println("Вкусно");
}
}
По идее создавать его экземпляры запрещено, но IDE помог обойти этот запрет следующим способом:
public static Drink getDeliciousDrink() {
return new Drink()
{
@Override
public void taste()
{
super.taste();
}
};
}
Что происходит при переопределении функции taste и почему я могу создать экземпляр этого класса?
Вы не создаете экземпляр класса Drink. Конструкция
new Drink()
{
@Override
public void taste()
{
super.taste();
}
}
Определяет анонимный подкласс класса Drink с переопределенным методом tasteи создает экземпляр этого подкласса. Т.к. базовый класс только объявлен абстрактным, но не содержит абстрактных методов, то его наследников вполне можно создавать. Более того, т.к. в этом подклассе переопределяется только один метод, который, по сути, просто вызывает метод родителя, то можно написать и так
public static Drink getDeliciousDrink() {
return new Drink(){};
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей