A passagem de objetos é SIM feita por referência.
renzonuccitelli:
public class Mito {
public void alterarCobaiaCriandoNova(Cobaia cobaia){
cobaia=new Cobaia(0);
}
public void alterarCobaiaPassandoReferencia(Cobaia cobaia){
Cobaia c=new Cobaia(0);
cobaia=c;
}
public void alterarCobaiaUsandoMetodo(Cobaia cobaia){
cobaia.setId(0);
}
}
public class MitoTeste {
/**
* @param args
*/
public static void main(String[] args) {
Cobaia cobaia=new Cobaia(1);
Mito mito=new Mito();
mito.alterarCobaiaCriandoNova(cobaia);
System.out.println(cobaia.getId());
mito.alterarCobaiaPassandoReferencia(cobaia);
System.out.println(cobaia.getId());
mito.alterarCobaiaUsandoMetodo(cobaia);
System.out.println(cobaia.getId());
}
}
No seu método main você criou um objeto Cobaia e o atribuiu a variável cobaia, ou seja, a variável cobaia agora aponta para o endereço do objeto que você acabou de criar.
Quando você chama um método e passa um objeto como parâmetro, você passa o endereço dele para o método. Então quando você chamou o método alterarCobaiaCriandoNova, a sua variavel cobaia (na assinatura do método) recebeu o endereço do objeto que você havia criado no metodo main. Então agora você tem duas variáveis apontando para o mesmo objeto, a do método main e aquela do seu método alterarCobaiaCriandoNova.
Caso você faça alguma alteração NO OBJETO (acessando diretamente os atributos ou usando métodos de acesso), você verá que não importa qual variável você use para imprimir o valor, ambas irão mostrar o mesmo valor. Agora, quando você criar um novo objeto, e atribuí-lo a uma variável, você só mudou o endereço para onde aquela variável apontava, e não sobrescreveu o objeto que era apontado pela variável. Então, se antes as duas variáveis apontavam para o mesmo objeto, agora uma irá apontar para um e a outra para o outro.
Um exemplo real de como isso funcionaria:
1) Pense que o seu dedo é uma variável, que pode apontar para qualquer coisa (seria como um "Object dedo;")
2) Agora aponte para uma tomada (Atribuimos um objeto para a variavel dedo, no java seria um "dedo = new Tomada();")
3) Agora pegue o dedo do seu amigo e aponte para a mesma tomada ("Object dedoAmigo = dedo;")
4) Agora, pinte você a tomada de branco ("dedo.setColor(Color.WHITE);")
5) Veja, a tomada para a qual você e seu amigo estão apontando agora é branca!
6) Agora mande seu amigo pintá-la de vermelho ("dedoAmigo.setColor(Color.RED);")
7) E agora, vocês dois estão apontando para uma tomada vermelha.
8) Para completar a simulação, você agora aponte para uma outra tomada ("dedo = new Tomada();")
9) Agora pinte a tomada que você está apontando de azul ("dedo.setColor(Color.BLUE);")
Repare, seu amigo continua a apontar aquela antiga tomada, que está vermelha, e você agora aponta uma tomada azul. Vocês deixaram de possuir a mesma referencia quando você criou uma nova tomada para você (no passo 8).
Entendeu o que aconteceu no seu programa de teste? A partir do momento que você criou novos objetos, você perdeu a antiga referencia, que tinha sido criada no metodo main, então a variável do seu método main continuou apontando para a variável antiga, e não a que você criou nos métodos.
E é assim que funciona a passagem por referência. Espero ter sido claro ;)