Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
18
respostas

Dúvida

Olá, não consegui entender muito bem essa última parte do código da data..

class TestaFuncionario {
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario();
        f1.nome = "Hugo";
        f1.salario = 100;
        f1.recebeAumento(50);

        // adicionando a data como tipo
        f1.dataDeEntrada = new Data();
        f1.dataDeEntrada.preencheData(1, 7, 2009);

        f1.mostra();
    }
}
18 respostas

Ele criou um novo objeto Data e o botou em f1.dataDeEntrada. Depois disso, chamou o método preencheData e passou os atributos 1, 7 e 2009, que presumimos ser 1 de Julho de 2009.

Olá Taina! É como o Lucas mencionou. Se você repara em sua classe Funcionario, verá que existe uma tributo do tipo Data. No entanto perceba que a variável encontra-se vazia com o valor null, pois a ela não foi atribuido o valor de nenhuma instancia de um objeto tipo Data.

Dessa forma esse trecho do código que você mostrou está preenchendo os dados de um funcionario. No entanto, como disse anteriormente, o atributo Data de um funcionário encontra-se vazio, sem nenhuma instancia, então primeiramente temos que instanciar um objeto Data e atribuir seu valor ao atributo do objeto Funcionario. Isso é feito na primeira linha do código:

f1.dataDeEntrada = new Data();

Porém perceba que da mesma forma que um objeto Funcionario, o objeto Data também possui atributos em sua classe que são dia, mes e ano. Assim, é necessário preencher tais atributos, para isso foi utilizado um método da classe Data que permite que preenchamos tais valores. Então isso foi feito na segunda linha:

f1.dataDeEntrada.preencheData(1, 7, 2009);

Depois simplesmente foi chamado o método mostra() para que seja mostrado todas as informações do funcionario.

Espero ter ajudado! Bons estudos!

obrigada! mas romario por que não f1.Data = new Data() ao invés do dataEeEntrada?

Data é o tipo do atributo dataDeEntrada de Funcionario, não o seu nome.

Imagine a situação em que Funcionario possui dois atributos do tipo Data, um chamado dataDeEntrada e outro chamado dataDeNascimento. Se nós usássemos a forma f1.Data = new Data(), teríamos uma ambiguidade, já que possuímos dois atributos do tipo Data. Por isso, a chamada de um atributo é feita pelo seu nome, para evitar possíveis ambiguidades, além de facilitar no entendimento do código.

Isso é válido para todos os atributos, seja ele int, double, data, etc.

mas se o dataDeEntrada está dentro da classe funcionario? que ja tem new Funcionario.. assim como o nome completo, salario, idade.. que eu não precisei colocar new e eles estão todos dentro de Funcionario, por que então new Data se o atributo ja se encontra dentro da classe Funcionario?

Olá Tainá! Creio que a explicação seja a seguinte: Data é um objeto, uma instância de uma classe (que neste caso foi criada por você) portanto para inserir uma nova data você precisa invocar o construtor do objeto Data. Isto independe de você ter criado um objeto Funcionário, pois você havia chamado o construtor de Funcionário para tal, que não faz nenhuma referência ao construtor de Data.

Caso na declaração do construtor de funcionário, você tivesse chamado o construtor de Data e atribuído à variável dataDeEntrada, então não seria necessária essa linha de new na main, você poderia chamar direto o método preencheData.

Para os outros atributos de Funcionário isso não é necessário pois eles são de tipos primitivos do Java: int, double, etc.

vinícius, data está como classe e objeto?

solução!

Taina tudo bem?

Pense que a classe é como um projeto de uma casa, por mais completo que ele esteja, você não consegue interagir com ele, é preciso ter uma instância deste projeto, ou seja, uma casa. No caso da sua classe Data, você precisa instância-la para ter acesso a seus atributos e métodos e um lugar reservado na memória para guardar essas informação.

obrigada! mas sabe o exemplo do new Funcionario? Funcionario taina = new Funcionario(); por que nao aconteceu o mesmo com a classe Data? pois no caso instanciamos ela pelo nome do atributo.. por que isso e nao por exemplo como o do Funcionario?

eu tenho que pegar ele a partir da classe funcionario? o atributo no caso para instanciar

Você pode fazer isso com o tipo Data também, sem problemas. Mas nesse caso, você já definiu no tipo Funcionário que o atributo dataDeEntrada é do tipo Data. Então, você não precisa declará-lo novamente, apenas atribuir o valor.

Exemplo: vamos supor que você queria criar uma variável inteira. Isto é feito em duas etapas.

Declaração: int minhaVariavel;
Atribuição: minhaVariavel = 2;

Muitas vezes fazemos declaração e atribuição juntas, de forma que temos:

int minhaVariavel = 2;

A partir daí se você quer atribuir um novo valor à sua variável você não precisa declarar novamente o tipo dela, certo? Por exemplo:

minhaVariavel = 4;

Agora o valor da variável é 4. O caso do tipo Data é mais ou menos o mesmo. Vc já fez a declaração da variável dentro da classe Funcionário, quando você escreveu algo do tipo:

protected Data dataDeEntrada;

Dessa forma, o programa já sabe que o atributo dataDeEntrada é do tipo Data. Então, quando vc for chamar o construtor para então atribuir um valor a variável dataDeEntrada, você só precisa do nome dela que no caso é f1.dataDeEntrada. A linha:

f1.dataDeEntrada = new Data();

Equivale a:

minhaVariavel = 2;

Ficou grande, mas espero ter ajudado.

Ah entendi, mas e aquela outra parte, porque chamamos no caso f1.datadeentrada.preenchedata?

Porque agora você tem um objeto do tipo Data, mas ainda não preencheu os atributos dele. Utilizando o exemplo do Filipe, é como se você tivesse construido a casa, mas ela ainda está vazia. Agora você precisa colocar os móveis (no caso da Data, precisa passar o dia, mês e ano). A maneira de fazer isso você definiu quando criou a classe Data, no caso foi a partir do método preencheData. Então, chamamos o método preencheData a partir do objeto que acabamos de criar f1.dataDeEntrada passando para ele o dia, mês e ano q ele precisa gravar lá. O endereço completo fica f1.dataDeEntrada.preencheData que você pode ler como: Chame o método preencheData para o objeto dataDeEntrada que pertence ao funcionário f1.

eu achava que dataDeEntrada era atributo de Data, la na classe funcionario!

no caso tem que ter o f1 ? ao inves do datadeentrada.preenchedata.. o f1 seria para especificar que é o funcionario f1?

Exato taina. No caso do f1.datadeentrada.preenchedata, você está invocando o método "preenchedata" do objeto que está sendo referenciado pelo atributo "datadeentrada" que se encontra dentro do objeto referenciado por f1.

obrigada a voces. como posso praticar mais isso?