|
ГЛАВА 4
Классы-оболочки
Java — полностью объектно-ориентированный
язык. Это означает, что все, что только можно, в Java представлено объектами.
Восемь примитивных типов нарушают
это правило. Они оставлены в Java из-за многолетней привычки к числам и символам.
Да и арифметические действия удобнее и быстрее производить с обычными числами,
а не с объектами классов.
Но и для этих типов в языке Java
есть соответствующие классы —
классы-оболочки
(wrapper) примитивных типов.
Конечно, они предназначены не для вычислений, а для действий, типичных при работе
с классами — создания объектов, преобразования объектов, получения численных
значений объектов в разных формах и передачи объектов в методы по ссылке.
На рис. 4.1 показана одна из ветвей
иерархии классов Java. Для каждого примитивного типа есть соответствующий класс.
Числовые классы имеют общего предка — абстрактный класс
Number
,
в котором описаны шесть методов, возвращающих числовое значение, содержащееся
в классе, приведенное к соответствующему примитивному типу:
bytevalue (), doubievalue ()
,
floatValue (), intValue(),
longValue (), shortValue ()
. Эти методы переопределены в каждом из шести
числовых классов-оболочек.
Рис. 4.1.
Классы
примитивных типов
Помимо метода сравнения объектов
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
, заданные как
аргумент метода, в строку символов, показывающую двоичное, шестнадцатеричное
или восьмеричное представление числа.
В листинге 4.1 показано применение
этих методов, а рис. 4.2 демонстрирует вывод результатов.
Рис. 4.2.
Методы
числовых классов ;
Листинг 4.1.
Методы числовых классов
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.parselnt(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/0.0;
System.out.println("i = " + i) ;
System.outjprintln("sh - " + sh) ;
System.out.println("d. = " + d) ;
System.out.println("kl.intValue() = " + kl.intValue());
System.out.println("dl.intValue() '= "'+ dl.intValuei));
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.islnfinite(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));
}
}
Методы
parseint()
и конструкторы классов требуют обработки исключений, поэтому в листинг 4.1 вставлен
блок
try{} catch(){}
. Обработку исключительных ситуаций
мы разберем в главе 16.
|