Arquivo

Textos com Etiquetas ‘ponteiro’

O toString() e a referência de objetos.

28, fevereiro, 2009

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. =)

Vanio Meurer Java SE , , ,