- •Наследование
- •Цели занятия
- •Понятие наследования
- •Понятие наследования
- •Понятие наследования
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Возможность доступа и
- •Сокрытие статических членов
- •Служебное слово super
- •Служебное слово super
- •Служебное слово super
- •Совместимость
- •Совместимость
- •Совместимость
- •Явное преобразование типов
- •Явное преобразование типов
- •Проверка типа
- •Проверка типа
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы abstract
- •Методы и классы abstract
- •Методы и классы abstract
- •Класс Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •hashCode() и equals()
- •Клонирование объектов
- •Клонирование объектов
- •Клонирование объектов
- •Литература
Порядок выполнения
конструкторов
11• На второй стадии процесса обрабатываются выражения и блоки инициализации полей в порядке их объявления
•В этот момент ссылки на другие члены объекта допустимы, если таковые уже полностью определены
•Наконец, выполняются выражения тела конструктора
•Если текущий конструктор был вызван явно, по его завершении управление передаётся в тело конструктора-инициатора, где выполняются оставшиеся инструкции
•Процесс повторяется до тех пор, пока управление не будет передано обратно в тело конструктора «исходного» производного класса, название которого было указано в выражении new
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Порядок выполнения
конструкторов
12• Если во время процесса конструирования выбрасывается исключение, виртуальная машина завершает выполнение выражения new, генерируя то же исключение, и не возвращает ожидаемую ссылку на объект
•Поскольку выражение явного вызова конструктора текущего или базового класса должно быть первым в теле конструктора-инициатора, отловить исключение, выброшенное вызванным конструктором, невозможно, иначе существовала бы и вероятность создания объектов с неверным исходным состоянием
•Методы, предназначенные для вызова на стадии конструирования объекта, должны быть спроектированы особенно тщательно, с учётом вышеназванных соображений
•В конструкторах следует избегать вызовов методов, допускающих переопределение, т.е. всех тех, которые не помечены как private, static или final
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Порядок выполнения
конструкторов
13 Пример 1 class X {
protected int xMask = 0x00ff; protected int fullMask;
public X() {
fullMask = xMask;
}
public int mask (int orig) { return (orig & fullMask);
}
}
class Y extends X {
protected int yMask = 0xff00; public Y() {
fullMask |= yMask;
}}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
|
|
Порядок выполнения |
|||
14 |
|
конструкторов |
|
||
Таблица 1 |
|
|
|
||
|
|
|
|
||
|
Этап |
Что происходит |
xMask |
yMask |
fullMask |
|
0 |
Полям присвоены значения |
по 0 |
0 |
0 |
|
|
умолчанию |
|
|
|
|
1 |
Вызван конструктор Y |
0 |
0 |
0 |
|
2 |
Вызван конструктор X |
0 |
0 |
0 |
|
3 |
Вызван конструктор Object |
0 |
0 |
0 |
|
4 |
Проинициализированы поля X |
0x00ff |
0 |
0 |
|
5 |
Выполнен конструктор X |
0x00ff |
0 |
0x00ff |
|
6 |
Проинициализированы поля Y |
0x00ff |
0xff00 |
0x00ff |
|
7 |
Выполнен конструктор Y |
0x00ff |
0xff00 |
0xffff |
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Наследование и переопределение
членов
15• Перегружая унаследованный метод базового класса, мы просто добавляем в объявление
производного класса новый метод с тем же именем, но другой сигнатурой
•Переопределяя метод, мы изменяем его реализацию, так что при обращении к методу объекта производного класса будет вызвана именно новая версия метода, а не «старая», принадлежащая базовому классу
•При переопределении метода в производном классе его наименование и сигнатура должны оставаться теми же, что объявлены в базовом классе
•Переопределённые методы обладают собственными признаками доступа
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Наследование и переопределение
членов
16• В производном классе разрешается изменять уровень доступа к унаследованному методу базового класса, но только в сторону повышения
•Уменьшение возможности доступа к методу относительно того уровня, который определён в базовом классе, нарушает контракт базового класса,
и экземпляр производного класса теперь не может быть использован в контексте, предусматривающем применение базового
•При переопределении метода позволяется изменять и другие модификаторы
•Признаками synchronized, native и strictfp разрешено манипулировать совершенно свободно, поскольку они относятся исключительно к особенностям внутренней реализации метода
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Наследование и переопределение
членов
17• Переопределённый метод может быть помечен как final, но тот, который подвергается переопределению – нет
•Метод экземпляра производного класса не может обладать той же сигнатурой, что и статический унаследованный метод, и наоборот
•Переопределённый метод в производном классе, однако, может быть снабжён модификатором abstract даже в том случае, если в базовом этого предусмотрено не было
•Допускаются и различия методов базового и производного классов, касающиеся предложения throws, если только каждый из типов исключений, перечисленных в объявлении переопределённого метода, совпадает с одним из тех, которые заданы в объявлении «базового» метода, либо является производным от любого из них
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Наследование и переопределение
членов
18• Другими словами, каждый их типов исключений в объявлении throws переопределённого метода должен быть полиморфным образом совместим хотя бы с одним из типов, указанных в объявлении метода, который принадлежит базовому классу
•Это означает, что предложение throws переопределённого метода может содержать меньше типов, чем перечислено в объявлении метода базового класса, либо больше специфических производных типов, либо то и другое одновременно
•В переопределённом методе допускается и отсутствие предложения throws – в этом случае предполагается, что метод не должен генерировать
объявляемые исключения
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сокрытие полей. Доступ к
унаследованным членам
19• Поля класса не допускают переопределения – их можно только скрыть
•Когда в производном классе объявляется поле с тем же именем, что и в базовом, прежнее продолжает
существовать, но перестаёт быть доступным, если обращаться к нему непосредственно по имени
•Чтобы сослаться на одноимённое поле, принадлежащее базовому классу, следует воспользоваться служебным
словом super либо сослаться на текущий объект с приведением типа к базовому классу
•Если вызывается метод посредством ссылки на объект, выбор одной из возможных альтернатив
обусловливается фактическим классом объекта
•Если же осуществляется обращение к полю, в рассмотрение принимается объявленный тип ссылки
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сокрытие полей. Доступ к
унаследованным членам
20 Пример 2
class SuperShow {
public String str = “SuperStr”; public void show() {
System.out.println(“Super.show: “+str);
}}
class ExtendShow extends SuperShow{ public String str = “ExtendStr”; public void show() {
System.out.println(“Extend.show: “+str);
}
public static void main (String[] args) { ExtendShow ext = new ExtendShow(); SuperShow sup = ext;
sup.show();
ext.show(); System.out.println(“sup.str: “+sup.str); System.out.println(“ext.str: “+ ext.str);
}
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |