Разбираем полиморфизм и абстракции в Java на практике: как единый интерфейс вызывает разное поведение, частые ошибки (downcasting без проверки, вызов методов, отсутствующих в базовом типе, «пустые» абстракции, глубокие иерархии), а также лучшие практики использования абстрактных классов, интерфейсов и аннотации @Override в учебном примере «Библиотека».