Em java, a passagem de parâmetros é por valor, independentemente se o que é passado para um método é um objeto ou um tipo primitivo.
Quando você passa um tipo primitivo para um método, você está na verdade passando uma cópia do seu valor:
...
boolean bOut = true;
muda(bOut);
System.out.println(bOut);
...
public void muda(boolean bIn){
bIn = !bIn;
}
o resultado apresentado será true, pois o método muda(boolean bIn) opera sobre uma cópia do valor passado, e não no valor do atributo passado como parâmetro, ou seja, o valor de bOut não é afetado pela mudança em bIn.
Quando você passa um objeto a um método acontece o mesmo. Você está passando na verdade uma cópia do endereço deste objeto na memória.
...
long objOut[] = {1, 2, 3};
muda(objOut);
System.out.println(objOut[0] + objOut[1] + objOut[2] + "");
...
public void muda(long[] objIn){
objIn[1] = 7;
}
como um array é um objeto, quando você passao o array ao método, é passado o endereço do mesmo. Lá dentro do método, a operação ocorre exatamente no objeto array que possui aquele endereço (que nesse ponto possui duas variáveis que apontam para o mesmo endereço, objOut e objIn, logo para o mesmo objeto).
Quando duas variáveis de instância possuem o mesmo endereço, ou seja, apontam para o mesmo objeto, qualquer uma delas pode alterar um valor do objeto. Veja bem, um valor do objeto, não o próprio objeto. O que isso quer dizer?
quer dizer que se no método muda(long[] objIn) a operação fosse essa:
public void muda(long[] objIn){
objIn = new long[]{5, 5, 5};
}
você não teria o objeto objOut alterado para um novo objeto, e sua saída seria 6, pois neste caso o que está sendo feito é atribuir um novo objeto à variável de instância objIn, mas não à variável de instância objOut.
sacou?
ahhh… para exemplificar, me veio a seguinte comparação à mente:
Imagine que você tenha (não me pergunte o por quê) duas pessoas soltando a mesma pipa, ou seja, duas linhas amarradas à mesma pipa.
Se qualquer uma dessas pessoas puxar a pipa para um lado e para o outro, a outra pessoa vai perceber, e vice-versa. Esse seria o caso da mudança no valor, que é percebido pelas duas instâncias.
Agora, se uma das duas, de saco cheio de dividir a mesma pipa, resolve cortar a sua linha e amarrar em outra pipa, a outra pessoa continua com a pipa na linha… enquanto a outra tem sua própria pipa… sacou?
bom, espero ter ajudado a esclarecer!
[]s