Lembre-se que parâmetros sempre são passados como valor, nunca como referência, até mesmo as referências são passadas como valor, se tiver ficado confuso, vou fazer uma analogia, em algumas linguagens, como C existem dois tipos de passagem de parâmetros, por valor e por referência, portanto em C é possível fazer algo assim:
[code]void metodo(int a) {
a = 2;
}
int b = 0;
metodo(b);[/code]
Após a execução desse método o valor da variável b será 0, pois o parâmetro foi passado como valor, ou seja, uma cópia da variável b, não uma referência para a variável b, portanto ao alterar o valor do parâmetro, a variável original não é alterada.
[code]void metodo(int *a) {
*a = 2;
}
int b = 0;
metodo(&b);[/code]
Após a execução desse método o valor da variável b será 2, pois o parâmetro foi passado como referência, ou seja, foi passada a referência para a variável original, e portanto ao alterar o seu valor, a variável original também será alterada.
Porém, em Java não existe passagem de parâmetros por referência, todos os parâmetros são passados como valor, até mesmo as referências, ou seja, ao passar uma variável de objeto como parâmetro, o que será passado é uma cópia da referência ao objeto, não uma referência à variável original.
Ex.:
[code]
void metodo(String m) {
m = “Alterado”;
}
String msg = “Inicial”;
metodo(msg);[/code]
Ao executar esse código existe um objeto String e duas referências para ele, a referência msg, e uma cópia dela chamada m, não adianta alterar m que essa mudança não se reflete em msg, pois são duas variáveis diferentes, o que pode confundir é que se o OBJETO referenciado por elas for alterado, aí sim a mudança se reflete, pois são duas referências para o mesmo objeto. Que é o que acontece com o StringBuffer:
[code]void metodo(StringBuffer m){
m.append(“Alterado”);
}
StringBuffer msg = new StringBuffer(“Inicial”);
metodo(msg);[/code]
Nesse caso haverá uma alteração, porem não no valor da variável mas sim no objeto referenciado por elas.
No caso abaixo por exemplo, não será alterado:
[code]void metodo(StringBuffer m){
m = new StringBuffer(“Alterado”);
}
StringBuffer msg = new StringBuffer(“Inicial”);
metodo(msg);[/code]
E como já foi dito, String é um objeto imutável, portanto, não há como alterar o objeto referenciado pela variável original.
Espero que não tenha ficado muito confuso, se tiver ficado é só falar. :roll: