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

Сокрытие полей. Доступ к

унаследованным членам

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

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