Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 29

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 29 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 292019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 29)

Такая возможность носит название полиморфизма — это означает, что объект данного класса можетвыступать в нескольких видах, либо самостоятельно, либо в качестве объекта расширяемого им суперкласса. Класс по отношению красширяемому им классу называется подклассом, или расширенным классом; расширяемый класс, в свою очередь, называется суперклассом.Набор членов класса (методов и полей), доступных за его пределами, в совокупности с их ожидаемым поведением часто именуется контрактомкласса.

Контракт — это то, что должен делать класс в соответствии с обещаниями его разработчика. Каждый раз, когда вы расширяете класс идобавляете в него новые функции, вы тем самым создаете новый класс с расширенным контрактом. Тем не менее к модификации частиконтракта, унаследованной от расширяемого класса, следует подходить с осторожностью; можно улучшить способ реализации контракта, однакоизменения не должны нарушать контракт суперкласса.3.1. Расширенный классКаждый класс из тех, что встречались нам в этой книге, является расширенным, независимо от того, объявлен ли он с ключевым словом extendsили нет.

Даже такие классы, как Body, которые вроде бы не расширяют других классов, на самом деле неявно происходят от принадлежащегоJava класса Object. Другими словами, Object находится в корне всей иерархии классов. В нем объявляются методы, которые реализованы во всехобъектах. Переменные типа Object могут ссылаться на любые объекты, будь это экземпляры класса или массивы.Например, при разработке класса для списка, элементы которого могут быть объектами произвольного типа, можно предусмотреть в нем полетипа Object. В такой список не могут входить значения примитивных типов (int, boolean и т.

д.), однако при необходимости можно создатьобъекты этих типов с помощью классов-оболочек (Integer, Boolean и т. д.), описанных в главе 13.Для демонстрации работы с подклассами начнем с базового класса для хранения атрибутов, представленных в виде пар имя/значение. Именаатрибутов являются строками (например, “цвет” или “расположение”). Атрибуты могут иметь произвольный тип, поэтому их значения хранятся впеременных типа Object:class Attr {private String name;private Object value = null;public Attr(String nameOf) {name = nameOf;}public Attr(String nameOf, Object valueOf) {name = nameOf;value = valueOf;}public String nameOf() {return name;}public Object valueOf() {return value;}public Object valueOf(Object newValue) {Object oldVal = value;value = newValue;return oldVal;}}Каждому атрибуту обязательно должно быть присвоено имя, поэтому при вызове конструкторов Attr им передается параметр-строка. Имядолжно быть доступно только для чтения, поскольку оно может применяться, скажем, в качестве ключа хеш-таблицы или сортированного списка.Если при этом имя атрибута будет изменено за пределами класса, то объект-атрибут “потеряется”, так как в таблице или списке он будетхраниться под старым именем.

Значение атрибута можно менять в любой момент.Следующий класс расширяет понятие атрибута для хранения цветовых атрибутов, которые могут быть строками, служащими для именования илиописания цветов. Описания цветов могут представлять собой как названия (“красный” или “бежевый”), по которым необходимо найти нужноезначение в таблице, так и числовые значения, которые могут преобразовываться в стандартное, более эффективное представление ScreenColor(которое, как предполагается, определено в другом месте программы).

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

Данный методреализован так, что преобразование выполняется всего один раз:class ColorAttr extends Attr {private ScreenColor myColor; // преобразованный цветpublic ColorAttr(String name, Object value) {super(name, value);decodeColor();}public ColorAttr(String name) {this(name, “transparent”);}public ColorAttr(String name, ScreenColor value) {super(name, value.toString());myColor = value;}public Object valueOf(Object newValue) {// сначала выполнить метод valueOf() суперклассаObject retval = super.valueOf(newValue);decodeColor();return retval;}/** Присвоить атрибуту ScreenColor значение,а не описание */public ScreenColor valueOf(ScreenColor newValue) {// сначала выполнить метод valueOf() суперклассаsuper.valueOf(newValue.toString());myColor = newValue;return newValue;}/** Вернуть преобразованный объект ScreenColor */public ScreenColor color() {return myColor;}/** Задать ScreenColor по описанию в valueOf */protected void decodeColor() {if (valueOf() == null)myColor = null;elsemyColor = new ScreenColor(valueOf());}}Сначала мы создаем новый класс ColorAttr, расширяющий класс Attr.

Основные функции класса ColorAttr те же, что и у класса Attr, но к нимдобавляется несколько новых. Класс Attr является суперклассом по отношению к ColorAttr, а ColorAttr — подклассом по отношению к Attr.Иерархия классов для нашего примера выглядит следующим образом (суперкласс на диаграмме расположен выше своего подкласса):Расширенный класс ColorAttr выполняет три основные функции:●●●Он обеспечивает наличие трех конструкторов: два из них копируют поведение суперкласса, а третий позволяет сразу передать объектScreen Color.Он перегружает и переопределяет метод valueOf базового класса, чтобы при изменении значения атрибута создался объект ScreenColor.Он включает новый метод color для возврата цветового описания, преобразованного в объект ScreenColor.Упражнение 3.1На основе класса Vehicle из главы 2 создайте расширенный класс с именем PassengerVehicle и наделите его возможностью определения числасвободных и занятых мест в машине.

Включите в PassengerVehicle новый метод main, который создает несколько объектов и выводит их.3.2. Истинное значение protectedРанее мы кратко упомянули о том, что объявление члена класса защищенным (то есть с ключевым словом protected) означает возможностьобращения к нему из классов, расширяющих данный, — однако этому замечанию не хватает формальной четкости. Выражаясь более точно, кзащищенному члену класса можно обращаться через ссылку на объект, относящийся по меньшей мере к тому же типу, что и класс. Примерпоможет нам разобраться с этим утверждением.

Предположим, имеется следующая иерархия классов:Поле calories в классе Dessert является защищенным. Каждый класс, расширяющий Dessert, наследует от него поле calories. Тем не менее кодкласса Cake может осуществлять доступ к полю calories только через ссылку на тип, являющийся Cake или его подклассом (например, типChocolate Cake). Код класса Cake не может обращаться к полю calories через ссылку типа Scone. Такое ограничение позволяет быть уверенным втом, что доступ к protected-полям осуществляется лишь в пределах иерархии класса. Если в коде класса Cake имеется ссылка на более общийобъект Dessert, вы не можете применять ее для доступа к полю calories, однако вы можете преобразовать ее в ссылку на Cake и воспользоватьсярезультатом — при условии, конечно, что объект, на который она указывает, действительно относится к классу Cake (по меньшей мере).Сказанное справедливо и по отношению к защищенным методам — их можно вызывать только через ссылку на тип, относящийся по меньшеймере к тому же классу.К защищенным статическим полям и методам можно обращаться из любого расширенного класса.

Если бы поле calories было статическим, толюбой метод (как статический, так и нет) в Cake, ChocolateCake и Scone мог бы обращаться к нему через ссылку на любой из типов Dessert.Члены класса, объявленные с ключевым словом protected, также оказываются доступными для любого кода, входящего в тот же пакет. Еслиизображенные выше классы семейства Dessert входят в один пакет, то они могут обращаться к полям calories друг друга.3.3.

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

Если вызов конструктора суперкласса не является самым первым выполняемым операторомв конструкторе нового класса, то перед выполнением последнего автоматически вызывается безаргументный конструктор суперкласса. Если жесуперкласс не имеет безаргументного конструктора, вы должны явно вызвать конструктор суперкласса с параметрами. Вызов super()непременно должен быть первым оператором нового конструктора.Вызов конструктора суперкласса демонстрируется на примере первого конструктора ColorAttr. Сначала полученные имя и значение передаютсяконструктору суперкласса, получающему два аргумента. Затем конструктор вызывает свой собственный метод decodeColor для того, чтобы полеmyColor ссылалось на нужный цветовой объект.Вы можете временно отложить вызов конструктора суперкласса и использовать вместо него один из конструкторов того же класса — в этомслучае вместо super() используется this().

Второй конструктор ColorAttr поступает именно так. Это было сделано для того, чтобы каждомуцветовому атрибуту заведомо был присвоен какой-то цвет; если он не указан, то по умолчанию присваивается цвет “transparent” (то есть“прозрачный”).Третий конструктор ColorAttr позволяет программисту при создании объекта ColorAttr сразу же указать объект ScreenColor.

Первые дваконструктора преобразуют свои параметры в объекты ScreenColor при помощи метода decodeColor, вызов которого сопряжен с накладнымирасходами. Если программист уже располагает объектом ScreenColor, который будет использован в качестве цветового значения, было быжелательно избежать затрат на излишнее преобразование. В этом примере конструктор предназначен для повышения эффективности, а не длядобавления новых возможностей.Сигнатуры конструкторов класса ColorAttr в точности совпадают с сигнатурами конструкторов суперкласса, но это ни в коем случае не являетсяобязательным. Иногда бывает удобно сделать так, чтобы часть или все конструкторы расширенного класса передавали нужные параметры вконструкторы суперкласса и обходились без своих параметров (или число таких параметров было бы минимальным). Нередки случаи, когдасигнатуры конструкторов расширенного класса не имеют ничего общего с сигнатурами конструкторов суперкласса.Язык Java может создать безаргументный конструктор по умолчанию.

Работа такого конструктора для расширяемого класса начинается с вызовабезаргументного конструктора суперкласса. Однако, если в суперклассе отсутствует безаргументный конструктор, расширенный класс долженсодержать хотя бы один конструктор. Конструктор расширенного класса по умолчанию эквивалентен следующему:public class ExtendedClass extends SimpleClass {public ExtendedClass() {super();}}Помните, что доступность конструктора определяется доступностью класса. Так как ExtendedClass объявлен как public, конструктор поумолчанию также будет public.3.3.1. Порядок вызова конструкторовПри создании объекта всем его полям присваиваются исходные значения по умолчанию в зависимости от их типа (ноль для всех числовых типов,‘\u0000’ для char, false для boolean и null для ссылок на объекты). Затем происходит вызов конструктора.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее