Por definição em java todos os parâmetros são passados por valor, ou seja, o valor do objeto é enviado e não a referência de memória deste objeto.
Em parte isso condiz com a realidade. Peguemos o exemplo abaixo:
Em seu código existe uma classe chamada Mensalidade e dentro da classe Mensalidade você possui atributos para manter os dados da mensalidade, por exemplo: valor, inicio, término, etc.
Em outra classe você possui um método que recebe como parâmetro um objeto do tipo Mensalidade, algo do tipo:
public void calculaMensalidade(Mensalidade mensalidade)
Até ai estamos entendidos correto? nada demais até aqui. Bom, esse objeto mensalidade nada mais é que uma cópia do objeto mensalidade que foi enviado, exemplo:
Mensalidade mensalidade = new Mensalidade();
minhaClasse.calculaMensalidade(mensalidade);
Esse objeto que foi passado é apenas uma cópia do objeto mensalidade, como disse no início, java não passa parâmetro por referência apenas por valor, então o que chega na outra classe é o valor daquele objeto, uma cópia dele e isso significa que se este objeto for alterado não irá refletir no objeto principal, correto? Não… não necessariamente…
As varíaveis dos objetos e a referência dos objetos são alocadas na Stack (pilha) enquanto os objetos são alocados na Heap da JVM. Sabemos que em java não temos acesso direto a memória, ficando a cargo da JVM tal acesso.
Quando estamos trabalhando com tipos primitivos (int, long, boolean, etc) e este é passado como parâmetro, qualquer alteração feita dentro do método não irá refletir externamente. Quando trabalhamos com objetos a JVM acessa através da cópia da referência deste objeto que existe na JVM, então se alterarmos um atributo deste objeto dentro do método o mesmo irá refletir externamente. Exemplo:
=======================================================================
Mensalidade mensalidade = new Mensalidade();
mensalidade.setValor(200);
System.out.println(“Valor Antes “+mensalidade.getValor());
minhaClasse.calculaMensalidade(mensalidade);
System.out.println(“Valor Depois”+mensalidade.getValor());
int valor = 200;
System.out.println(“Valor Antes “+valor);
minhaCasse.calculaMensalidade(vaor);
System.out.println(“Valor Depois “+valor);
=======================================================================
public void calculaMensalidade(mensalidade){
mensalidade.setValor(300);
}
public void calculaMensalidade(int valor){
valor = 300;
}
=======================================================================
Note que no primeiro exemplo o valor foi alterado pois o que foi passado como parâmetro foi o valor da referência de memória daquele objeto (referência na HEAP) enquanto que o segundo não foi alterado pois as variáveis primitivas e tipos imutáveis não sofrem alterações.
Entendidos?
Abraços!!!!