Ciao! Per quanto riguarda i tipi primitivi il passaggio di parametri avviene per valore: questo significa che le modifiche al parametro non saranno visibili al di fuori del metodo.
Ad esempio se hai un metodo:
public void incrementa(int x) {
x++;
}
e fai queste operazioni:
int a = 0;
incrementa(a);
System.out.println(a);
Allora avrai che la variabile "a" continuerà a valere 0 sia prima che dopo il metodo, mentre all'interno del metodo "incrementa" la variabile "x" all'inizio avrà valore 0, poi verrà incrementata e, con la fine del metodo, smetterà di esistere.
Con le variabili di tipo "complesso" cioè Object e tutte le possibili sottoclassi (ovvero tutti i possibili oggetti) il passaggio avverrà per riferimento. In particolare se hai la classe:
public class Intero {
public int a;
public Intero(int x) {
a = x;
}
}
il metodo:
public void incrementa(Intero x) {
x.a++;
}
ed esegui il seguente codice
Intero x = new Intero(0);
incrementa(x);
System.out.println(x.getValore);
allora ciò che ti verrà stampato sarà 1, poiché l'oggetto viene passato per riferimento e quindi viene effettivamente modificato.
Nota che se il tuo metodo è questo:
public void incrementa(Intero x) {
x = new Intero(2);
}
allora ciò che subisce la modifica è solo la variabile "x", che è locale al metodo e quindi ha una vita limitata al solo metodo; in sostanza la modifica non si ripercuoterebbe sull'oggetto di partenza