Bună! Sunteți deja bine familiarizat cu tipurile primitive și ați lucrat destul de mult cu ele. În programare (și în special Java), primitivele au multe avantaje: folosesc puțină memorie (și astfel fac programul mai eficient) și au o gamă de valori clar delimitată. Cu toate acestea, în timp ce învățăm Java, deja am repetat adesea mantra „totul în Java este un obiect”. Dar primitivii contrazic direct aceste cuvinte. Nu sunt obiecte. Deci, principiul nostru „totul este un obiect” este fals? De fapt, nu este. În Java, fiecare tip primitiv are un frate geamăn, o clasă wrapper.
Ce este o clasă Wrapper?
Un wrapper este o clasă specială care stochează o primitivă în interior. Dar pentru că este o clasă, puteți crea instanțe ale acesteia. Ele stochează valorile primitive în interior, dar sunt încă obiecte reale. Numele claselor Wrapper sunt foarte asemănătoare cu (sau exact la fel cu) numele primitivelor lor corespunzătoare. Deci, sunt ușor de reținut.
Clase Wrapper pentru tipuri de date primitive |
Tipuri de date primitive |
Clasele Wrapper |
int |
Întreg |
mic de statura |
Mic de statura |
lung |
Lung |
octet |
octet |
pluti |
Pluti |
dubla |
Dubla |
char |
Caracter |
boolean |
boolean |
Obiectele Wrapper sunt create în același mod ca orice alt obiect:
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
Clasele Wrapper ne permit să atenuăm deficiențele tipurilor primitive. Cel mai evident este că primitivii nu au metode. De exemplu, nu au o metodă
toString() , deci nu puteți, de exemplu, converti un
int într-un
String . Dar clasa
Integer wrapper face acest lucru ușor.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
Cu toate acestea, conversia în cealaltă direcție poate fi mai dificilă. Să presupunem că avem un
String , despre care știm sigur că conține un număr. Indiferent, nu există o modalitate nativă de a folosi un
int primitiv pentru a extrage numărul din
șir și a-l converti într-un număr. Dar, putem cu clasele de wrapper.
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
Ieșire:
1166628
Am extras cu succes un număr din
șir și l-am atribuit variabilei de referință
Integer i . Apropo, în ceea ce privește referințele. Știți deja că argumentele sunt transmise metodelor în moduri diferite: primitive după valoare și obiecte prin referință. Puteți folosi aceste cunoștințe atunci când vă creați propriile metode: de exemplu, dacă metoda dvs. folosește numere fracționale, dar aveți nevoie de logică pentru a trece prin referință, puteți transmite metodei argumente
Double /
Float în loc de double /
float . Pe lângă metodele claselor wrapper, câmpurile lor statice pot fi, de asemenea, foarte convenabile. De exemplu, imaginați-vă că aveți următoarea sarcină: afișați maximul posibil
int , urmată de valoarea minimă posibilă. Această problemă pare destul de simplă. Dar fără Google, este puțin probabil să o faci. Dar ambalajele vă permit să vă ocupați cu ușurință de astfel de „sarcini banale”:
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
Aceste câmpuri vă împiedică să vă distrași de la îndeplinirea unor sarcini mai serioase. Ca să nu mai vorbim de faptul că introducerea
2147483647 (care se întâmplă să fie valoarea lui MAX_VALUE) nu este un lucru minor! :) Mai mult, într-o lecție anterioară, am subliniat că obiectele de înveliș sunt imuabile.
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
Ieșire:
0
Starea obiectului indicat inițial de a
nu s-a schimbat (pentru că și valoarea lui
b s-ar fi schimbat). Ca și în cazul
String s, în loc să schimbe starea obiectului wrapper, un obiect complet nou este creat în memorie. Deci, de ce au decis creatorii Java în cele din urmă să lase tipurile primitive în limbaj? Deoarece totul ar trebui să fie un obiect și avem clase de înveliș care pot exprima tot ceea ce exprimă primitivele, de ce să nu păstrăm doar ambalajele în limbaj și să eliminați primitivele? Răspunsul este simplu: performanță. Tipurile primitive sunt numite primitive deoarece le lipsesc multe dintre caracteristicile „gree” ale obiectelor. Da, obiectele au multe metode convenabile, dar nu întotdeauna ai nevoie de ele. Uneori, tot ce ai nevoie este numărul 33, sau 2,62 sau
adevărat /
fals . În situațiile în care avantajele obiectelor nu contează și nu sunt necesare pentru ca programul să funcționeze, primitivele sunt mult mai potrivite sarcinii.
GO TO FULL VERSION