В этом примере делается попытка создать с помощью reflection три объекта. Имена классов, от которых они должны быть порождены, записаны в массив vehicleNames. Объект класса Automobile был успешно создан, причем, дальнейшая работа с ним велась через интерфейс Vehicle. Класс Truck был найден, но при попытке создания объекта было брошено, а затем обработано исключение java.lang.InstantiationException, поскольку конструктор без параметров отсутствует. Класс java.lang.Tank определен не был и поэтому при попытке получить соответствующий ему объект Class было выброшено исключение java.lang.ClassNotFoundException.
Классы-обертки
Во многих случаях предпочтительней работать именно с объектами, а не с примитивными типами. Так, например, при использовании коллекций просто необходимо значения примитивных типов представлять в виде объектов.
Для этих целей и предназначены так называемые классы-обертки. Для каждого примитивного типа Java существует свой класс-обертка . Такой класс является неизменяемым (если необходим объект, хранящий другое значение, его нужно создать заново), к тому же имеет атрибут final – от него нельзя наследовать класс. Все классы-обертки (кроме Void ) реализуют интерфейс Serializable, поэтому объекты любого (кроме Void ) класса-обертки могут быть сериализованы. Все классы-обертки содержат статическое поле TYPE, ссылающееся на объект Class, соответствующий примитивному оборачиваемому типу.
Также классы-обертки содержат статические методы для обеспечения удобного манипулирования соответствующими примитивными типами, например, преобразование к строковому виду.
В таблице 13.1 приведены примитивные типы и соответствующие им классы-обертки.
Таблица 13.1. Примитивные типы и соответствующие им классы-обертки.Класс- оберткаПримитивный типBytebyteShortshortCharactercharIntegerintLonglongFloatfloatDoubledoubleBooleanboolean
При этом классы-обертки числовых типов Byte, Short, Integer, Long, Float, Double наследуются от одного класса – Number. В нем объявлены методы, возвращающие числовое значение во всех числовых форматах Java ( byte, short, int, long, float и double ).
Все классы-обертки реализуют интерфейс Comparable. Все классы-обертки числовых типов имеют метод equals(Object), сравнивающий примитивные значения объектов.
Рассмотрим более подробно некоторые из классов- оберток.
Integer
Наиболее часто используемые статические методы:
public static int parseInt(String s) – преобразует строку, представляющую десятичную запись целого числа, в int ;
public static int parseInt(String s, int radix) – преобразует строку, представляющую запись целого числа в системе счисления radix, в int.
Оба метода могут возбуждать исключение NumberFormatException, если строка, переданная на вход, содержит нецифровые символы.
Не следует путать эти методы с другой парой похожих методов:
public static Integer valueOf(String s) public static Integer valueOf(String s, int radix)
Данные методы выполняют аналогичную работу, только результат представляют в виде объекта- обертки.
Существует также два конструктора для создания экземпляров класса Integer:
Integer(String s) – конструктор, принимающий в качестве параметра строку, представляющую числовое значение.
Integer(int i) – конструктор, принимающий числовое значение.
public static String toString(int i) – используется для преобразования значения типа int в строку.
Далее перечислены методы, преобразующие int в строковое восьмеричное, двоичное и шестнадцатеричное представление:
public static String toOctalString(int i) – восьмеричное;
public static String toBinaryString(int i) – двоичное;
public static String toHexString(int i) – шестнадцатеричное.
Имеется также две статические константы:
Integer.MIN_VALUE – минимальное int значение;
Integer.MAX_VALUE – максимальное int значение.
Аналогичные константы, описывающие границы соответствующих типов, определены и для всех остальных классов-оберток числовых примитивных типов.
public int intValue() возвращает значение примитивного типа для данного объекта Integer. Классы-обертки остальных примитивных целочисленных типов – Byte, Short, Long – содержат аналогичные методы и константы (определенные для соответствующих типов: byte, short, long ).
Рассмотрим пример:
public static void main(String[] args) { int i = 1; byte b = 1; String value = '1000'; Integer iObj = new Integer(i); Byte bObj = new Byte(b); System.out.println('while i==b is ' + (i==b)); System.out.println('iObj.equals(bObj) is ' + iObj.equals(bObj)); Long lObj = new Long(value); System.out.println('lObj = ' + lObj.toString()); Long sum = new Long(lObj.longValue() + iObj.byteValue() +