In Java ci sono due tipi di base nella JVM . 1) Tipi primitivi e 2) Tipi di riferimento. int è un tipo primitivo e Integer è un tipo di classe (che è un tipo di tipo di riferimento).
I valori primitivi non condividono lo stato con altri valori primitivi. Una variabile il cui tipo è un tipo primitivo contiene sempre un valore primitivo di quel tipo.
int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4
Un oggetto è un'istanza di classe creata dinamicamente o un array. I valori di riferimento (spesso solo riferimenti) sono puntatori a questi oggetti e uno speciale riferimento null, che non fa riferimento a nessun oggetto. Potrebbero esserci molti riferimenti allo stesso oggetto.
Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the
// same object as aNumber
Anche in Java tutto viene passato per valore. Con gli oggetti il valore che viene passato è il riferimento all'oggetto. Quindi un'altra differenza tra int e Integer in Java è come vengono passati nelle chiamate di metodo. Ad esempio in
public int add(int a, int b) {
return a + b;
}
final int two = 2;
int sum = add(1, two);
La variabile due viene passata come tipo intero primitivo 2. Considerando che in
public int add(Integer a, Integer b) {
return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);
La variabile due viene passata come riferimento a un oggetto che contiene il valore intero 2.
@WolfmanDragon: il passaggio per riferimento funzionerebbe in questo modo:
public void increment(int x) {
x = x + 1;
}
int a = 1;
increment(a);
// a is now 2
Quando viene chiamato l'incremento, passa un riferimento (puntatore) alla variabile a . E la funzione di incremento modifica direttamente la variabile a .
E per i tipi di oggetto funzionerebbe come segue:
public void increment(Integer x) {
x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2
Vedi la differenza adesso?