Herança

8 respostas
edymrex

Eu mesmo fiz o diagrama da foto para treinar mesmo o conceito de herança
a codificação está logo abaixo:

package com.br.funcionario;

public class Funcionario 
{
	private String nome;
	private String cpf;
	private  String dataNascimento;
	private double salario;
	private boolean funcao;
	private int qtdeDiretor;
	private int qtdeOp;
	private Diretor diretor;
	private Operario operario;
	
	
	public Funcionario(String nome,String cpf,String dataNascimento,double salario,boolean funcao)
	{
		 this.nome=nome;
		 this.cpf=cpf;
		 this.dataNascimento=dataNascimento;
		 this.setFuncionarioCategoria(funcao);
	}
	
	public Funcionario()
	{
		
	}

	
	public String getFuncionario()
	{
		return this.toString();
	}
	
	public int getQuantidadeDiretores()
	{
		return this.qtdeDiretor;
	}
	
	public int getQuantidadeOperarios()
	{
		return this.qtdeOp;
	}
	
	public void setFuncionarioCategoria(boolean funcao)
	{
		
		if(funcao)
		{
			double salario=10.000;
			salario=(salario==10.000)?salario+=5000:salario;
		    diretor = new Diretor(salario,"Criar relátorios mensais");
			this.qtdeDiretor++;
		}
		else
		{
			double salario=2.000;
			salario=(salario==10.000)?salario+=1000:salario;
		    operario= new Operario(salario,"cortar madeira");
			this.qtdeOp++;
		}
	}
	
	
	
	
	
	public String toString()
	{
		return this.nome+"  "+this.cpf+"  "+this.dataNascimento+this.diretor.getDiretor();
	}
	

}
package com.br.funcionario;

public class Diretor extends Funcionario
{

	 private String tarefas;
	 private double salario;
	 
	 
	 public Diretor(double salario,String tarefas)
	 {
		 this.salario=salario;
		 this.tarefas=tarefas;
	 }
	 
	 public String getDiretor()
	 {
		 return super.getFuncionario()+"   "+this.tarefas+"   "+this.salario;
	 }
	 
	 public void setDiretor(String tarefas,double salario)
	 {
		 this.salario=salario;
		 this.tarefas=tarefas;
	 }

}
package com.br.funcionario;

public class Operario extends Funcionario 
{
	 private String tarefas;
	 private double salario;
	 
	 
	 public Operario(double salario,String tarefas)
	 {
		 this.salario=salario;
		 this.tarefas=tarefas;
	 }
	 
	 public String getOperario()
	 {
		 return super.getFuncionario()+"   "+this.tarefas+"   "+this.salario;
	 }
	 
	 public void setOperario(String tarefas,double salario)
	 {
		 this.salario=salario;
		 this.tarefas=tarefas;
	 }

}
package com.br.funcionario;

public class TestaFuncionario 
{

	
	public static void main(String args[])
	{
		Funcionario chama = new Funcionario("Flavio","[telefone removido]","26/12/1900",1522,true);
		
		System.out.println(chama.getFuncionario());
		
		
	}
	 
}

estou tentando chamar o método
getFuncionario() mais não estou conseguindo alguém pode me ajudar…?
o erro que o eclipse me indica é nesta linha:
return this.nome+" “+this.cpf+” "+this.dataNascimento+this.diretor.getDiretor();
neste caso deveria dar certo pois eu já instanciei um objeto da classe
Diretor é ele não está mais apontando para null já tem a referência
do objeto na memória, mais o eclipse me acusa um erro NullPointerException mas não sei porque.


8 Respostas

A

Qual o erro que dá??

edymrex

NullPointerException não sei porque

veja que na chamada do construtor da classe

Funcionario chama = new Funcionario("Flavio","[telefone removido]","26/12/1900",1522,true);

eu posso o parâmetro função como true neste caso ele é um diretor caso contrario
ele é um operario a função que faz isso é:

public void setFuncionarioCategoria(boolean funcao)
	{
		
		if(funcao)
		{
			double salario=10.000;
			salario=(salario==10.000)?salario+=5000:salario;
		    diretor = new Diretor(salario,"Criar relátorios mensais");
			this.qtdeDiretor++;
		}
		else
		{
			double salario=2.000;
			salario=(salario==10.000)?salario+=1000:salario;
		    operario= new Operario(salario,"cortar madeira");
			this.qtdeOp++;
		}
	}

como é true eu instanciei um objeto da classe Diretor:
diretor = new Diretor(salario,“Criar relátorios mensais”);
dai quando eu vo invocar um método dessa classe está um exceção:
NullPointerException

diego2005

Mas onde você está chamando setFuncionarioCategoria para instanciar o Diretor que eu não estou vendo??

T+

edymrex

no construtor da classe:

public Funcionario(String nome,String cpf,String dataNascimento,double salario,boolean funcao)
 	{
 		 this.nome=nome;
 		 this.cpf=cpf;
 		 this.dataNascimento=dataNascimento;
 		 this.setFuncionarioCategoria(funcao);
 	}

this.setFuncionarioCategoria(funcao);

leonardo.nvm

Uma pergunta pq vc no metodo toString da classe funcionario chama o getDiretor() … ate ai blz… so q dentro desse método vc chama super.getFuncionario()… o seu erro este estar nesse ponto… deixa eu mostrar os passos…

  1. vc cria um funcionario
    Funcionario chama = new Funcionario(“Flavio”,“[telefone removido]”,“26/12/1900”,1522,true);

  2. chama o metodo getFuncionario();

  3. no metodo getFuncionario() eh chamado o método getDiretor();

  4. no método getDiretor(); vc chama novamente o getFuncionario().

  5. novamente no metodo getFuncionario(). vc chama this.diretor.getDiretor(); … aqui eh o seu problema esse director esta nulo… pois é uma outra instancia nao e a instancia que vc cirou no passo 1.

Solução.

no metodo getDiretor() tira a chamada super.getFuncionario(); que deve funcionar…

nao sei se fui claro qualquer coisa me pergunta denovo

king_of_gods
Faz isso aqui na classe funcionário:

public String toString()

{

return this.nome+"  “+this.cpf+”  "+this.dataNascimento

}

Na Classe Diretor você faz:
public String toString(){ super.toString() + this.get…
}

Assim vai funcionar eu acho. Mais você está pecando feio em herança meu caro. Não é assim herança não.

edymrex

Ainda estou estudando herança já vi que essa classe minha tah toda errada vou fazer novamente, tenho uma dúvida e deve ser por isso tb que estava com erro, normalmente quando se usa herança se instancia a classe pai ou a classe
filha? O que eu percebi que a classe pai e mais generica e a classe filha e mais especifica dai é melhor instanciar o classe filha uma vez que ele herda os atributos e métodos do pai é isso mesmo galera se eu estiver errado me corrigem.

leonardo.nvm

Isso instancie a classe filha, mas lembre-se de que no construtor dela vc de chamar o construtor da classe pai passando seus paramentros… vc nao pode usar o construtor so com os atributos da classe filha tem q ser com todos…

Criado 7 de agosto de 2007
Ultima resposta 7 de ago. de 2007
Respostas 8
Participantes 5