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

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

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

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

Другими словами, данная версия метода является окончательной.Подобным образом могут объявляться целые классы:final class NoExtending {// ...}Класс, помеченный с атрибутом final, не может быть субклассирован, а все его методы также неявно являются final.Имеется два основных довода в пользу объявления методов с атрибутом final. Первый из них — безопасность; каждый, кто пользуется классом,может быть уверен, что его поведение останется неизменным, вне зависимости от объектов, с которыми ему приходится работать.Окончательные классы и методы повышают безопасность.

Если класс является окончательным, то вы не сможете объявить расширяющий егокласс и, следовательно, не сможете нарушить его контракт. Если же окончательным является метод, вы можете положиться на его реализацию(разумеется, лишь в том случае, если в нем не вызываются неокончательные методы). Например, final может использоваться для методапроверки введенного пароля validatePassword, чтобы этот метод всегда выполнял свои функции и не был переопределен с тем, чтобы при всехобстоятельствах возвращать true.

Кроме того, можно пометить с атрибутом final целый класс, содержащий этот метод, чтобы запретить егорасширение и избежать возможных проблем, связанных с реализацией validatePassword.Во многих случаях уровень безопасности класса, объявленного final, может быть достигнут за счет того, что класс остается расширяемым, акаждый из его методов объявляется final. В этом случае можно быть уверенным в работе данных методов и при этом оставить возможностьрасширения посредством добавления новых функций без переопределения существующих методов.

Разумеется, поля, на которые опираютсяметоды final, должны быть объявлены private, иначе расширенный класс сможет все испортить за счет модификации этих полей.Класс или метод, помеченный final, серьезно ограничивает использование данного класса. Если метод объявляется final, то вы должны бытьдействительно уверены в том, что его поведение ни при каких обстоятельствах не должно измениться.

Вы ограничиваете гибкость класса,усложняя жизнь другим разработчикам, которые захотят воспользоваться вашим классом для повышения функциональности своих программ.Если класс помечен final, то никто не сможет расширить его, следовательно, его полезность ограничивается. Объявляя что-либо с ключевымсловом final, убедитесь в том, что вытекающие из этого ограничения действительно необходимы.Однако использование final упрощает оптимизацию программы.

При вызове метода, не являющегося final, runtime-система Java определяетфактический тип объекта, связывает вызов с нужной реализацией метода для данного типа и затем вызывает данную реализацию. Но если бы,скажем, метод nameOf в классе Attr был объявлен как final и у вас имелась ссылка на объект типа Attr или любого производного от него типа, топри вызове метода можно обойтись и без всех этих действий. В простейшем случае (таком, как nameOf) вызов метода в программе можнозаменить телом метода.

Такой механизм известен под названием “встроенных методов” (inlining). Встроенный метод приводит к тому, чтоследующие два оператора становятся эквивалентными:System.out.println(“id = ” + rose.name);System.out.println(“id = ” + rose.nameOf());Хотя эти два оператора приводят к одному результату, применение метода nameOf позволяет сделать поле name доступным только для чтения ипредоставляет в ваше распоряжение все преимущества абстрагирования, позволяя в любой момент изменить реализацию метода.По отношению к рассматриваемой оптимизации методы private и static эквивалентны методам final, поскольку они также не могут бытьпереопределены.Некоторые проверки для классов final осуществляются быстрее.

В сущности, многие из них производятся на стадии компиляции; кроме того,ошибки выявляются быстрее. Если компилятор Java имеет дело со ссылкой на класс вида final, он точно знает тип объекта, на который онауказывает. Для таких классов известна вся иерархия, так что компилятор может проверить, все ли с ними в порядке. Для ссылок на объекты, неявляющиеся final, многие проверки осуществляются лишь во время выполнения программы.Упражнение 3.4Какие из методов классов Vehicle и PassengerVehicle имеет смысл сделать final (если таковые имеются)?3.6. Класс ObjectВсе классы являются явными или неявными расширениями класса Object и, таким образом, наследуют его методы.

Последние делятся на двекатегории: общие служебные и методы, поддерживающие потоки. Работа с потоками рассматривается в главе 9. В этом разделе описываютсяслужебные методы Object и их назначение. К категории служебных относятся следующие методы:public boolean equals(Object obj)Сравнивает объект-получатель с объектом, на который указывает ссылка obj; возвращает true, если объекты равны между собой, и false впротивном случае. Если вам нужно выяснить, указывают ли две ссылки на один и тот же объект, можете сравнить их с помощью операторов == и !=, а метод equals предназначен для сравнения значений.

Реализация метода equals, принятая в Object по умолчанию, предполагает, что объектравен лишь самому себе.public int hashCode()Возвращает хеш-код для данного объекта. Каждому объекту может быть присвоен некоторый хеш-код, используемый при работе с хештаблицами. По умолчанию возвращается значение, которое является уникальным для каждого объекта.

Оно используется при сохраненииобъектов в таблицах Hashtable, которые описаны в разделе “Класс Hashtable”.protected Object clone() throws CloneNotSupportedExceptionВозвращает дубликат объекта. Дубликатом называется новый объект, являющийся копией объекта, для которого вызывался метод clone. Процессдублирования объектов подробнее рассматривается ниже в этой главе, в разделе 3.8.public final Class getClass()Возвращает объект типа Class, который соответствует классу данного объекта. Во время выполнения программы на Java можно получитьинформацию о классе в виде объекта Class, возвращаемого методом getClass.protected void finalize() throws ThrowableЗавершающие операции с объектом, осуществляемые во время сборки мусора.

Этот метод был подробно описан в разделе “Метод finalize”.Методы hashCode и equals должны переопределяться, если вы хотите ввести новую концепцию равенства объектов, отличающуюся от принятойв классе Object. По умолчанию считается, что два различных объекта не равны между собой, а их хеш-коды не должны совпадать.Если ваш класс вводит концепцию равенства, при которой два различных объекта могут считаться равными, метод hashCode должен возвращатьдля них одинаковые значения хеш-кода.

Это происходит оттого, что механизм Hashtable полагается в своей работе на возврат методом equalsзначения true при нахождении в хеш-таблице элемента с тем же значением. Например, класс String переопределяет метод equals так, чтобы онвозвращал значение true при совпадении содержимого двух строк. Кроме того, в этом классе переопределяется и метод hashCode — его новаяверсия возвращает хеш-код, вычисляемый на основании содержимого String, и две одинаковые строки имеют совпадающие значения хеш-кодов.Упражнение 3.5Переопределите методы equals и hashCode в классе Vehicle.3.7. Абстрактные классы и методыАбстрактные классы представляют собой исключительно полезную концепцию объектно-ориентированного программирования.

С их помощьюможно объявлять классы, реализованные лишь частично, поручив полную реализацию расширенным классам.Абстракция оказывается полезной, когда некоторое поведение характерно для большинства или всех объектов данного класса, но некоторыеаспекты имеют смысл лишь для ограниченного круга объектов, не составляющих суперкласса. В Java такие классы объявляются с ключевымсловом abstract, и каждый метод, не реализованный в классе, также объявляется abstract. (Если все, что вам требуется, — это определить наборметодов, которые будут где-то поддерживаться, но не предоставлять для них реализации, то вместо абстрактных классов, видимо, лучшевоспользоваться интерфейсами, описанными в главе 4.)Допустим, вы хотите создать инфраструктуру для написания кода, который будет во время выполнения программы измерять определенныепоказатели.

Реализация такого класса может учитывать, как происходит измерение, но вы не знаете заранее, какой именно показатель будетизмеряться. Большинство абстрактных классов следует именно этому принципу: для конкретной работы, выполняемой классом, необходимо,чтобы кто-то предоставил недостающую часть. В нашем примере таким недостающим звеном становится фрагмент программы, выполняющийизмерения.

Вот как может выглядеть соответствующий класс:abstract class Benchmark {abstract void benchmark();public long repeat(int count) {long start = System.currentTimeMillis();for (int i = 0; i < count; i++)benchmark();return (System.currentTimeMillis() — start);}}Класс объявлен с ключевым словом abstract, потому что так объявляется любой класс, содержащий абстрактные методы.

Подобная избыточностьпозволяет во время чтения программы быстро понять, является ли данный класс абстрактным, и обойтись без просмотра всех методов и поискасреди них абстрактных.Метод repeat предоставляет общую схему для проведения измерений. Он знает, как ему вызвать процедуру измерения count раз через равныеинтервалы времени. Если хронометраж должен быть более сложным (например, необходимо измерить время каждого запуска и вычислитьстатистику отклонения от среднего значения), метод можно усовершенствовать, что никак не отразится на реализации процедуры измерений врасширенном классе.Абстрактный метод benchmark должен быть реализован в каждом подклассе, который не является абстрактным. Именно по этой причине вклассе отсутствует реализация, есть лишь объявление. Приведем пример простейшего расширения класса Benchmark:class MethodBenchmark extends Benchark {void benchmark() {}public static void main(String[] args) {int count = Integer.parseInt(args[0]);long time = new MethodBenchmark().repeat(count);System.out.println(count + “ methods in ” +time + “ milliseconds”);}}Данный класс использует benchmark для определения времени, затраченного на вызов метода.

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

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

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

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