"Siden utviklere kunne komme opp med klasser som beskriver tall, bestemte de seg for å være kreative, som ekte utviklere."
"Først kom de opp med en abstrakt tallklasse, som Byte, Short, Integer, Long, Float og Double er avledet fra. Den har metoder som hjelper til med å konvertere tall til andre numeriske typer."
Metoder for nummerklassen | |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"Riktig. Tross alt kan du ikke skrive dette:"
Long x = 100000;
Integer y = (Integer) x;
"Ja, disse typene er ikke primitive. Det er derfor vi bruker metodene til Number-klassen:"
Long x = 100000;
Integer y = x.intValue();
"Men det er fortsatt et par ting å vurdere. Fordi Integer ikke er en int, kan ikke Integer-objekter sammenlignes med den klassiske «==»-operatoren."
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
"Akkurat. På en eller annen måte tenkte jeg ikke på det med en gang."
"Men det er mer."
"Du kortslutter kretsene mine! Hva mer er det?"
"Når vi tilordner en int-verdi til en Integer-variabel, kalles Integer.valueOf-metoden:"
Kode | Hva skjer egentlig |
---|---|
|
|
"Ja, jeg forsto det allerede fra eksempelet ovenfor."
"Men valueOf-funksjonen lager ikke alltid et nytt heltallsobjekt."
"Øh, hva mener du med «ikke alltid»?"
"Den lagrer verdier fra -128 til 127."
Kode | Hva skjer egentlig | Beskrivelse |
---|---|---|
|
|
Variable x, y og z inneholder referanser til forskjellige objekter |
|
|
Variablene x, y og z inneholder referanser til det samme objektet. |
|
|
Variablene z og t inneholder referanser til samme objekt. |
"Med andre ord, situasjonen er denne:"
1) Hvis vi skriver «new Integer()», så får vi garantert et nytt objekt.
2) Hvis vi kaller Integer.valueOf(), eksplisitt eller gjennom autoboksing, kan metoden returnere et nytt objekt eller et bufret objekt hvis tallargumentet er i området fra -128 til 127.
"Hva er så forferdelig med metoden som returnerer et objekt fra hurtigbufferen?"
"Glem det. Du trenger bare å vite at noen ganger, når du ikke forventer det, kan objekter være like. Alt med likhet er komplisert. 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)
"Flott... Og hvordan skal jeg lære alt dette utenat?"
"Du trenger ikke å lære dette utenat. Du trenger bare å forstå hvordan alt er organisert og hva som faktisk skjer når en primitiv og dens ikke-primitive motpart kommer inn i bildet."
"Jeg anbefaler også at du ser på metodene til Integer-klassen. Den har ganske mange gode og nyttige metoder. Du har til og med brukt en av dem ganske ofte."
"Ja, jeg husker. Integer.parseInt();"
GO TO FULL VERSION