Guarda un po 'di codice.
public class Ints {
public static void main(String[] args) {
Integer iW;
for (iW = 1; iW < 4; iW++)
System.out.println(iW);
int i = iW;
iW += 6;
System.out.println(String.format("iW = %d, i = %d", iW , i));
}
}
Questo dovrebbe essere piuttosto familiare. Ma ora, vediamo cosa compila e decompila in:
public class Ints {
public Ints() {
}
public static void main(String[] args) {
Integer iW;
for(iW = Integer.valueOf(1); iW.intValue() < 4; iW = Integer.valueOf(iW.intValue() + 1)) {
System.out.println(iW);
}
int i = iW.intValue();
iW = Integer.valueOf(iW.intValue() + 6);
System.out.println(String.format("iW = %d, i = %d", new Object[]{iW, Integer.valueOf(i)}));
}
}
E lì vedi che succede - la conversione di Integer
in int
e viceversa.
La linea che hai pensato era iW += 6
è in realtà iW = Integer.valueOf(iW.intValue() + 6);
Questo è un processo noto come boxing (che è un tutorial Java di Oracle - piuttosto buona lettura).
Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int
to an Integer
, a double
to a Double
, and so on. If the conversion goes the other way, this is called unboxing.
Questo è fatto dal compilatore per te. Rende il codice più facile da scrivere. E fintanto che non stai facendo le cose non dovresti (come confrontare l'uguaglianza tra interi con ==
che può morderti nel posteriore piuttosto difficile), facendo ciò che vuoi tu.
Se accendi un debugger vedrai questi oggetti creati o richiamati da altre fonti.
Sulla mia macchina, quando iW
è 1, l'oggetto reale è Integer@426
sotto le scene. Quando iW
è 2, l'oggetto effettivo è Integer@432
e così via. Non ho modificato Numero intero @ 426 (valore = 1) quando viene incrementato - piuttosto viene creato un nuovo oggetto che ha un valore superiore.
Ciò che in realtà è immutabile è che non puoi fare iW.setValue(10)
. Questo non funziona. Non è possibile modificare lo stato dell'oggetto a cui punta iW. Con l'autoboxing, puoi modificare rapidamente e facilmente l'oggetto a cui stai puntando, ma l'oggetto sottostante non può essere modificato.
La stringa è immutabile - anche se la funzione abominio di String foo = "foo"; foo += "bar";
funziona (in realtà è più coinvolgente della magia Integer poiché significa allocare un nuovo StringBuilder). Guarda anche BigInteger, Color o InetAddress. Cerca i metodi che ti consentiranno di mutare lo stato dell'oggetto che hai. Questo è ciò che significa immutabile.