Урок 11

Оболочки типов

1. Что такое оболочки типов?

Оболочки типов (или классы обертки, Wrappers) представляют собой классы, заключающие примитивный тип данных в оболочку объекта.

К оболочкам типов относятся классы Double, Float, Long, Integer, Short, Byte, Character, Boolean, Void.

Классы оболочки предоставляют обширный ряд методов, позволяющих полностью интегрировать примитивные типы в иерархию объектов в Java.

Объекты классов оболочек неизменяемы (immutable).

Все классы-обертки числовых типов имеют переопределенный метод equals(Object), сравнивающий примитивные значения объектов.

2. Конструкторы

Таблица 1. Оболочки и аргументы конструкторов

Примитивный тип

Оболочка

Аргументы конструктора

boolean

Boolean

boolean or String

byte

Byte

byte or String

char

Character

char

double

Double

double or String

float

Float

float, double, or String

int

Integer

int or String

long

Long

long or String

short

Short

short or String

Пример 1. Конструкторы оболочек

Если передаваемая в конструктор строка не содержит числового значения, то бросается исключение NumberFormatException.

Integer i1 = new Integer(42);
Integer i2 = new Integer("42");

Float f1 = new Float(3.14f);
Float f2 = new Float("3.14f");

Character c1 = new Character('c');

Пример 2. Конструктор класса Boolean

public class WrapperDemo1 {
    public static void main(String[] args) {
        Boolean boolean1 = new Boolean(true);
        Boolean boolean2 = new Boolean("dddd");

        System.out.println(boolean2);
    }
}

3. Методы классов-оболочек

3.1. Методы valueOf()

Методы valueOf() предоставляют второй способ создания объектов оболочек.

Пример 3. Создание объектов с помощью методов valueOf()

Integer i1 = Integer.valueOf("6");
// converts 101011 to 43 and assigns the value  43 to the
// Integer object i2
Integer i2 = Integer.valueOf("101011", 2); 
Integer i3 = Integer.valueOf(6);
// assigns 3.14 to the Float object f1
Float f1 = Float.valueOf("3.14f"); 

3.2. Методы parseXxx()

Пример 4. Использование методов parseXXX()

public class WrapperDemo3 {
    public static void main(String[] args) {
        double d1 = Double.parseDouble("3.14");
        System.out.println("d1 = " + d1);
        Double d2 = Double.valueOf("3.14");
        System.out.println("d2 value = " + d2);


        long aLong1 = Long.parseLong("101010", 2); // binary String to long
        System.out.println("aLong1 = " + aLong1); // result is: aLong1 = 42
        Long aLong2 = Long.valueOf("101010", 2); // binary String to Long
        System.out.println("aLong2 value = " + aLong2); // aLong2 value = 42
    }
}

3.3. Методы toString()

  • Все типы-оболочки переопределяют toString(). Этот метод возвращает читабельную для человека форму значения, содержащегося в оболочке. Это позволяет выводить значение, передавая объект оболочки типа методу println().
  • Также все числовые оболочки типов предоставляют статический метод toString():
    String d = Double.toString(3.14); 
  • Integer и Long предоставляют третий вариант toString() метода. Он статический, первый аргумент – примитивный тип, второй - основание системы счисления. 
    String s = "hex = "+ Long.toString(254, 16); // s = "hex = fe"​

3.4. Методы toXxxString() (Binary, Hexadecimal, Octal)

Integer и Long позволяют преобразовывать числа в десятичной системе исчисления к другим системам исчисления. Например:

Пример 5. Использование методов toXXXString()

String s3 = Integer.toHexString(254); // convert 254 to hex
System.out.println("254 is " + s3); // result: "254 is fe"
String s4 = Long.toOctalString(254); // convert 254 to octal
System.out.print("254(oct) ="+ s4); // result: "254(oct) =376"

4. Класс Number

Все оболочки числовых типов наследуют абстрактный тип Number. Number объявляет методы, которые возвращают значение объекта в каждом из различных числовых форматов.

Класс Number

Пример 6. Вызов метода intValue()

public class WrapperDemo2 {
    public static void main(String[] args) {
        Integer iOb = new Integer(100);
        int i = iOb.intValue();
        System.out.println(i + " " + iOb);
    }
}

Пример 7. Приведение типов

public class UnboxingError {
    public static void main(String[] args) {
        Integer iOb = new Integer(1000);
        int i = iOb.byteValue(); // распаковать как byte!!!
        System.out.println(i);  // результат -24!!!
    }
}

5. Статические константы

Каждый класс оболочка содержит статические константы, содержащие максимальное и минимальное значения для данного типа.

Например в классе Integer есть константы Integer.MIN_VALUE – минимальное int значение и Integer.MAX_VALUE – максимальное int значение.

Классы-обертки числовых типов Float и Double, помимо описанного для целочисленных примитивных типов, дополнительно содержат определения следующих констант:

  • NEGATIVE_INFINITY – отрицательная бесконечность;
  • POSITIVE_INFINITY – положительная бесконечность;
  • NaN – не числовое значение.

Пример 8. Использование статических констант

public class InfinityDemo {
    public static void main(String[] args) {
        int a = 7;
        double b = 0.0;
        double c = -0.0;
        double g = Double.NEGATIVE_INFINITY;
        System.out.println(a / b);
        System.out.println(a / c);
        System.out.println(b == c);
        System.out.println(g * 0);
    }
}



0 comments
Leave your comment: