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

Data exibida de forma zuada.

Pessoal alguém sabe me responder porque ao executar a classe de teste, a data exibida na tela saiu zuada: "Data@15db9742".

seguem os código: insira seu código aqui

class Funcionario{

    String nome;
    String departamento;
    double salario;
    Data dataEntrada;
    String rg;

    void recebeAumento(double aumento){
        this.salario = salario + aumento;

    }

    double salarioSemINSS(){
        double salarioBruto = 0;
        salarioBruto = salario;
        return this.salario -= (salarioBruto * 0.08);
    }

    double calculaGanhoAnual(){
        return this.salario * 12;
    }

    void mostra() {

        System.out.println("Nome: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("RG: " + this.rg);
        System.out.println("Data de entrada: "+ this.dataEntrada);
        System.out.println("Salario bruto atual: R$ " + this.salario);
        System.out.println("Salario Liquido: R$ " + this.salarioSemINSS());
        System.out.println("Ganho Anual: R$ " + this.calculaGanhoAnual());
    }
}

class Data {

    int dia;
    int mes;
    int ano;

    void preencheData (int dia, int mes, int ano){

        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }
}

class FuncionarioMain {
    public static void main (String[] args){
        Funcionario funcionario = new Funcionario();



        funcionario.nome =  "Rodrigo";
        funcionario.salario = 900;
        funcionario.recebeAumento(100);
        funcionario.departamento = "TI";
        funcionario.rg = "11223344- SSPDF";

        funcionario.dataEntrada = new Data();
        funcionario.dataEntrada.preencheData(1, 7, 2015);

        funcionario.mostra();    

    }
}

Desde já eu agradeço!

5 respostas
solução!

Olá Rodrigo,

Então, o que tá acontecendo ai é o seguinte: você tem o atributo dataEntrada do funcionário e está armazenando o objeto do tipo Data que você instanciou (funcionario.dataEntrada = new data()) nele. Logo após você preenche esse objeto com as informações necessária para ele (dia, mês e ano), mas quando você pega o resultado dessa variável (dataEntrada) ela te retorna a referência desse objeto (Data@15db9742), porque o que você tem armazenado é um objeto Data e você não está pegando nenhuma informação específica desse objeto. O que você pode fazer ai é o seguinte:

No método mostra() da classe Funcionario:

int dia = this.dataEntrada.dia; //pegamos o valor do atributo dia da data
int mes = this.dataEntrada.mes; //o mesmo para o mês
int ano = this.dataEntrada.ano; //o mesmo para o ano
System.out.println("Data de entrada: "+ dia + "/" + mes + "/" + ano); //formatamos para essa saída

...ou também criar um método dentro da classe Data responsável por retornar uma String com a data já formatada:

String getDataFormatada() {
        return dia + "/" + mes + "/" + ano;
}

...e no método mostra() do funcionário chamar o dataEntrada.getDataFormatada():

System.out.println("Data de entrada: "+ this.dataEntrada.getDataFormatada());

Olá, Rodrigo.

O que acontece é que tu não definiste o modo como uma instância da classe Data deve ser impressa.

O padrão da classe Object — da qual todas as demais herdam — é imprimir uma representação textual do objeto que consiste (1) do nome da classe, (2) do caractere @ e (3) uma representação hexadecimal do hash code do objeto. No caso exposto, o resultado foi Data@15db9742.

O que tu deves fazer, então, é ir à classe Data que tu criaste e sobrescrever (override) o método toString. Caso estejas editando no Eclipse, tu podes digitar toString e apertar ctrl+espaço em seguida; a IDE te sugerirá a realização do override — que nada mais será do que a declaração de um método chamado toString que retorna [obviamente] uma String, com a notação @Override acima da declaração.

Tu podes implementá-lo da seguinte forma:

@Override
public String toString() {
StringBuilder sb = new StringBuilder();

sb.append(this.dia + "/");
sb.append(this.mes + "/");
sb.append(this.ano);

return sb.toString();
}

Espero ter ajudado e que, acima de tudo, tu tenhas entendido o(s) porquê(s).

Obrigado pela ajuda Gabriel e André ! Eu entendi, mas ficou mais uma pergunta. Essa representação textual "Data@15db9742" seria um espécie de referência, um endereço desse objeto na memória?

Olá Rodrigo, ambos, Gabriel e André, estão corretos. Na minha opinião sobreescrever o toString é a melhor solução...

Sobre a representação textual é o hashcode que esta sendo impresso. Que basicamente é a posição em memória deste objeto, ou na tabela hash.

algumas referências que irão te esclarecer melhor:

http://stackoverflow.com/questions/13498179/output-of-system-out-printlnobject

http://blog.caelum.com.br/ensinando-que-e-o-hashcode/

Obrigado Mateus. Vou dar uma lida nos links.