[RESOLVIDO] Get e Set para acessar metódos de outra classe

Bom dia moçada!
É o seguinte queria ver se alguém me ajuda a achar o motivo do erro como é um pouco complexo eu vou mostrar partes do código (deixei só o necessário para não ficar com código grande) seguidos de explicação.
Tenho as seguintes classes:

Funcionário (classe abstrata)

[code]
package br.com.minhaEmpresa.empresa.abstrato;

import br.com.minhaEmpresa.empresa.data.Data;

public abstract class Funcionario {
// atributo estático
private static int identificador;
// atributo de ligação com outra classe
protected Data dataEntrada;

// construtor sem argumentos
public Funcionario(){
	Funcionario.identificador = Funcionario.identificador + 1; // adiciona um valor a cada novo funcionario criado
}

// Metódo estático
public static int getIdentificador() {
	return Funcionario.identificador;
}
	
// Get and Set para chamar Get and Set da classe Data
public Data getDataEntrada(){
	return this.dataEntrada;
}

public void setDataEntrada(Data data){
	this.dataEntrada = data;
}[/code]Gerente (extendendo Funcionario)

[code]package br.com.minhaEmpresa.empresa.empregados;

import br.com.minhaEmpresa.empresa.abstrato.Funcionario;

public class Gerente extends Funcionario {
// Os atributos e metódos dessa classe não eram relevantes para explicação
}[/code]Data[code]
package br.com.minhaEmpresa.empresa.data;

public class Data {
private int dia;
private int mes;
private int ano;

public void incluiData(Data referencia, int dia, int mes, int ano) {
	// Cria varíavel guardaData e atribui a referencia
	Data guardaData = new Data();
	guardaData = referencia;
	// Atribui os valores a variável auxiliar guardaData diretamente aos atributos
	guardaData.dia = dia;
	guardaData.mes = mes;
	guardaData.ano = ano;
}

public void mostraData() {
	System.out.println(this.dia + "," + this.mes + "," + this.ano);
}

}[/code]Testa Data [code]package br.com.minhaEmpresa.empresa.teste;

import br.com.minhaEmpresa.empresa.abstrato.Funcionario;
import br.com.minhaEmpresa.empresa.data.Data;
import br.com.minhaEmpresa.empresa.empregados.Gerente;

public class TestaData {
public static void main(String[] args) {

	Funcionario novoEmpregado = new Gerente();
	Data novaDataA = new Data();
	
	novoEmpregado.getDataEntrada().incluiData(novaDataA, 20, 12, 2222);
	novoEmpregado.getDataEntrada().mostraData();
}

}[/code] E aqui acontece um problema o programa não acusa erro mais usando o debug em cima do código: novoEmpregado.getDataEntrada().incluiData(novaDataA, 20, 12, 2222); Aparece o erro:
Exception in thread “main” java.lang.NullPointerException
at br.com.minhaEmpresa.empresa.teste.TestaData.main(TestaData.java:13)

A dúvida seria: Se novoEmpregado faz referência ao objeto Gerente do tipo Funcionario não consegue acessar através da classe Gerente que extende Funcionario o atributo dataEntrada do tipo Data que está como protected através do metódo get e set da classe Funcionario para acessar os metódos da classe Data que é o mostraData. Porque não consigo fazer a inclusão da data?

Vamos por partes.
Vc percebeu que, antes de chamar o getter que vc chama, vc precisa ter instanciado o atributo dataEntrada da classe Funcionario, mesmo que seja na subclasse?

Você está acessando uma referência nula (getDataEntrada). Entendi sua lógica mas não é assim que funciona em Java.

Tente algo como:

gerente.setDataEntrada(Data.novaData(13, 05, 1987))

Sem estas trocas de referência que você está tentando fazer.

[quote]Vc percebeu que, antes de chamar o getter que vc chama, vc precisa ter instanciado o atributo dataEntrada da classe Funcionario, mesmo que seja na subclasse?[/quote]No testaData eu fiz:

Data novaDataA = new Data(); Eu fiz isso na classe Funcionario não sei se foi exatamente isso que você disse:

protected Data dataEntrada = new Data(); Parou o erro só que mostra 0,0,0. [quote] gerente.setDataEntrada(Data.novaData(13, 05, 1987)) [/quote] Isso altera demais a minha classe testaData eu quero fazer direto: novoEmpregado.getDataEntrada().incluiData(novaDataA, 20, 12, 2222); Usando o metodo incluiData.

Para obter o efeito que vc quer, vc precisa fazer da forma que o peerless citou. Isso pq incluiData não mexe na sua classe Funcionario/Gerente, e, portanto, não consegue mudar a referência da variável dataEntrada.

Valeu ajuda mas acabei que consegui resolver eu precisava instanciar a dataEntrada da classe Funcionario mesmo, assim toda vez que um funcionário for criado terá uma nova data para ele e alterei o metódo incluiData que ficou mais simplificado além dê não precisar mais criar objeto data no testaData. Foi falta de atenção mesmo. Flw!

Bom dia a todos.

Não havia outro lugar em que voce poderia instanciar a dataEntrada que não fosse a classe Funcionário.

Agora voce pode invocar o método diretamente como pretendia fazer, sem precisar instanciar a dataEntrada no construtor, bastando tão somente instanciá-la no próprio método getDataentrada(), assim:



          
    // Get and Set para chamar Get and Set da classe Data  
    public Data getDataEntrada() {
        // Aqui voce instancia a dataEntrada se ela estiver nula.
        if (this.dataEntrada == null) this.dataEntrada = new Data();  
        return this.dataEntrada;  
    }  
      
    public void setDataEntrada(Data data){  
        this.dataEntrada = data;  
    }