Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Haulmont-презентации Java / Haulmont. java_se_5.1.ppt
Скачиваний:
31
Добавлен:
16.03.2015
Размер:
988.67 Кб
Скачать

Порядок выполнения

конструкторов

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

Соседние файлы в папке Haulmont-презентации Java