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

Dúvida no Ex. 6 da Aula 3 - Começando com Orientação a objetos

`Por favor professores, o que estou errado no código abaixo? Já fiz e refiz várias vezes mas a data não aparece, ela vem sempre assim:

Henrique Fontenelle
Departamento atual:CCO
Salário atual:150.0
1610607
1800.0
Data@677327b6


Flávia Lúcia
Departamento atual:GAB
Salário atual:400.0
1395198
4800.0
Data@14ae5a5

DIFERENTES

Vejam que a data está "Data@14ae5a5", não sei mais o que fazer. Ajudem-me a identificar o erro. O Código está abaixo.

class Funcionario {
    String nome;
    String departamento;
    double salario;
    long rg;

    //Inclui data de entrada
    Data dataEntrada;


    void recebeAumento(double aumento) {
        // o que fazer aqui dentro?
        this.salario += aumento;
    }

    double calculaGanhoAnual() {
        // o que fazer aqui dentro?
        return this.salario * 12;
    }

    void mostra(){
        System.out.println("");
        System.out.println(this.nome);
        System.out.println("Departamento atual:" + this.departamento);
        System.out.println("Salário atual:" + this.salario);
        System.out.println(this.rg);
        System.out.println(this.calculaGanhoAnual());
        System.out.println(this.dataEntrada);
        System.out.println("");
    }
}


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

        f1.dataEntrada = new Data();

        f1.dataEntrada.dia = 04;
        f1.dataEntrada.mes = 05;
        f1.dataEntrada.ano = 1994;
        f1.mostra();

        f1.nome = "Henrique Fontenelle";
        f1.departamento = "CCO";
        f1.salario = 100.0;
        f1.rg = 1610607;
        f1.recebeAumento(50);


        Funcionario f2 = new Funcionario();

        f2.dataEntrada = new Data();

        f2.dataEntrada.dia = 04;
        f2.dataEntrada.mes = 05;
        f2.dataEntrada.ano = 1994;
        f2.mostra();

        f2.nome = "Flávia Lúcia";
        f2.departamento = "GAB";
        f2.salario = 300.0;
        f2.rg = 1395198;
        f2.recebeAumento(100);


        f1.mostra();
        f2.mostra();

        if (f1 == f2) {
            System.out.println("IGUAIS");
            System.out.println("");
        } else {
            System.out.println("DIFERENTES");
            System.out.println("");
        }
    }    
}

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;
            }

            public String dataFormatada(){

            return this.dia+"/"+this.mes+"/"+this.ano; 

            }

            //depois chame ele no metodo mostra()



            void mostra(){
                    System.out.println("Data de entrada: " + this.dia + "/" + this.mes + "/" + this.ano);
            }
}


`
11 respostas

Olá Henrique! Veja, o problema é que o atributo dataDeEntrada da sua classe Funcionário é um objeto. E todas as vezes que utilizamos System.out.println() para imprimir um objeto, automaticamente é chamado o método toString e esse método retorna uma String que por padrão dos Objetos é a referencia para o objeto na memória. Você verá mais sobre isso com o avançar do curso, então não se preocupe se não entendeu agora. Ok?

O que você deve fazer para imprimir a data corretamente é utilizar o método que você já fez que devolve um String com a Data no formato certo. Ou seja, ao invés de você por no método mostra()da classe funcionário o seguinte:

System.out.println(this.dataEntrada);

O correto seria você por:

System.out.println(this.dataEntrada.dataFormatada());

Espero que tenha ajudado. Seu código tem algumas coisas desnecessárias mas não vou me aprofundar nisso, pois não é necessário para tirar essa sua dúvida e não se preocupe com isso que conforme você for estudando e tirando as dúvidas você vai aprender muita coisa. Bons Estudos!

Bom dia Professor, muito obrigado pela velocidade com que me respondeu. Estou tendo algumas dificuldades nesta fase do curso. Fiz como me sugeriu, mas ainda me retorna um erro, veja abaixo:

Funcionario.java:103: error: cannot find symbol
                    System.out.println(this.dataEntrada.dataFormatada());
                                           ^
  symbol: variable dataEntrada
1 error

O Código modificado como sugeriu está abaixo:

class Funcionario {
    String nome;
    String departamento;
    double salario;
    long rg;

    //Inclui data de entrada
    Data dataEntrada;


    void recebeAumento(double aumento) {
        // o que fazer aqui dentro?
        this.salario += aumento;
    }

    double calculaGanhoAnual() {
        // o que fazer aqui dentro?
        return this.salario * 12;
    }

    void mostra(){
        System.out.println("");
        System.out.println(this.nome);
        System.out.println("Departamento atual:" + this.departamento);
        System.out.println("Salário atual:" + this.salario);
        System.out.println(this.rg);
        System.out.println(this.calculaGanhoAnual());
        System.out.println(this.dataEntrada);
        System.out.println("");
    }
}


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

        f1.dataEntrada = new Data();

        f1.dataEntrada.dia = 04;
        f1.dataEntrada.mes = 05;
        f1.dataEntrada.ano = 1994;
        f1.mostra();

        f1.nome = "Henrique Fontenelle";
        f1.departamento = "CCO";
        f1.salario = 100.0;
        f1.rg = 1610607;
        f1.recebeAumento(50);


        Funcionario f2 = new Funcionario();

        f2.dataEntrada = new Data();

        f2.dataEntrada.dia = 04;
        f2.dataEntrada.mes = 05;
        f2.dataEntrada.ano = 1994;
        f2.mostra();

        f2.nome = "Flávia Lúcia";
        f2.departamento = "GAB";
        f2.salario = 300.0;
        f2.rg = 1395198;
        f2.recebeAumento(100);


        f1.mostra();
        f2.mostra();

        if (f1 == f2) {
            System.out.println("IGUAIS");
            System.out.println("");
        } else {
            System.out.println("DIFERENTES");
            System.out.println("");
        }
    }    
}

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;
            }

            public String dataFormatada(){

            return this.dia+"/"+this.mes+"/"+this.ano; 

            }

            //depois chame ele no metodo mostra()
            void mostra(){
                    System.out.println(this.dataEntrada.dataFormatada());
            }
}

Olá Henrique! Você alterou o método mostra() errado. Você deve alterar o método mostra da sua classe Funcionário e não o da classe Data. Altere o método mostra() da sua classe Funcionario. Altere a seguinte linha:

System.out.println(this.dataEntrada);

Para:

System.out.println(this.dataEntrada.dataFormatada());

Se você quiser que seu método mostra() da classe Data volte a funcionar troque a linha que você alterou errada para a anterior:

System.out.println("Data de entrada: " + this.dia + "/" + this.mes + "/" + this.ano);

Mas se você quiser apagar o método mostra() da sua classe Data acho mais viável, pois ele é desnecessário.

Percebi que você é novato e apenas corrigindo um mal entendido, eu não sou professor do Alura, mas não tem problema. Aqui no fórum de dúvidas, qualquer aluno pode ajudar com suas dúvidas e etc. Eu, como você, sou um aluno do Alura, no entanto sou mais avançado. Então, eu vi sua dúvida no fórum e resolvi te ajudar. Se você quiser também poderá fazer isso com outras pessoas. É sempre bom ajudar. Então, Bons Estudos! Qualquer dúvida só perguntar.

Caramba.... Deu certo... Uhuuuu... Senhores, meu sonho é aprender esta linguagem, reconheço que tenho algumas dificuldades e cada exercício para mim é uma vitória pessoal. Muito obrigado! Exercício resolvido abaixo. Só foi possível com sua ajuda Romário, muito obrigado professor.

class Funcionario {
    String nome;
    String departamento;
    double salario;
    long rg;

    //Inclui data de entrada
    Data dataEntrada;


    void recebeAumento(double aumento) {
        // o que fazer aqui dentro?
        this.salario += aumento;
    }

    double calculaGanhoAnual() {
        // o que fazer aqui dentro?
        return this.salario * 12;
    }

    void mostra(){
        System.out.println("");
        System.out.println(this.nome);
        System.out.println("Departamento atual:" + this.departamento);
        System.out.println("Salário atual:" + this.salario);
        System.out.println("O RG do Funcionário é:" + this.rg);
        System.out.println("O Ganho Anual em salário é:" + this.calculaGanhoAnual());
        System.out.println("A data de entrada é:" + this.dataEntrada.dataFormatada());
        System.out.println("");
    }
}


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

        f1.dataEntrada = new Data();

        f1.dataEntrada.dia = 04;
        f1.dataEntrada.mes = 05;
        f1.dataEntrada.ano = 1994;
        f1.mostra();

        f1.nome = "Henrique Fontenelle";
        f1.departamento = "CCO";
        f1.salario = 100.0;
        f1.rg = 1610607;
        f1.recebeAumento(50);


        Funcionario f2 = new Funcionario();

        f2.dataEntrada = new Data();

        f2.dataEntrada.dia = 04;
        f2.dataEntrada.mes = 05;
        f2.dataEntrada.ano = 1994;
        f2.mostra();

        f2.nome = "Flávia Lúcia";
        f2.departamento = "GAB";
        f2.salario = 300.0;
        f2.rg = 1395198;
        f2.recebeAumento(100);


        f1.mostra();
        f2.mostra();

        if (f1 == f2) {
            System.out.println("IGUAIS");
            System.out.println("");
        } else {
            System.out.println("DIFERENTES");
            System.out.println("");
        }
    }    
}

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;
            }

            public String dataFormatada(){

            return this.dia+"/"+this.mes+"/"+this.ano; 

            }


}

Por nada Henrique! Que bom que você conseguiu. Continue se esforçando que a linguagem java é realmente incrível. Apenas lembre-se de fechar o tópico. Bons Estudos! Qualquer dúvida só perguntar.

Estava com o mesmo problema de imprimir a referencia da variável dataDeEntrada, porém resolvi diferente da solução apresentada acima.

class funcionario { String nome; double salario; Data dataDeEntrada; int RG;

void mostra(){ System.out.println("nome: " + this.nome); System.out.println("salario: " + this.salario); System.out.println("data de entrada: " + this.dataDeEntrada.dataCompleta); / alterei essa linha tb / System.out.println("RG: " + this.RG); }

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

void calculaGanhoAnual(double multiplica){ double salAnual = this.salario * multiplica; System.out.println("O salario anual e: " + salAnual); }

}

class Data { int dia; int mes; int ano; String dataCompleta; / adicionei esta variável /

void preencheData (int dia, int mes, int ano){ this.dia = dia; this.mes = mes; this.ano = ano; this.dataCompleta = dia+"/"+mes+"/"+ano; } }

Olá Leandro, sim da forma que você fez também consegue o mesmo resultado. No entanto perceba que o código fica um pouco sem semântica. Veja só, você criou uma classe data que terá Objetos e esses objetos terão como caracteristicas / atributos : dia, mês, ano e dataCompleta. Faz sentido isso?

Quando você olha uma Data quais características você ver que ela possui?

Voce ve que ela possui Dia, Mês e Ano e não DataCompleta. Por isso, por uma questão de semântica não é muito bom fazer dessa forma.

É melhor você por como um comportamento, um método de seu Objeto Data ele poder te passar a forma como ela deve ser lida e etc. Lembre-se que um dos pontos de POO (Programação Orientada a Objetos) é a capacidade de representação do sistema muito mais perto do que veríamos no mundo real.

Por isso eu pus em um método e não em um atributo da classe. Mas dessa forma você também chega ao mesmo resultado. Bons Estudos!

Entendi, muito obrigado!

só vim para tirar um dúvida e com alguém já teve a mesma, só fui lendo e esclarecendo a minha.

Vlw Romário, Craque!

solução!

Que bom Sidney! Obrigado! Bons Estudos!

Era exatamente minha dúvida obrigado!