"Da udviklere kunne finde på klasser, der beskriver tal, besluttede de at være kreative, ligesom rigtige udviklere."
"Først kom de med en abstrakt talklasse, hvorfra Byte, Short, Integer, Long, Float og Double er afledt. Den har metoder, der hjælper med at konvertere tal til andre numeriske typer."
Metoder i nummerklassen | |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"Godt. Du kan jo ikke skrive dette:"
Long x = 100000;
Integer y = (Integer) x;
"Ja, disse typer er ikke primitiver. Det er derfor, vi bruger metoderne i klassen Number:"
Long x = 100000;
Integer y = x.intValue();
"Men der er stadig et par ting at overveje. Fordi Integer ikke er en int, kan Integer-objekter ikke sammenlignes med den klassiske «==»-operator."
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
"Nøjagtig. På en eller anden måde tænkte jeg ikke på det med det samme."
"Men der er mere."
"Du kortslutter mine kredsløb! Hvad er der ellers?"
"Når vi tildeler en int-værdi til en Integer-variabel, kaldes Integer.valueOf-metoden:"
Kode | Hvad sker der virkelig |
---|---|
|
|
"Ja, det forstod jeg allerede fra eksemplet ovenfor."
"Men funktionen valueOf opretter ikke altid et nyt heltalsobjekt."
"Øh, hvad mener du med "ikke altid"?"
"Den gemmer værdier fra -128 til 127."
Kode | Hvad sker der virkelig | Beskrivelse |
---|---|---|
|
|
Variable x, y og z indeholder referencer til forskellige objekter |
|
|
Variabler x, y og z indeholder referencer til det samme objekt. |
|
|
Variabler z og t indeholder referencer til det samme objekt. |
"Med andre ord, situationen er denne:"
1) Hvis vi skriver «nyt heltal()», så får vi med garanti et nyt objekt.
2) Hvis vi kalder Integer.valueOf(), eksplicit eller gennem autoboxing, kan metoden returnere et nyt objekt eller et cachelagret objekt, hvis talargumentet er i området fra -128 til 127.
"Hvad er så forfærdeligt ved metoden, der returnerer et objekt fra cachen?"
"Lige meget om det. Du skal bare vide, at nogle gange, når du ikke forventer det, kan objekter være ligeværdige. Alt med lighed er kompliceret. Hvis vi sammenligner en primitiv med en ikke-primitiv, så sammenlignes de som primitiver:"
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)
"Fantastisk... Og hvordan skal jeg lære alt dette udenad?"
"Du behøver ikke at huske dette. Du skal bare forstå, hvordan det hele er organiseret, og hvad der rent faktisk sker, når en primitiv og dens ikke-primitive modstykke kommer i spil."
"Jeg anbefaler også, at du ser på Integer-klassens metoder. Den har en del gode og brugbare metoder. Du har endda brugt en af dem ret ofte."
"Ja, det kan jeg huske. Integer.parseInt();"