O toString() e a referência de objetos.
Hoje vou escrever sobre uma das maiores confusões que iniciantes e não iniciantes da linguagem Java escutam e/ou falam.
Vamos falar sobre o toString() não implementado retornar o valor real da referência a objetos (também chamado de ponteiro).
O método toString() realmente retorna o valor da referência?
Não! Isso é mito, lenda, lorota!
Então o que seriam aqueles códigos (Pessoa@1231343) que ele imprimi?
É simples, é a classe + @ + retorno do método hashCode().
Vamos aos exemplos:
package br.com.vaniomeurer.blog.mito; public class Exemplo { public static void main(String[] args) { Exemplo ex1 = new Exemplo(); Exemplo ex2 = new Exemplo(); // Lembre-se que o código abaixo chamará o método toString() do objeto. System.out.println(ex1); System.out.println(ex2); } }
Saída (algo parecido com isso):
br.com.vaniomeurer.blog.mito.Exemplo@3e25a5
br.com.vaniomeurer.blog.mito.Exemplo@19821f
Vendo assim realmente parece que pode ser o valor da referência mesmo, mas vamos sobrescrever o método hashCode() para ver o que acontece.
package br.com.vaniomeurer.blog.mito; public class Exemplo { public static void main(String[] args) { Exemplo ex1 = new Exemplo(); Exemplo ex2 = new Exemplo(); System.out.println(ex1); System.out.println(ex2); } // Sobrescrevendo o método hashCode() de uma maneira bem feia. @Override public int hashCode() { return 1; } }
E a saída vai ser:
br.com.vaniomeurer.blog.mito.Exemplo@1
br.com.vaniomeurer.blog.mito.Exemplo@1
Podemos ver claramente que existem dois objetos diferentes, logo duas referências, mas mesmo assim a saída foi igual graças ao hashCode().
Bom é isso. =)