- •Наследование
- •Цели занятия
- •Понятие наследования
- •Понятие наследования
- •Понятие наследования
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Возможность доступа и
- •Сокрытие статических членов
- •Служебное слово super
- •Служебное слово super
- •Служебное слово super
- •Совместимость
- •Совместимость
- •Совместимость
- •Явное преобразование типов
- •Явное преобразование типов
- •Проверка типа
- •Проверка типа
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы abstract
- •Методы и классы abstract
- •Методы и классы abstract
- •Класс Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •hashCode() и equals()
- •Клонирование объектов
- •Клонирование объектов
- •Клонирование объектов
- •Литература
Сокрытие полей. Доступ к
унаследованным членам
21 Результат:
Extend.show: ExtendStr
Extend.show: ExtendStr sup.str: SuperStr ext.str: ExtendStr
•Механизм переопределения методов позволяет расширять существующий код, наделяя его новыми специализированными функциями, которые не были изначально предусмотрены автором исходного базового класса
•Но если речь заходит о полях, трудно представить ситуацию, когда их сокрытие можно было бы
считать безусловно полезным
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
|
|
Сокрытие полей. Доступ к |
|
22 |
|
унаследованным членам |
|
• |
Сокрытие полей формально позволено с той целью, чтобы |
||
|
|||
|
|
разработчики существующих базовых классов могли свободно |
|
|
|
добавлять в них новые поля public и protected, не рискуя |
|
|
|
причинить вред всем возможным «наследникам» |
|
|
• |
Если бы язык запрещал использование одноимённых полей в |
|
|
|
базовом и производном классах, добавление нового поля в |
|
|
|
существующий базовый класс оказывалось бы чревато |
|
|
|
проблемами, поскольку в некотором производном классе, |
|
|
|
возможно, уже объявлено поле с тем же именем |
|
|
• |
Важно понимать, что переопределение методов является |
|
|
|
фундаментальной особенностью объектно-ориентированных |
языков, и способы вызова методов родительских классов являются важным средством инкапсуляции и повторного использования кода, в то время как сокрытие полей возникает лишь как неудобный побочный эффект от возможности назначить произвольное имя для поля в дочернем классе, и весь механизм доступа к скрытым полям предназначен для преодоления последствий этого побочного эффекта
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Возможность доступа и
переопределение
23• Метод может быть переопределён только в том случае, если он доступен
•Метод, помеченный как private, не «виден» за пределами класса
•Если вдруг в производном классе «объявится» метод с теми же сигнатурой и типом возвращаемого значения, что и метод private базового класса, это будут два совершенно разных и не связанных между собой метода – метод производного класса в этой ситуации нельзя квалифицировать как переопределённый
•Коротко говоря, обращение к методу private всегда приводит к вызову метода, объявленного в текущем классе
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сокрытие статических членов
24• Статические члены класса не могут быть переопределены, поскольку всегда скрыты – как поля, так и методы
•Обращение к каждому статическому полю или методу чаще всего осуществляется посредством задания имени класса, в котором они объявлены
•Из факта сокрытия статического поля или метода в результате объявления одноимённого члена
производного класса вытекает одно следствие – если для доступа к статическому члену используется ссылка, то, как и в ситуации с сокрытием полей, при выборе подходящей альтернативы компилятор учитывает объявленный тип ссылки, а не тип объекта, на который она указывает
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Служебное слово super
25• Служебное слово super может быть использовано в теле любого нестатического члена класса
•При доступе к полю или вызове метода выражение super действует как ссылка на текущий объект, представленный как экземпляр базового класса
•Применение super – это единственный вариант, когда выбор метода обусловливается типом ссылки
•Вызов super.method() всегда означает обращение к методу method базового класса – никакие возможные переопределённые реализации метода в производных классах в расчёт не принимаются
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Служебное слово super
26 Пример 3 class That {
protected String nm() { return "That";
}}
class More extends That { protected String nm() {
return "More";
}
protected void printNM() { That sref = (That) this;
System.out.println("this.nm() = " + this.nm()); System.out.println("sref.nm() = " + sref.nm()); System.out.println("super.nm() = " + super.nm());
}}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Служебное слово super
27Результат: this.nm() = More sref.nm() = More super.nm() = That
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Совместимость
28• В любой ситуации, когда значение выражения присваивается некоторой переменной, тип выражения должен быть совместим с типом переменной
•Если говорить о ссылочных типах, это означает, что выражение должно относиться к тому же типу, что и переменная, либо к соответствующему производному типу
•Например, любой метод, для которого предусмотрена передача аргумента типа Attr, способен воспринимать и аргумент типа ColorAttr, если ColorAttr является производным классом базового класса Attr
•Подобное принято называть совместимостью
присваивания
•Но обратное утверждение не верно: не удастся ни явно присвоить значение типа Attr переменной класса ColorAttr, ни передать аргумент типа Attr методу, в котором объявлен параметр класса ColorAttr
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Совместимость
29• Те же правила действуют и в отношении выражений, которые возвращаются из тела метода командой return: тип конкретного возвращаемого значения должен быть совместим с тем, который значится в объявлении метода
•Значение null – это специальный случай: null позволено присваивать переменным всех ссылочных типов, включая и массивы
•О типах, находящихся на более высоких ступеньках иерархии классов, говорят как о более широких, или менее конкретных, по сравнению с теми, которые расположены ниже
•Соответственно, производные типы называют более узкими, или более конкретными, нежели их «прародители»
•Когда в выражении, предусматривающем использование объекта базового класса, применяется объект производного класса, имеет место преобразование с расширением типа
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Совместимость
30• Подобная операция, допустимость которой проверяется на этапе компиляции, приводит к
тому, что объект производного типа интерпретируется программой как объект базового класса
•Программисту в этом случае не нужно предпринимать никаких дополнительных усилий
•Обратное действие, когда ссылка на объект базового класса преобразуется в ссылку на объект производного класса, называют
преобразованием с сужением типа
•В этом случае следует явно применить оператор преобразования типов
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |