Olá Gabriel, isto está ocorrendo porque você esta trabalhando com duas variáveis diferentes, que em um momento referenciam um mesmo objeto. Para você entender mais facilmente vou mudar o nome das variáveis para s1
e s2
Veja só:
public class Teste {
public static void main(String[] args) {
String s1 = "nao mudou";
mudaString(s1);
System.out.println(s1);
}
private static void mudaString(String s2) {
s2 = "mudou";
}
}
Primeiramente perceba que estamos tratando de duas variáveis locais, onde elas só existem no escopo de seus métodos.
Então, você declarou a variável s1
e atribuiu a ela a referencia ao objeto String "nao mudou"
String s1 = "nao mudou";
Logo em seguida você a passou como argumento do método mudaString()
.
E como você mesmo disse corretamente no tópico, ao fazermos isso estamos passando a referencia ao objeto. Assim, você passou a referencia a String (ou Objeto) "não mudou", para uma nova variável que apenas existe no escopo do método mudaString()
, a variável s2
.
Perceba o que temos agora duas variáveis referenciando um mesmo objeto, no entanto, cada variável existe apenas no escopo de seu método. Veja que as duas variáveis "apontam" para o mesmo objeto.
s2 ---> "nao mudou" <--- s1
No entanto, você atribuiu para a variável s2 uma nova referencia, a referencia do objeto "mudou".
s2 = "mudou";
Ficando agora duas variáveis "apontando" para objetos diferentes:
s1 ---> "nao mudou"
s2 ---> "mudou"
Então quando você faz o System.out.println(s1);
Ele irá imprimir na tela a String que ele está referenciando, ou seja, "não mudou".
Alem disso, como eu disse no inicio, são duas variáveis locais, logo a variável s2 apenas existe no escopo do método mudaString()
. Terminando o método, esta variável deixa de existir, não existindo uma referencia para o objeto "mudou" fora do método mudaString()
Para seu código funcionar corretamente o certo seria o código ficar da seguinte forma:
public class Teste {
public static void main(String[] args) {
String s1 = "nao mudou";
s1 = mudaString(s1);
System.out.println(s1);
}
private static String mudaString(String s2) {
s2 = "mudou";
return s2;
}
}
Perceba que desta forma o método mudaString()
retorna a referencia ao objeto "mudou" e eu atribuo essa referencia a variável s1.
OBS: Vale ressaltar que apenas fiz esse modelo abaixo para tornar mais fácil sua compreensão, uma vez que fora do escopo de seu método a variável s1 deixa de existir, então não haveria duas variáveis referenciando um mesmo objeto. Apenas usei isso para facilitar sua compreensão.
s2 ---> "nao mudou" <--- s1
Espero ter ajudado! Bons Estudos!