Galera,
Desculpa pelo tamanho do código, admito que se transformou em um código frankstein rsrsrs. Mas vou tentar ser objetivo na minha dúvida. Basicamente tenho 3 classes, Empresa, Funcionario e Data.
Ao tentar chamar o método preencherData, pelo código abaixo: empresa.dataEntrada.preencherData(10, 3, 2016);
Ocorre erro de java.lang.NullPointerException. Só funcionou depois que defini o empresa.dataEntrada como uma variavel e chamando o construtor Data();
empresa.dataEntrada = new Data();
A minha dúvida é justamente essa. Se o dataEntrada ja é uma variavel do tipo Data dentro da classe empresa, pq tive que chamar o construtor novamente ?
package Exercícios;
class Empresa{
   private String nome;
   int cnpj;
   public Funcionario[] funcionarios;
   private int livre = 0;
   public Data dataEntrada;
   public void statusArray(){
        int simNull = 0;
        int naoNull = 0;
        for(int i = 0; i < this.funcionarios.length; i++){        
            if(this.funcionarios[i].getNome() == null){
               simNull++;
           }else{
               naoNull++;
           }
        }           
        System.out.println("Funcionarios criados: " + naoNull);
        System.out.println("Posições livres: " + simNull);
        System.out.println("Total de Posições: " + this.funcionarios.length);
   }
   public void setArray(int x){
        this.funcionarios = new Funcionario[x];
    }
   public void adiciona(Funcionario f) {
           this.funcionarios[livre] = f;
           livre++;
   }
   public boolean contem(Funcionario f){
           for(int i = 0; i < this.livre; i++){
            if( this.funcionarios[i] == f){
              return true;             
            }
           }
        return false;
        }
   public void novoFuncionario(String nome, int salario){
       this.funcionarios[livre].setDados(nome, salario);
       livre++;
   }
}
class Funcionario{
    private String nome;
    private String departamento;
    double salario;
    private int RG;    
    Data dataDeEntrada;
    private int id;
    private static int identificador = 1;
    public double getSalario(){
        return this.salario;
    }
    public void setDados(String n, int s){
        this.nome = n;
        this.salario = s; 
        this.id = identificador;
        identificador++;
    }
}
class Data{
    int dia;
    int mes;
    int ano;
        public void preencherData(int dia, int mes, int ano){
            if(dia >= 29 && mes == 2){
                this.dia = 29;
                this.mes = 2;
                this.ano = ano;
            }else if(dia >= 31 && (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)){
                this.dia = 31;
                this.mes = mes;
                this.ano = ano;
            }else if(dia >= 30 && (mes == 4 || mes == 6 || mes == 9 || mes == 11)){
                this.dia = 30;
                this.mes = mes;
                this.ano = ano;
            }else{
                this.dia = dia;
                this.mes = mes;
                this.ano = ano;
            }
        }
        String getFormatada() {
        return this.dia + "/" + this.mes + "/" + this.ano;
        }
}
class TestaEmpresa{
    public static void main(String[] args){
        empresa.dataEntrada = new Data();
        empresa.dataEntrada.preencherData(10, 3, 2016);
        System.out.println(empresa.dataEntrada.getFormatada());        
    }
}