Назад Зміст Вперед

10.7. Wrappers, autoboxing, autounboxing. Пул для Wrappers

Wrapper 

Як ми вже бачили, змінні примітивного типу даних за замовчуванням передаються за значенням, а не за посиланням. Досить часто, може виникнути необхідність розглядати такі змінні примітивного типу даних в якості базових типів. Вирішення цієї проблеми лежить в класах-обгортках, що надаються Java. Ці класи використовуються, щоб обгорнути дані в новий об'єкт, який містить значення цієї змінної. Цей об'єкт може бути використаний таким чином, подібно до того, як інші об'єкти використовуються. Наприклад, ми обернути число 34 в об'єкті Integer наступним чином:
Integer intObject = new Integer (34); 

Клас Integer є клас - оболонка, яка була передбачена для типу INT даних. Крім того, існують класи-обгортки для інших типів даних теж. У цій таблиці наведено типи даних і відповідні їм класи-оболонки.

Data TypeWrapper Class
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

Зверніть увагу, що класи-обгортки всіх примітивних типів даних, за винятком іnt і char мають таке ж ім'я, що і тип даних.

Створення об'єктів класів Wrapper 

Всі класи-оболонки мають конструктори, які можуть бути використані для створення відповідних об'єктів класу-оболонки, передаючи рядком або змінну того ж типу даних, що і типу, до якого клас-оболонка відповідає, за винятком класу Character (не можуть бути створені за допомогою String). Крім того, клас Float-обгортка дозволяє створити об'єкт з використанням подвійного значення. Наприклад, ми можемо створити об'єкт Integer, який обгортає в будь-який з наступних двох способів переривання INT 34:

Integer intObject = new Integer (34);
Integer intObject = new Integer ( "34");

Отримання значення обгорнутого б'єкта класу-оболонки

Кожен з восьми класів-обгорток має метод для вилучення значення, яке було загорнуте в об'єкті. Ці методи мають вигляд *Value( ), де зірка відноситься до відповідного типу даних. Наприклад, щоб отримати значення, що зберігається в Integer об'єкта intObject, ми використовуємо наступне твердження.

int x = intObject.intValue(); 

Крім того, є методи для інших семи класів-оболонок: byteValue ( ), shortValue ( ), longValue ( ), floatValue ( ), doubleValue ( ), charValue ( ), booleanValue ( ).

Autoboxing і autounboxing

Створення об'єкта класу-оболонки за допомогою конструктора і вилучення значень, загорнуті цими об'єктами, використовуючи методи, як показано вище, може стати досить громіздким. В якості альтернативи існує аutoboxing і uutounboxingAutoboxing відноситься до неявного виклику конструктора і автоматичне розпакування відноситься до неявному виклику методу * значення( ).Подивіться на наступний код:
Integer intObject = 34;
int x=intObject;
int x=intObject + 7;

Наведені вище твердження еквівалентні наступному набору операторів
Integer intObject = new Integer (34);
int x = intObject.intValue();
int x = intObject.intValue()+ 7; 

Перетворення між типами даних

Класи-оболонки також надають методи, які можуть бути використані для перетворення рядка в будь-який з примітивних типів даних, за винятком символу. Всі ці методи є статичними. Ці методи мають формат синтаксичного аналізу *( ) , де * відноситься до будь-якого з примітивних типів даних, за винятком char. І перетворювати будь-який з значення примітивного типу даних в рядок, ми використовуємо методи valueOf ( ) класу струнного який через перевантаження методу і неявність може приймати будь-який з восьми примітивних типів.
int x=Integer.parseInt("34"); // x=34
double y=Double.parseDouble("34.7"); // y =34.7
String s1= String.valueOf('a'); // s1="a"
String s2=String.valueOf(true); // s2="true"



.