Java. Переопределение методов (override)

Каждый раз, когда у вас есть класс, который наследует метод из суперкласса, у вас есть возможность переопределять метод ( если он конечно не final ). Ключевое преимущество переопределения - это возможность определять поведение лишь в определенном типе подкласса. Следующий пример демонстрирует подкласс Horse класса Animal, который переопределяет Animal версию метода eat():
В случае с абстрактными методами у вас нет выхода. Вы должны реализовывать метод в подклассе, если только подкласс тоже не абстрактный. Абстрактные методы должны быть реализованы в конкретном, реальном подклассе, но это больше похоже на то, как сказать, что конкретный подкласс переопределяет абстрактные метода суперкласса. Следует думать про абстрактные методы как про методы, которые будут принудительно переопределены.
Создатель класcа Animal возможно решил, что для целей полиморфизма, все подтипы класса Animal должны иметь метод eat() определенным уникально, специфически. Согласно определениям полиморфизма, если есть ссылка, которая ссылается не на объект класса Animal, а на объект подкласс, вызывающий код должен иметь возможность вызвать eat() на ссылке типа Animal, но реальный объект времени выполнения, скажем Horse, запустит свой собственный метод eat(). Помечая метод eat() в классе Animal как абстрактный, тем самым как бы говорим: "Нет ни малейшего смысла Вашему классу, который наследуется, использовать обобщенный метод eat().
Не абстрактный пример использования полиморфизма выглядит следующим образом:
В приведенном коде, тестовый класс использует ссылку на Animal для вызова метода объекта Horse. Помните, что компилятор разрешит выполнение методов класса Animal только через ссылку типа Animal. Следующий код не будет истинным:
Компилятор смотрит только на тип ссылки, а не на тип объекта. Полиморфизм позволяет Вам использовать абстрактный суперкласс (включая интерфейс) в виде ссылочного типа для ссылки на один из подтипов (включая реализации интерфейсов).
Переопределяемый метод не может иметь более жесткий модификатор доступа, чем модификатор переопределяемого метода (например, нельзя переопределить метод, помеченный как public и сделать его protected).
Подумайте об этом: если класс Animal объявляет public eat() метод и кто-то имеет ссылку типа Animal (другими словами ссылка объявленная как Animal), тогда этот кто-то предположит, что вызов eat() по ссылке Animal безопасный, несмотря на то, куда ссылается в действительности эта ссылка.
Если бы подклассам был разрешено изменять модификаторы доступа на переопределяемых методах, тогда виртуальная машина просто бы падала при выполнении.
Идем дальше. Модифицируем полиморфический пример, описанный выше, следующим образом:
Если этот код и скомпилируется, следующий участок завалится во время выполнения:
Материалы, которые могут вас заинтересовать
- Java. Вложенные классы в методах
- Java. Создание объекта вложенного класса извне внешнего класса
- Java. Создание объекта вложенного класса изнутри внешнего класса
- Java. Создание объекта вложенного класса
- Java. Создание "регулярного" вложенного класса
- Java. Вложенные классы (Inner Classes)
- Java. Создание обобщенных методов
- Java. Обобщенные типы (Generic Declarations)
- Java. Использование карт (Using Maps)







А где описание что такое override и пример с ним???
Отправить комментарий