Назад
Вперед
1.2. Замещающие типы данных
В примере демонстрируется использование
замещающих типов данных Java.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
В этом примере мы будем демонстрировать методы
работы с замещающими типами данных.
Для каждого базового типа данных в языке
программирования Java предусмотрен встроенный
замещающий класс (wrapper class).
Ниже мы привели таблицу соответствия базовых
типов и замещающих классов:
Базовый тип |
Замещающий класс |
boolean |
Boolean |
byte |
Byte |
char |
Character |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
Используя конструкторы замещающих классов, вы
можете создавать и инициализировать объекты
данных.
Важно, что с этими объектами нельзя работать
как с переменными базовых классов. Например, им
обычно нельзя присваивать новое значение при
помощи оператора "=" или складывать
оператором "+". Для выполнения любых
операций над объектами замещающих классов
необходимо применять соответствующие
конструкторы и методы, определенные в этих
классах.
Описание примера
Пример представляет собой автономную
программу Java. Когда она запускается на
выполнение, управление получает метод main. Внутри
этого метода мы выполняем ряд операций над
объектами различных замещающих классов.
Результат отображается на консоли.
Работа с объектами класса Boolean
Прежде всего наша программа создает объект с
именем fBooleanValue класса Boolean:
Boolean fBooleanValue = new Boolean(true);
При инициализации мы присваиваем объекту
значение true, передавая его через параметр
конструктору.
Дальше мы проверяем значение, хранящееся в
объекте fBooleanValue при помощи условного оператора:
if(fBooleanValue.booleanValue())
{
. . .
}
Обратите внимание, что для извлечения значения
мы воспользовались методом booleanValue, определенным
в классе Boolean.
Заметим, что при попытке проверить значение тем
способом, который мы использовали для переменных
базового типа boolean, компилятор выведет сообщение
об ошибке:
if(fBooleanValue) // ОШИБКА!
{
. . .
}
Дело в том, что не существует механизма
неявного преобразования значения, хранящегося в
объекте класса Boolean, в переменную базового типа
boolean. Подобное замечание касается и других
замещающих классов.
В следующем фрагменте кода мы присваиваем
переменной класса Boolean новое значение и выводим
его на консоль:
fBooleanValue = Boolean.FALSE;
System.out.println("fBooleanValue = "
+ fBooleanValue);
В классе Boolean определены константы FALSE и TRUE,
которые можно использовать так, как это показано
выше.
Результат работы фрагмента кода:
* Boolean *
Set fBooleanValue to 'false'
fBooleanValue = false
Работа с объектами класса Byte
Создавая объект класса Byte, мы сразу присваиваем
ему максимально возможное значение MAX_VALUE:
Byte bByteValue = new Byte(Byte.MAX_VALUE);
System.out.println("bByteValue = "
+ bByteValue);
В каждом классе, замещающем численные базовые
типы, определены константы MAX_VALUE и MIN_VALUE. Вы
можете использовать их, например, для проверки
выхода значения из допустимых границ.
В следующем фрагменте кода мы присваиваем
объекту bByteValue новое значение:
bByteValue = new Byte((byte)25);
System.out.println("bByteValue = "
+ bByteValue.byteValue());
Так как конструктор класса Byte принимает один
параметр типа byte, нам пришлось выполнять явное
преобразование типа int в тип byte.
Ниже мы показали, что может произойти, если вы
по ошибке попытаетесь сложить два объекта класса
Byte при формировании текстовой строки:
Byte add = new Byte((byte)26);
System.out.println("bByteValue + add = "
+ bByteValue + add);
В результате выполнения этой операции
текстовая строка, представляющая объект bByteValue,
будет слита с текстовой строкой объекта add:
Результат работы фрагмента кода:
* Byte *
bByteValue = 127
bByteValue = 25
bByteValue + add = 2526
Работа с объектами класса Character
Класс Character используется для работы с символами
Unicode вместо базового типа char.
В нашем примере мы создаем объект этого класса
chCharValue, инициализируя его символом "*", а
затем выводим результат на консоль:
Character chCharValue = new Character('*');
System.out.println("chCharValue = "
+ chCharValue);
При необходимости с помощью метода charValue
нетрудно получить для объекта класса Character
значение базового типа char:
char chv = chCharValue.charValue();
System.out.println("chv = " + chv);
Результат работы фрагмента кода:
* Character *
chCharValue = *
chv = *
Работа с объектами класса Short
Приемы работы с объектами класса Short во многом
аналогичны приемам, которые можно использовать
для объектов класса Byte или объектов других
численных замещающих классов.
Ниже мы создаем объект shShortValue класса Short и затем
инициализируем его максимально возможным
значением:
Short shShortValue =
new Short(Short.MAX_VALUE);
System.out.println("shShortValue = "
+ shShortValue);
Для того чтобы изменить значение, хранящееся в
объекте shShortValue, мы создаем новый объект класса
Short. Новое значение передается конструктору в
качестве параметра:
shShortValue = new Short((short)2);
System.out.println("shShortValue = "
+ shShortValue);
Обратите внимание, что нам пришлось прибегнуть
к явному преобразованию типа.
Результат работы фрагмента кода:
* Short *
shShortValue = 32767
shShortValue = 2
Работа с объектами класса Integer
В следующем фрагменте кода мы создаем объект
iIntValue класса Integer и записываем в него максимально
допустимое значение, равное 2147483647:
Integer iIntValue =
new Integer(2147483647);
System.out.println("iIntValue = "
+ iIntValue);
Заметим, что вместо числа 2147483647 мы могли
указать константу Integer.MAX_VALUE.
Ниже мы показали, как можно увеличить на 2
значение, хранящееся в объекте iIntValue:
iIntValue = new Integer(2
+ iIntValue.intValue());
System.out.println("iIntValue = "
+ iIntValue);
Мы не можем просто прибавить к переменной iIntValue
значение 2, так как такая операция не определена.
Вместо этого нам приходится вначале получить
текущее значение для объекта iIntValue, вызвав метод
intValue, а затем сложить его с числом 2 и передать
конструктору класса Integer.
Результат работы фрагмента кода:
* Integer *
iIntValue = 2147483647
iIntValue = -2147483647
Работа с объектами класса Long
Создание объекта класса Long и его инициализация
выполняется в нашем примере следующим образом:
Long lLongValue = new Long(Long.MAX_VALUE);
System.out.println("lLongValue = "
+ lLongValue);
При инициализации мы присваиваем объекту lLongValue
значение, максимально возможное для класса Long.
Затем мы повторно присваиваем этому же объекту
другое значение:
lLongValue = new Long(1234567890L);
System.out.println("lLongValue = "
+ lLongValue);
Результат работы фрагмента кода:
* Long *
lLongValue = 9223372036854775807
lLongValue = 1234567890
Работа с объектами класса Float
В следующем фрагменте кода создается объект
flFloatValue класса Float, которому присваивается
начальное значение 0,526:
Float flFloatValue = new Float(526e-3F);
System.out.println("flFloatValue = "
+ flFloatValue);
Далее мы выводим на консоль значение,
максимально возможное для класса Float:
flFloatValue = new Float(Float.MAX_VALUE);
System.out.println("flFloatValue = "
+ flFloatValue);
В результате выполнения различных
арифметических операций возможно получение
результата, не являющегося числом. Для
представления "нечисел" в классе Float
предусмотрена константа NaN (сокращение от Not a
Number).
Ниже мы создаем объект, записывая в него
значение NaN:
flFloatValue = new Float(Float.NaN);
System.out.println("flFloatValue = "
+ flFloatValue);
Последний фрагмент кода, демонстрирующего
работу с объектами класса Float, выполняет деление
-1 на нуль:
float zero = 0;
float fl = -1/zero;
flFloatValue = new Float(fl);
System.out.println("flFloatValue = "
+ flFloatValue);
При этом в переменной fl базового типа fl
оказывается значение, равное отрицательной
бесконечности. Мы используем это значение для
инициализации объекта flFloatValue класса Float,
записывая в него таким образом отрицательную
бесконечность.
Результат работы фрагмента кода:
* Float *
flFloatValue = 0.526
flFloatValue = 3.4028235E38
flFloatValue = NaN
flFloatValue = -Infinity
Работа с объектами класса Double
Класс Double предназначен для хранения чисел с
плавающей десятичной точкой повышенной
точности.
Ниже мы создаем объект dblDoubleValue класса Double и
выполняем его инициализацию значением 0.526:
Double dblDoubleValue = new Double(526E-3D);
System.out.println("dblDoubleValue = "
+ dblDoubleValue);
Затем мы записываем в этот же объект
максимально возможное значение и отображаем это
значение на консоли:
dblDoubleValue = new Double(Double.MAX_VALUE);
System.out.println("dblDoubleValue = "
+ dblDoubleValue);
Результат работы фрагмента кода:
* Double *
dblDoubleValue = 0.526
dblDoubleValue = 1.7976931348623157E308
Назад Вперед |