Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Referência de String

No java Strings são objetos.

Quando eu passo tipos primitivos como argumento para uma função, no escopo da função são criadas cópias desses valores.

Entretanto quando eu passo um objeto String como argumento para uma função eu mando uma referência para acessar a String assim como acontece com os outros objetos, não é? Então porque esse código não apresenta a saída esperada:

public class Teste {
    public static void main(String[] args) {
        String s = "nao mudou";
        mudaString(s);
        System.out.println(s);
    }
    private static void mudaString(String s) {
        s = "mudou";
    }
}

A saída é "não mudou"

3 respostas
solução!

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!

Valeu, incrível a explicação, muito obrigado

Que bom que consegui te ajudar Gabriel. Qualquer dúvida só perguntar. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software