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

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

byte a = 40; byte b = 50; byte с = 100; int d = а * b / с;

Результат промежуточного выражения а*b превышает диапазон любого из его byte-операндов. Чтобы управлять проблемой этого рода, Java при оценке выражения автоматически расширяет (повышает) тип каждого byte или short операнда до int. Это означает, что подвыражение а*b вычисляется с использованием целых чисел — не байтов. Таким образом, результат 2000 промежуточного выражения 50*40 является законным даже при том, что оба операнда (а и b определены с типом byte.

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

byte b = 50;

b = b * 2; // Ошибка! Невозможно назначить int-значение byte-переменной!

Во второй строке кода происходит попытка сохранить совершенно правиль­ное byte-значение (50*2) в byte-переменной b. Однако, из-за того что опе­ранды были автоматически расширены до типа int (во время оценки выра­жения), результат также был расширен до int. Таким образом, результат выражения имеет теперь тип int, который не может быть назначен byte-переменной без использования приведения.

Там, где вы осознаете последствия переполнения, следует использовать яв­ное приведение типа:

byte b = 50;

b = (byte) (b * 2) ;

что выдает правильное значение 100.

Правила расширения типов

В дополнение к расширению типов byte и short до int в Java определены несколько правил расширения типов, которые применяются к выражениям. Во-первых, все byte- и short-значения расширяются до int, как только что описано. Затем, если один операнд имеет тип long, тип целого выражения расширяется до long. Если один операнд — типа float, то тип полного вы­ражения расширяется до float. Если тип любого из операндов — double, то тип результата — также double.

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

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

class Promote {

public static void main (String args [ ] ) {

byte b = 42; • . .

char с = 'a';

short s = 1024;

int i = 50000;

float I = 5.67f;

double d = .1234;

double result = (f * b) + (i / c) - (d * s) ;

System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));

System.out.println("результат = " + result); } }

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

double result = (f * b) + (i / с) - (d * s) ;

В первом подвыражении (f*b) тип b расширен до float, а результат подвы­ражения имеет тип float. Далее, в подвыражении а/с) тип с расширен до int, а результат имеет тип int. Затем, в (d*s), значение s расширено до double, и тип подвыражения тоже double. Наконец, просматриваются про­межуточные значения типов float, int и double. Результат сложения float-и int-значений имеет тип float. Затем в вычитании float- и double-опе­рандов результат расширяется до double, что и является типом для оконча­тельного результата выражения.

Массивы

Массив — это набор однотипных переменных, на которые ссылаются по общему имени. Массивы можно создавать из элементов любого типа, и они могут иметь одно или несколько измерений. К определенному элементу в массиве обращаются по его индексу (номеру). Массивы предлагают удобные средства группировки связанной информации.

Если вы знакомы с C/C++, будьте внимательны. Массивы в Java работают ина­че, чем в этих языках.

Одномерные массивы

Одномерный массив — это, по существу, список однотипных переменных. Чтобы создать массив, сначала следует создать переменную массива (array variable) желательного типа. Общий формат объявления одномерного массива:

type var-name[] ;

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