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

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

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

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

В классеMath имеются методы, которые иначе осуществляют округление чисел с плавающей точкой при преобразовании в целое — см. раздел “КлассMath”.Значение double также может явно преобразовываться к типу float, а значение целого типа — к меньшему целому типу. При приведении double кfloat возможна потеря точности или же появление нулевого или бесконечного значения вместо существовавшего ранее конечного.Приведение целых типов заключается в “срезании” их старших битов.

Если значение большего целого умещается в меньшем типе, к которомуосуществляется преобразование, то ничего страшного не происходит. Однако если величина более широкого целого типа лежит за пределамиболее узкого типа, то потеря старших битов изменяет значение, а возможно — и знак. Фрагмент:short s = -134;byte b = (byte)s;System.out.println("s = " + s + ", b = " + b);выводит следующий результат (поскольку старшие биты s теряются при сохранении значения в b):s = -134, b = 122char можно преобразовать к любому целому типу и наоборот.

При приведении целого типа в char используются только младшие 16 бит, аостальные биты отбрасываются. При преобразовании char в целый тип старшие 16 бит заполняются нулями. Тем не менее впоследствии работа сэтими битами осуществляется точно так же, как и с любыми другими. В приведенном ниже фрагменте программы максимальный символ Unicodeпреобразуется к типу int (неявно) и к типу short (явно). Значение типа int (0x0000ffff) оказывается положительным, поскольку старшие битысимвола обнулены. Однако при приведении к типу short получается отрицательная величина, так как старшим битом типа short являетсязнаковый бит:class CharCast {public static void main(String[] args) {int i = '\uffff';short s = (short)'\uffff';System.out.println("i = " + i);System.out.println("s = " + s);}}А вот как выглядит результат работы:i = 65535s = -1Явное приведение типов может применяться и к объектам.

Хотя объект расширенного типа разрешается использовать вместо объектасупертипа, обратное, вообще говоря, неверно. Предположим, у вас имеется следующая иерархия объектов:Ссылка типа Coffee не обязательно относится к типу Mocha — объект также может иметь тип Latte. Следовательно, неверно, вообще говоря,ставить ссылку на объект типа Coffee там, где требуется ссылка на объект типа Mocha. Подобное приведение называется сужением (narrowing),или понижающим приведением, в иерархии классов. Иногда его также называют ненадежным приведением (unsafe casting), поскольку оно невсегда допустимо. Переход от типа, расположенного ниже в иерархии, к расположенному выше называется повышающим приведением типа;кроме того, употребляется термин надежное приведение, поскольку оно работает во всех случаях.Но иногда вы совершенно точно знаете, что объект Coffee на самом деле является экземпляром класса Mocha.

В этом случае можно осуществлятьявное понижающее приведение. Это делается следующим образом:Mocha fancy = (Mocha)joe;Если такое приведение сработает (то есть ссылка joe действительно указывает на объект типа Mocha), то ссылка fancy будет указывать на тот жеобъект, что и joe, однако с ее помощью можно получить доступ к дополнительным функциям, предоставляемым классом Mocha. Если жепреобразование окажется недопустимым, будет возбуждено исключение ClassCastException.

В случае, если приведение даже потенциально неможет быть правильным (например, если бы Mocha вообще не являлся подклассом того класса, к которому относится joe), будет выданосообщение об ошибке во время компиляции программы. Таким образом предотвращаются возможные проблемы, связанные с невернымипредположениями по поводу иерархии классов.Иногда метод не требует, чтобы объект относился к расширенному типу, но может предоставить объектам расширенного типа дополнительныефункции. Можно выполнить приведение типа и обработать исключение, однако использование исключений для подобных целей оказываетсясравнительно медленным и потому считается проявлением плохого стиля. Для определения того, относится ли объект к конкретному типу,применяется метод instanceof, который возвращает true для допустимых преобразований:public void quaff(Coffee joe) {// ...if (joe instanceof Mocha) {Mocha fancy = (Mocha)joe;// ...

использовать функциональность Mocha}}Ссылка null не указывает ни на какой конкретный объект, так что результат выраженияnull instanceof Typeвсегда равен false для любого типа Type.5.13.3. Строковое приведениеКласс String отличается от остальных: это неявно используется в операторе конкатенации +, а строковые литералы ссылаются на объекты String.Примеры нам уже встречались в программах: при выполнении конкатенации Java пытается преобразовать в String все, что еще не относится кэтому типу. Подобные приведения определены для всех примитивных типов и осуществляются вызовом метода toString объекта (см.

раздел“Метод toString”).Если преобразовать в String пустую ссылку, то результатом будет строка “null”. Если для данного класса метод toString не определен, тоиспользуется метод, унаследованный от класса Object и возвращающий строковое представление типа объекта.5.14. Доступ к членамДоступ к членам объекта осуществляется с помощью оператора . — например, obj.method(). Оператор . может применяться и для доступа кстатическим членам либо по имени класса, либо по ссылке на объект. Если для доступа к статическим членам используется ссылка на объект, товыбор класса осуществляется на основании объявленного типа ссылки, а не фактического типа объекта. Для доступа к элементам массивовслужат квадратные скобки — например, array[i].Если использовать .

или [] со ссылкой, значение которой равно null, то возбуждается исключение NullPointerException (кроме того случая, когдавы используете . для вызова статического метода). Если индекс массива выходит за его пределы, возбуждается исключение IndexOutOfBounds.Проверка осуществляется при каждом обращении к элементу массива. /По крайней мере runtime-система ведет себя именно так, но компиляторчасто может избежать проверки в тех случаях, когда он действительно уверен, что все в порядке, например, если значение переменной циклавсегда лежит в допустимом диапазоне./Для правильного вызова метода необходимо предоставить аргументы в нужном количестве и правильного типа, чтобы в классе нашелся ровноодин метод с совпадающей сигнатурой. Если метод не перегружался, дело обстоит просто — с именем метода ассоциируется всего один наборпараметров.

Выбор оказывается несложным и в том случае, если был объявлен всего один метод с заданным именем и количеством аргументов.Если существует два и более перегруженных метода с одинаковым количеством параметров, выбор правильной версии становится несколькоболее сложным. Для этого Java пользуется следующим алгоритмом, называемым “алгоритмом самого точного совпадения”:1.

Найти все методы, к которым может относиться данный вызов, — то есть построить список всех перегруженных методов с нужным именем итипами параметров, которым могут быть присвоены значения всех аргументов. Если находится всего один метод со всеми подходящимиаргументами, вызывается именно он.2. У нас остался список методов, каждый из которых подходит для вызова. Проделаем следующую процедуру. Рассмотрим первый метод в списке.Если вместо параметров в первом методе могут быть использованы параметры еще какого-либо метода из списка — исключим первый метод изсписка.

Эта процедура повторяется до тех пор, пока остается возможность удаления методов.3. Если остался ровно один метод, то совпадение для него оказывается самым точным, и он будет вызываться в программе. Если же осталосьнесколько методов, то вызов является неоднозначным; точного совпадения не существует, а вызов оказывается недопустимым.Например, предположим, что у нас имеется усовершенствованная версия класса с десертами из раздела 3.2:Допустим также, что у нас имеется несколько перегруженных методов, которые вызываются для конкретных комбинаций параметров Dessert:void moorge(Dessert d, Scone s){ /* Первая форма */ }void moorge(Cake c, Dessert d){ /* Вторая форма */ }void moorge(ChocolateCake cc,Scone s) { /* Третья форма */ }Теперь рассмотрим следующие вызовы moorge:moorge(dessertRef, sconeRef);moorge(chocolateCakeRef, dessertRef);moorge(chocolateCakeRef, butteredSconeRef);moorge(cakeRef, sconeRef); // НЕВЕРНОВ первом вызове используется первая форма moorge, потому что типы параметров и аргументов в точности совпадают.

Во втором вызовеиспользуется вторая форма, потому что только в ней переданные аргументы могут быть присвоены в соответствии с типом параметров. В обоихслучаях вызываемый метод определяется после выполнения первого шага описанного выше алгоритма.С третьим вызовом дело обстоит сложнее. Список потенциальных кандидатов включает все три формы, потому что ссылка chocolateCakeRefможет быть присвоена первому параметру, а ButteredScone — второму параметру во всех трех формах, и ни для одной из сигнатур не находитсяточного совпадения. Следовательно, после шага 1 у нас имеется набор из трех методов-кандидатов.На шаге 2 из набора исключаются все методы с менее точным совпадением. В нашем случае первая форма исключается из-за того, чтосовпадение для третьей формы оказывается более точным.

Действительно, рассмотрим третий и первый методы. Ссылка на ChocolateCake (изтретьей формы) может быть присвоена параметру типа Desert (из первой формы), а ссылка на Scone (из третьей формы) непосредственноприсваивается параметру типа Scone (в первой форме). Вторая форма исключается из набора по аналогичным соображениям. В итоге количествовозможных методов сократилось до одного (третьей формы moorge), и именно этот метод и будет вызван.Последний вызов является недопустимым.

После шага 1 набор возможных методов состоит из первой и второй форм. Поскольку параметрылюбой из этих форм не могут быть присвоены параметрам другой, на шаге 2 не удается исключить из набора ни одну из этих форм.Следовательно, мы имеем дело с неоднозначным вызовом, по поводу которого компилятор не может принять никакого решения, что являетсянедопустимым.Эти же правила относятся и к примитивным типам. Например, значение int может быть присвоено переменной float, и при рассмотренииперегруженного вызова этот факт будет принят во внимание — точно так же, как и возможность присваивания ссылки ButteredScone ссылкеScone.Перегруженные методы не могут отличаться одним лишь типом возвращаемого значения и/или списком возбуждаемых исключений, поскольку впротивном случае при выборе запускаемого метода возникало бы слишком много неоднозначностей.

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

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

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

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