Problema com toString

Estou com dificuldade no uso do toString() e criei uma classe Usuario com dois atributos, String nome e SimpleDateFormat dataNasc, fiz o método toString() e ele só funcionou para o atributo nome, para a data ele imprime a referência apenas. segue abaixo o código e a saída no console, exemplo:

import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Principal {

	public static void main(String[] args) {
		
		Usuario felipe = new Usuario();

		Scanner scan = new Scanner(System.in);
		
		System.out.println("Informe a data no formato: dd/mm/aaaa");
		SimpleDateFormat data = new SimpleDateFormat(scan.nextLine());
		felipe.setDataNasc(data);
		
		System.out.println("Informe o nome:");
		felipe.setNome(scan.nextLine());
		
		System.out.println("RESULTADO:");
		System.out.println(felipe);
		
		scan.close();

	}

}
---------------------------------------------

import java.text.SimpleDateFormat;

public class Usuario {
	
	private String nome;
	private SimpleDateFormat dataNasc;

	public Usuario() {
		
	}
	
	public Usuario(String nome, SimpleDateFormat data) {
		this.nome = nome;
		this.dataNasc = data;
	}
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public SimpleDateFormat getDataNasc() {
		return dataNasc;
	}

	public void setDataNasc(SimpleDateFormat dataNasc) {
		this.dataNasc = dataNasc;
	}
	
	@Override
	public String toString() {
		return "Nome: " + this.nome + ", data de nascimento: " + this.dataNasc;
	}
	
}

Saída (Console)


Informe a data no formato: dd/mm/aaaa
21/03/1984
Informe o nome:
Felipe
RESULTADO:
Nome: Felipe, data de nascimento: java.text.SimpleDateFormat@6ea84be0

O que está acontecendo é que sua referencia de data não está encontrando um padrão para ser impresso. O que você precisa alterar é fácil:

@Override
public String toString() {
	return "Nome: " + this.nome + ", data de nascimento: " + this.dataNasc.toPattern();
}

O resultado é:

Informe a data no formato: dd/mm/aaaa
21/03/1984
Informe o nome:
Felipe
RESULTADO:
Nome: Felipe, data de nascimento: 21/03/1984

Process finished with exit code 0

Como você não está definindo uma padrão, ele usa o default (que, coincidentemente, é o que você quer): dd/mm/aaaa.

[]'s

1 curtida

Obrigado amigo!

1 curtida

Por nada. Espero que possa te auxiliar com os estudos. Por que, como desafio adicional, não tenta criar seu próprio pattern? É aconselhavel. :slight_smile:

Boa. Estou colocando a mão na massa.

A data de nascimento deveria ser do tipo Date.
A classe SimpleDateFormat serve apenas para formatar e parsear objetos Date.

1 curtida

Eu entendi dessa forma então:

package projeto1;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Principal {

	public static void main(String[] args) {
		
		Endereco endereco = new Endereco();
		
		@SuppressWarnings("deprecation")
		Date data = new Date("1984/03/21");
		
		Usuario felipe = new Usuario("Felipe", data, endereco);
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		
		
		System.out.println("Resultado:\n" + felipe + ".");
		System.out.println(felipe.getEndereco());
		System.out.println(sdf.format(felipe.getDataNasc()));

	}}