Главная » Java » Конструкторы расширенных классов Java

0

Объект расширенного (производного) класса содержит поля, унаследованные от базового класса, и собственные переменные состояния. Чтобы создать объект расширенного класса, надлежит корректно проинициализировать оба набора переменных. Конструктор производного класса способен обращаться к полям базового, но только базовый класс досконально "осведомлен" о том, как их следует инициализировать, чтобы гарантировать безупречное выполнение контракта. Конструкторы расширенного класса обязаны передавать полномочия по инициализации унаследованных полей, явно или косвенно обращаясь к услугам конструкторов базового класса.

Конструктор расширенного класса может напрямую обращаться к "Коллегам" из базового Класса посредством еще одного способа явного вызова конструкторов, предусматривающего применение служебного слова super. Инструкция, использованная в теле первого из конструкторов Класса ColorAttr, обеспечивает передачу аргументов имени и значения атрибута соответствующему конструктору базового Класса. Затем конструктор ColorAttr обращается к методу decodeСolог, чтобы сохранить в переменной myColor Ссылку на верный объект ScreenColor.

МЫ можем также доверить выбор соответствующего конструктора базового класса, Явно обратившись к одному из конструкторов рассматриваемого производного класса с помощью ссылки this вместо super, кaк показано на примере второго конструктора ColorAttr. Нам необходимо обеспечить инициализацию цветовой составляющей атрибута. Если при создании объекта класса ColorAttr цвет не задан, мы

предлагаем значение по умолчанию в виде константы "бесцветный" – таким образом, из тела конструктора с одним параметром вызывается конструктор с двумя параметрами с передачей аргумента по умолчанию.

 Если в первой строке тела конструктора производного класса не вызывается ни другой конструктор того же класса, ни конструктор базового класса, компилятор

обеспечивает автоматическое обращение к "базовому" конструктору без аргументов – такой вызов осуществляется в первую очередь, прежде всех других Исполняемых выражений тела конструктора. Другими словами, первой инструкцией будет

super();

 

Если же в составе базового класса отсутствует конструктор без параметров, в теле конструктора производного класса (в самом его начале) обязана явно присутствовать инструкция вызова какого-либо другого конструктора (надо признать, что слог авторов подчас излишне тяжеловесен. – Прим. перев.).

 

Третий конструктор ColorAttr позволяет программисту создать новый объект типа ColorAttr, передавая в качестве аргумента объект класса ScreenColor. Два ранее рассмотренных конструктора должны выполнять задачу преобразования параметров в объекты ScreenColor, обращаясь к методу decodeColor, что, разумеется, требует дополнительных вычислений. Если объект ScreenColor, готовый для передачи в виде аргумента, уже существует, его разумно использовать, чтобы избежать лишних накладных расходов. Это пример конструктора, который, не обеспечивая дополнительных функций, позволяет повысить уровень эффективности решений.

 

В рассматриваемом примере конструкторы класса ColorAttr обладают такими же сигнатурами, что и их "предшественники" в базовом классе. Подобное совпадение, строго говоря, не обязательно. Иногда довольно многообещающей и плодотворной оказывается ситуация, когда конструкторы расширенного класса без параметров или с несколькими параметрами обеспечивают передачу аргументов в конструкторы базового класса. Достаточно общим можно назвать и вариант расширенного класса, в котором нет конструкторов с теми же сигнатурами, что и в базовом.

 

Конструкторы не относятся к категории методов и не наследуются. Если в базовом классе предусмотрено несколько конструкторов и производный класс полезно снабдить конструкторами того же вида, каждый такой конструктор следует определить явно – даже в том случае, когда единственной его функцией является обращение к "собрату" в базовом классе.

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

По теме:

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