Главная » Java » Переопределение Java

0

В объявлении производного класса ColorAttr мы единовременно переопределили и перегрузили метод setValue.

О возможности перегрузки методов мы уже говорили – имеется в виду объявление нескольких методов класса с одним и тем же именем, но с различными сигнатурами

Термин переопределение метода означает замещение версии метода, объявленной в базовом классе, новой, с точно такой же сигнатурой

Перегружая (overloading) унаследованный метод базового класса, мы просто добавляем в объявление производного класса новый метод с тем же именем, но другой сигнатурой. Класс ColorAttr получил в наследство от базового класса Attr один метод setValue, а мы добавили другой и приобрели две формы одного и того же метода setvalue. Точно так же мы могли бы создать несколько перегруженных методов и в самом базовом классе Attr.

Переопределяя (overriding) метод, мы изменяем его реализацию, так что при обращении к методу объекта производного класса будет вызвана именно новая версия метода, а не "старая", принадлежащая базовому классу. В классе ColorAttr мы переопределили метод setValue(Object) класса Attr, предложив взамен новый метод setValue(Object) с той же сигнатурой, в котором с Помощью ссылки super вызывается версия метода из класса Attr, а затем осуществляется обращение к методу decodeСolor. Таким образом, конструкция с Super может быть использована, в частности, и для вызова методов базового Класса, переопределенных в текущем. Более подробные сведения о служебном слове super приведены Ниже, в разделе 3.3.6 этой главы на странице 99.

При переопределении метода в производном классе его наименование и сигнатура должны оставаться теми же, что объявлены в базовом Классе. Если два Метода различаются только, скажем, типом возвращаемого значения, это считается Ошибкой и компилятор на нее укажет.

Переопределенные методы обладают собственными Признаками доступа. В Производном классе разрешается изменять уровень доступа к унаследованному Методу базового Класса, но только в сторону повышения. Метод, объявленный как protected в базовом классе, в производном может быть переопределен вновь с тем же модификатором protected (и это обычная практика) либо помечен как public, но объявлять его посредством private или полностью лишать основного модификатора доступа (предусматривая признак доступа уровня пакета) нельзя. Уменьшение возможности доступа к методу относительно того уровня, Который определен в базовом Классе, нарушает контракт базового класса, и экземпляр Производного класса теперь не может быть использован в контексте, Предусматривающем применение базового.

При переопределении метода позволяется изменять и другие модификаторы.

Признаками synchronized, native и strictfp разрешено манипулировать совершенно свободно, поскольку они относятся исключительно к особенностям внутренней реализации метода. Переопределенный метод может быть помечен как final, но ТОТ, который подвергается переопределению (это вполне очевидно), – нет. Проблемы, сопутствующие применению модификатора final, обсуждаются ниже, в разделе 3.6 этой главы на странице 105. Метод экземпляра производного класса не может обладать той же сигнатурой, что и статический унаследованный метод, и наоборот. Переопределенный метод в производном классе, однако, может быть снабжен модификатором abstract даже в том случае, если в базовом этого предусмотрено не было (обратитесь к разделу 3.7 этой главы на странице 107).

В производном классе допускается иная трактовка возможности и необходимости использования модификатора final по отношению к параметрам метода: модификатор final не входит в состав сигнатуры и обусловливает только особенности внутренней реализации метода. Допускаются и различия методов базового и производного классов, касающиеся предложения throws, если только каждый из типов исключений, перечисленных в объявлении переопределенного метода, совпадает с одним из тех, которые заданы в объявлении "базового" метода, либо является производным от любого из них. Другими словами, каждый из типов исключений в объявлении throws переопределенного метода должен быть полиморфным образом совместим хотя бы с одним из типов, указанных в объявлении метода, который принадлежит базовому классу. Это означает, что предложение throws переопределенного метода может содержать меньше типов, чем перечислено в объявлении метода базового класса, либо больше специфических производных типов, либо то и другое одновременно. В переопределенном методе допустимо и отсутствие предложения throws – в этом случае предполагается, что метод не должен генерировать объявленные исключения.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии