Solucionado (ver solução)
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?