Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 3. Типы данных, переменные и массивы 69_

Для расширяющих преобразований числовые типы, включая целый и с пла­вающей точкой, являются совместимыми друг с другом. Однако числовые типы не совместимы с char или boolean. Типы char и boolean не совмес­тимы также и друг с другом.

Как говорилось ранее, Java выполняет автоматическое преобразование типов также и при сохранении литеральной целочисленной константы в перемен­ных типа byte, short ИЛИ long.

Приведение несовместимых типов

Хотя автоматическое преобразование типов полезно, оно не удовлетворяет всем потребностям. Например, как быть, если вы захотите назначить int-значение byte-переменной? Это преобразование не будет выполнено авто­матически, потому что тип byte меньше, чем int. Данный вид преобразова­ния иногда называется сужающим преобразованием (narrowing conversion), т. к. вы явно делаете значение более узким, чтобы оно вписалось в целе­вой тип.

Чтобы создавать преобразование между двумя несовместимыми типами, вы должны использовать приведение типов. Приведение (cast) — это и есть явное преобразование типов. Оно имеет общий формат:

(target- type) value

Здесь target-type определяет желаемый тип, к которому следует преобразо­вать указанное value. Например, следующий фрагмент приводит int к byte. Если целое значение больше, чем диапазон byte-типа (256), то оно будет редуцировано по модулю этого диапазона (до остатка от целочисленного деления этого значения на 256).

int a;

byte b;

// .. .

b = (byte) a;

Другой тип преобразований — усечение (trancation), произойдет, когда зна­чение с плавающей точкой назначается целому типу. Как вы знаете, целые числа не имеют дробных частей. Таким образом, когда значение с плаваю­щей точкой назначается целому типу, дробная часть теряется. Например, если значение 1.23 назначается целой переменной, результирующее значе­ние будет просто 1, а 0.23 будет усечено. Конечно, если числовое значение слишком велико, чтобы вписаться в целевой целый тип, то оно будет реду­цировано по модулю диапазона целевого типа.

Следующая программа демонстрирует некоторые преобразования типов, ко­торые требуют приведений:

70 Часть I. Язык Java

// Демонстрирует приведения типов, class Conversion {

public static void main(String args[]) {

byte b;

int i = 251;

double d = 323.142;

System.out.println("ХпПриведение int к byte."); b = (byte) i;

System.out.println("i и b " + i + " " + b) ; System.out.println("ХпПриведение double Kint."); i = (int) d;

System.out.println("d и i " + d + " " + i); System.out.println("ХпПриведение double к byte."); b = (byte) d;

System.out.println("d and. b " + d + " " + b); } }

Эта программа генерирует следующий вывод:

Приведение int к byte . i и b 257 1

Приведение double к int . d и i 323.142 323

Приведение double к byte . d и b 323.142 67

Посмотрим на каждое преобразование. Когда значение 257 приводится к byte-переменной, результат — остаток от деления 257 на 256 (диапазон типа byte) в этом случае равен 1. Когда d преобразуется к int, его дробный ком­понент теряется. Когда d преобразуется к byte, его дробный компонент те­ряется, и значение редуцируется по модулю 256, что в этом случае дает 67.

Автоматическое расширение типа в выражениях

В дополнение к операции назначения (присваивания) в выражениях есть и другое место, где могут происходить некоторые преобразования типов — в выражениях. Чтобы увидеть, как и почему это происходит, приведем сле­дующие соображения. В выражении точность, требуемая от промежуточного значения, будет иногда превышать диапазон любого операнда. Например, рассмотрим следующие выражения:

Соседние файлы в папке JavaLit