Java/Concetti fondamentali
< Java
Passaggio per valore o per riferimento
modifica- Nota: Questa sezione è destinata a coloro che provengono da altri linguaggi di programmazione, come il C.
- Q: In Java, gli oggetti vengono passati ai metodi per valore o per riferimento? E i valori dei tipi base?
- A:
- In Java, il passaggio degli argomenti avviene sempre per valore.
- Tuttavia, in Java gli oggetti non vengono mai passati come argomento; invece, vengono sempre passati i loro reference.
Quindi, non ha senso chiedere come vengano passati gli oggetti, perché gli oggetti non vengono mai passati.
Esempio. Data la classe InteroMutabile così definita:
final class InteroMutabile {
private int _valore;
public InteroMutabile(int valore) { _valore = valore; }
public int getValue() { return _valore; }
public void setValue(int valore) { _valore = valore; }
private boolean _marcato = false;
public void marcatura() { _marcato = true; }
public boolean marcato() { return _marcato; }
}
questo codice
class A {
private static void incrementa(InteroMutabile v) {
v.marcatura();
v = new InteroMutabile( v.getValue() + 1 );
}
private static void incrementa(int v) {
v = v + 1;
}
public static void main(String[] args) {
int numero = 0;
InteroMutabile obj = new InteroMutabile(0);
incrementa(numero);
incrementa(obj);
System.out.println(numero);
System.out.println(obj.getValue());
System.out.println(obj.marcato());
}
}
stampa a video il seguente output:
0
0
true
perché
- ciascuno dei due metodi
incrementa()
riceve sempre una copia del valore passato (che sia un valore di tipo int o un reference ad un oggetto), quindi l'assegnazionev = ...
opera sempre su una variabile locale e non ha effetto sul metodo chiamante main(); - tuttavia, nel caso di
incrementa(InteroMutabile)
, le due copie del reference (quella che è nella variabileobj
delmain()
e quella che è inizialmente nella variabilev
diincrementa()
) "puntano" allo stesso oggetto. Di conseguenza, il metodomarcatura()
invocato daincrementa()
tramite il reference che è nella variabilev
opera sullo (e, quindi, modifica lo) stesso oggetto "puntato" dal reference contenuto nella variabileobj
del metodomain()
. Dopo l'assegnazionev = new InteroMutabile( v.getValue() + 1 );
la variabile localev
contiene un reference diverso, che punta ad un oggetto diverso, quindiSystem.out.println(obj.getValue())
stampa a video il valore del primo oggetto interoMutabile, che è ancora0
.
Note
modifica