1. Lista tipurilor de ambalaje

Știți că Java are 8 tipuri primitive, care sunt tipuri care nu sunt clase. Pe de o parte, acest lucru este bun - sunt simple și ocupă puțin spațiu. Pe de altă parte, uneori, orele sunt exact ceea ce avem nevoie. Veți afla exact de ce se întâmplă asta în lecția următoare.

Deci ce se poate face?

Începând cu cea de-a cincea versiune de Java, fiecare tip primitiv a câștigat o clasă dublă. Fiecare astfel de clasă stochează un singur câmp cu o valoare de un anumit tip. Aceste clase sunt numite tipuri de wrapper , deoarece încapăsează valorile primitive în clase.

Iată o listă cu aceste tipuri. Stii vreunul?

Tipul primitiv Clasa Wrapper
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

Numele tipurilor primitive încep cu o literă mică, dar numele claselor de wrapper încep cu o literă mare. Unele dintre numele claselor sunt, de asemenea, puțin mai lungi: Integerinstead of intи Characterinstead of char.

Toate obiectele claselor wrapper sunt neschimbabile ( imuabile ).

Codul simplificat pentru Integerclasă arată cam așa:

Cod Notă
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}




Constructor de variabile




Metoda returnează o valoare




Metoda statică creează un nou Integerobiect pentru o intvariabilă

2. Transformarea unui intîn anInteger

Tipurile de wrapper sunt considerate omologi ale fraților lor primitivi: puteți crea cu ușurință un obiect wrapper care corespunde unui tip primitiv.

Să folosim tipul int ca exemplu pentru a analiza modul în care tipurile primitive interacționează cu tipurile lor de wrapper corespunzătoare. Codul pentru conversia de la an intla an Integerși invers ar arăta astfel:

Pentru a converti un intîntr-un Integer, trebuie să scrieți acest cod:

Integer name = new Integer(value);

Unde nameeste numele unei Integervariabile și valueeste valoarea încapsulată int.

Exemple:

Cod Notă
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

Și pentru a converti an Integerîn an int, trebuie să scrieți acest cod:

int name = variable.intValue();

Unde nameeste numele unei intvariabile și variableeste o referință la un Integerobiect.

Exemple:

Cod Notă
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. Autoboxing și unboxing

Dar nici operațiunile simple cu Integertipul nu sunt ușor de scris.

După cum am spus anterior, Integertipul este neschimbabil ( imuabil ). Pentru a crea un Integerobiect cu o nouă intvaloare, trebuie să creați în mod explicit un nou Integerobiect. Acestea fiind spuse, este ușor să obțineți valoarea unui obiect intstocat în interiorul unui Integerobiect - doar apelați intValue()metoda.

Exemplu:

Cod Descriere
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Înfășurare 5într-un Integerobiect
Obțineți valoarea din Integerobiect
Creați un obiect nou Integer(egal cu 10)

Acesta este un cod destul de greoi, nu crezi?

Creatorii Java au crezut așa, așa că au învățat compilatorul cum să facă aceste operațiuni automat. Conversia automată a unui an intîn an Integerse numește autoboxing (introducerea automată a valorii într-o casetă), iar operația inversă (conversia unui an Integerîn an int) se numește unboxing .

Codul tau Ce vede compilatorul
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

Datorită autoboxing și unboxing, puteți atribui în siguranță into Integervariabilă și invers. Puteți scrie expresii de orice complexitate fără a face o distincție între intși Integertipuri.

Exemple:

Cod Ce va genera compilatorul
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. Compararea variabilelor wrapperului

Autoboxing și unboxing sunt procese simple și transparente. Folosim new Integer()instrucțiuni după cum este necesar și numim intValue()metoda după cum este necesar.

Totul funcționează frumos și ușor pentru tine, programatorul. Rețineți că, dacă comparați un Integerși un Integer, atunci comparația se bazează pe referință și nu pe valori.

Cod Ieșire de consolă
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

Variabilele ași bnu stochează intvalori. Ele stochează referințe la obiecte. Aceasta înseamnă că este important să ne amintim cum să le comparăm corect:

Gresit Dreapta
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}