„Deoarece dezvoltatorii puteau veni cu clase care descriu numerele, au decis să fie creativi, ca dezvoltatorii adevărați.”
„În primul rând, au venit cu o clasă abstractă Number, din care sunt derivate Byte, Short, Integer, Long, Float și Double. Are metode care ajută la convertirea numerelor în alte tipuri numerice.”
Metode din clasa Number | |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"Corect. La urma urmei, nu poți scrie asta:"
Long x = 100000;
Integer y = (Integer) x;
"Da, aceste tipuri nu sunt primitive. De aceea folosim metodele clasei Number:"
Long x = 100000;
Integer y = x.intValue();
„Dar mai sunt câteva lucruri de luat în considerare. Deoarece Integer nu este un int, obiectele Integer nu pot fi comparate cu operatorul clasic «==».”
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
— Exact. Cumva nu m-am gândit la asta imediat.
— Dar mai sunt.
"Îmi scurtcircuitați circuitele! Ce altceva mai este?"
„Când atribuim o valoare int unei variabile Integer, metoda Integer.valueOf este numită:”
Cod | Ce se întâmplă cu adevărat |
---|---|
|
|
„Da, am înțeles deja asta din exemplul de mai sus”.
„Dar, funcția valueOf nu creează întotdeauna un nou obiect Integer.”
„Uh, ce vrei să spui „nu întotdeauna”?”
„Mechează în cache valori de la -128 la 127.”
Cod | Ce se întâmplă cu adevărat | Descriere |
---|---|---|
|
|
Variabilele x, y și z conțin referințe la diferite obiecte |
|
|
Variabilele x, y și z conțin referințe la același obiect. |
|
|
Variabilele z și t conțin referințe la același obiect. |
„Cu alte cuvinte, situația este următoarea:”
1) Dacă scriem „new Integer()”, atunci suntem garantați că vom obține un nou obiect.
2) Dacă apelăm Integer.valueOf(), în mod explicit sau prin autoboxing, atunci metoda poate returna un obiect nou sau un obiect în cache dacă argumentul număr este în intervalul de la -128 la 127.
"Ce este atât de groaznic la metoda de returnare a unui obiect din cache?"
"Nu contează. Trebuie doar să știi că uneori, atunci când nu te aștepți, obiectele ar putea fi egale. Totul cu egalitate este complicat. Dacă comparăm un primitiv cu un non-primitiv, atunci ele sunt comparate ca primitive:"
int x = 300;
Integer y = 300;
Integer z = 300;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
int x = 100;
Integer y = 100;
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
int x = 100;
Integer y = new Integer(100);
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)
— Grozav... Și cum voi reține toate astea?
„Nu trebuie să memorezi asta. Trebuie doar să înțelegi cum este organizat totul și ce se întâmplă de fapt atunci când un primitiv și omologul său non-primitiv intră în joc”.
"De asemenea, vă recomand să vă uitați la metodele clasei Integer. Are destul de multe metode bune și utile. Chiar ați folosit una dintre ele destul de des."
"Da, îmi amintesc. Integer.parseInt();"
GO TO FULL VERSION