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.