Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМК_ИТИРОД(Часть 1).docx
Скачиваний:
35
Добавлен:
11.05.2015
Размер:
1.17 Mб
Скачать

5. Классы-оболочки

5.1 Числовые классы

Java — полностью объектно-ориентированный язык. Это означает, что все, что только можно, в Java представлено объектами.

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

Но и для этих типов в языке Java есть соответствующие классы — классы-оболочки (wrapper) примитивных типов. Конечно, они предназначены не для вычислений, а для действий, типичных при работе с классами — создания объектов, преобразования объектов, получения численных значений объектов в разных формах и передачи объектов в методы по ссылке.

На рис. 12 показана одна из ветвей иерархии классов Java. Для каждого примитивного типа есть соответствующий класс. Числовые классы имеют общего предка — абстрактный класс Number , в котором описаны шесть методов, возвращающих числовое значение, содержащееся в классе, приведенное к соответствующему примитивному типу: bytevalue (), doubievalue () , floatValue (), intValue(), longValue (), shortValue () . Эти методы переопределены в каждом из шести числовых классов-оболочек.

Рис. 12. Классы примитивных типов

Помимо метода сравнения объектов equals о, переопределенного из класса object , все описанные в этой главе классы, кроме Boolean и class , имеют метод compareTo () , сравнивающий числовое значение, содержащееся в данном объекте, с числовым значением объекта — аргумента метода compareTo() . В результате работы метода получается целое значение:

0, если значения равны;

отрицательное число (—1), если числовое значение в данном объекте меньше, чем в объекте-аргументе;

положительное число (+1), если числовое значение в данном объекте больше числового значения, содержащегося в аргументе.

Что полезного в классах-оболочках?

В каждом из шести числовых классов-оболочек есть статические методы преобразования строки символов типа String лредставляющей число, в соответствующий примитивный тип:Byte.parseByte(), Double.parseDouble(), Float.parseFloat(), Integer.parselnt(), Long.parseLong(), Short.parseShort() . Исходная строка типаString , как всегда в статических методах, задается как аргумент метода. Эти методы полезны при вводе данных в поля ввода, обработке параметров командной строки, т. е. всюду, где числа представляются строками цифр со знаками плюс или минус и десятичной точкой.

В каждом из этих классов есть статические константы MAX_VALUE иMIN_VALUE , показывающие диапазон числовых значений соответствующих примитивных типов. В классахDouble иFloat есть еще константыPOSITIVE_INFINITY, NEGATIVE_INFINITY, NaN , о которых шла речь вглаве 1, и логические методы проверкиisNan() ,isInfinite() .

Если вы хорошо знаете двоичное представление вещественных чисел, то можете воспользоваться статическими методами floatTointBits() иdoubieToLongBits() , преобразующими вещественное значение в целое. Вещественное число задается как аргумент метода. Затем вы можете изменить отдельные биты побитными операциями и преобразовать измененное целое число обратно в вещественное значение методамиintsitsToFioat() иlongBitsToDouble() .

Статическими методами toBinaryString(), toHexString() и toOctalString() классовinteger иLong можно преобразовать целые значения типовint иlong , заданные как аргумент метода, в строку символов, показывающую двоичное, шестнадцатеричное или восьмеричное представление числа.

В листинге 15 показано применение этих методов, а рис. 13 демонстрирует вывод результатов.

Рис. 13. Методы  числовых классов ;

Листинг 15. Методы числовых классов

class NumberTest {

public static void main(String[] args) {

int i = 0;

short sh = 0;

double d = 0;

Integer kl = new Integer(55);

Integer k2 = new Integer(100);

Double dl = new Double(3.14);

try {

i = Integer.parseInt(args[0]);

sh = Short.parseShort(args[0]);

d = Double.parseDouble(args[1]);

dl = new Double(args[1]);

kl = new Integer(args[0]);

} catch (Exception e) {

}

double x = 1.0;

System.out.println("i = " + i);

System.out.println("sh - " + sh);

System.out.println("d. = " + d);

System.out.println("kl.intValue() = " + kl.intValue());

System.out.println("dl.intValue() = " + dl.intValue());

System.out.println("kl > k2? " + kl.compareTo(k2));

System.out.println("x = " + x);

System.out.println("x isNaN? " + Double.isNaN(x));

System.out.println("x islnfinite? " + Double.isInfinite(x));

System.out.println("x == Infinity? " +

(x == Double.POSITIVE_INFINITY));

System.out.println("d = " + Double.doubleToLongBits(d));

System.out.println("i = " + Integer.toBinaryString(i));

System.out.println("i = " + Integer.toHexString(i));

System.out.println("i = " + Integer.toOctalString(i));

}

}