Em java, a passagem de parâmetros é por cópia do valor. A referência de um objeto não é passada como parâmetro, mas sim uma cópia desta referência. No caso dos tipos primitivos, uma cópia do seu valor é passada. Deste modo, se eu passo a cópia de uma referência para um método e, neste método, faço com que esta referência aponte para outro objeto, a referência original continuará apontando para o objeto anterior. Exemplo:
public class Referencia{
public int x;
public static void main(String args []){
Referencia r = new Referencia();
r.x=8;
r.setNewRef(r);
System.out.println(r.x);
}
public void setNewRef(Referencia r){
r = new Referencia();
r.x=10;
}
}
O resultado impresso será 8. O fato de ter mudado a referência de r em
setNewRef() não altera em nada a referência de r em
main(). Pois o r de
setNewRef() eh uma cópia de r em
Main().