[RESOLVIDO] Esclarecimento sobre ação realizada ao "igualar" objetos

PEssoal, executando o código abaixo:

    public static void main(String[] args) {
        Item item = new Item();
        Item item2 = new Item();
        
        String st1 = new String();
        String st2 = new String();
        
        item.setProp("testeAbc");
        item2.setProp("teste2");
        item = item2;
        item.setProp("alterado");
        
        System.out.println(item.getProp() + " " + item2.getProp());
        
        st1 = "teste";
        st2 = "teste2";
        
        st2 = st1;
        
        st2 = "teste3";
        
        System.out.println(st1 + " " + st2);
    }

É obtida a seguinte saída:

alterado alterado teste teste3

Andei pesquisando e vi que ao “igualar” os objetos o java não faz uma cópia do mesmo, apenas associa a referencia de memória, fazendo com que os dois objetos passassem a ser um só, porque ao alterar um o outro é alterado, como visto na execução.

Minha dúvida é por quê nas Strings isso não ocorre, ou seja, os objetos continuam apontando para referências diferentes de memória.

Obrigado.

É exatamente a mesma coisa! Você precisa observar apenas que cada literal String como “Oi mundo” ou “String em Java” é um objeto. Sendo assim, ao fazer a atribuição

String str1 = new String();
str1 = "teste";

você está apontando str1 para um novo objeto, ao invés de definir o valor interno da String criada com new na 1a linha.

[quote=rmendes08]É exatamente a mesma coisa! Você precisa observar apenas que cada literal String como “Oi mundo” ou “String em Java” é um objeto. Sendo assim, ao fazer a atribuição

String str1 = new String();
str1 = "teste";

você está apontando str1 para um novo objeto, ao invés de definir o valor interno da String criada com new na 1a linha. [/quote]

Certo, apenas para eu entender bem entao (não consigo testar agora o código, mas testarei mais tarde).

Se ao invés de String eu estivesse usando StringBuilder, com append e setLength o resultado seria o mesmo obtido nos objetos do tipo Item, ou seja, os dois objetos apontando para a mesma referência, certo?

Obrigado pela resposta.

[quote=jks1903][quote=rmendes08]É exatamente a mesma coisa! Você precisa observar apenas que cada literal String como “Oi mundo” ou “String em Java” é um objeto. Sendo assim, ao fazer a atribuição

String str1 = new String();
str1 = "teste";

você está apontando str1 para um novo objeto, ao invés de definir o valor interno da String criada com new na 1a linha. [/quote]

Certo, apenas para eu entender bem entao (não consigo testar agora o código, mas testarei mais tarde).

Se ao invés de String eu estivesse usando StringBuilder, com append e setLength o resultado seria o mesmo obtido nos objetos do tipo Item, ou seja, os dois objetos apontando para a mesma referência, certo?

Obrigado pela resposta.[/quote]

Sim. Assim que puder, faça muitos testes e brinque bastante com estes conceitos. Além de serem importante no dia-a-dia, uma prova de certificação cobra muito esse conteúdo.

[quote=rmendes08][quote=jks1903][quote=rmendes08]É exatamente a mesma coisa! Você precisa observar apenas que cada literal String como “Oi mundo” ou “String em Java” é um objeto. Sendo assim, ao fazer a atribuição

String str1 = new String();
str1 = "teste";

você está apontando str1 para um novo objeto, ao invés de definir o valor interno da String criada com new na 1a linha. [/quote]

Certo, apenas para eu entender bem entao (não consigo testar agora o código, mas testarei mais tarde).

Se ao invés de String eu estivesse usando StringBuilder, com append e setLength o resultado seria o mesmo obtido nos objetos do tipo Item, ou seja, os dois objetos apontando para a mesma referência, certo?

Obrigado pela resposta.[/quote]

Isso aí mesmo, fiz os testes e foi conforme o previsto.

Obrigado pela ajuda, foi bem esclarcedor.

Sim. Assim que puder, faça muitos testes e brinque bastante com estes conceitos. Além de serem importante no dia-a-dia, uma prova de certificação cobra muito esse conteúdo.[/quote]