Problemas com herança

7 respostas
d3monz

Amigos, é o seguinte: Tô o dia todo pra tentar fazer esse programa rodar e nada no mundo me faz acertar essa bagaça. O programa é bem simples e consiste em ir pegando os dados fornecidos pelo usuário para o cadastro de professores de uma determinada instituição de ensino, até que o número 99 seja digitado. Tô usando 1 superclasse e, por enquanto 1 subclasse.

Segue o código:

SUPER

import java.util.Scanner;

abstract class Funcionario {

    Scanner scan = new Scanner (System.in);
    protected String nome, end;
    protected int mat;


    public void entraDados () {

        while (nome !="99") {

        System.out.println("");

        System.out.println("Digite o nome do funcionário:");
        nome = scan.nextLine();

        System.out.println("Digite o endereço do funcionário:");
        end = scan.nextLine();

        System.out.println("Digite a matrícula do funcionário:");
        mat = scan.nextInt();

        System.out.println("");

        }

 }

    public String getEnd() {
        return end;
    }

    public int getMat() {
        return mat;
    }

    public String getNome() {
        return nome;
    }


    public void mostraDados() {

    System.out.println("");
    System.out.println("O nome do funcionário é:" +getNome());
    System.out.println("");
    System.out.println("O endereço é:" +getEnd());
    System.out.println("");
    System.out.println("A matrícula é: "+getMat());
    

   }


}

SUBCLASSE

import java.util.Scanner;

public class Medio extends Funcionario{

    Scanner scan = new Scanner (System.in);

    private int aulas;
    private float valorHora,salProf;


    @Override
    public void entraDados() {
        super.entraDados();

        System.out.println("Digite a quantidade de horas de aula:");
        aulas = scan.nextInt();

        System.out.println("Digite o valor da hora aula:");
        valorHora = scan.nextFloat();

    }


    public float salProf() {

        salProf = aulas*valorHora;
        
        return salProf;
        
        }

    public float getValorHora() {
        return valorHora;
    }
    

    @Override
    public void mostraDados() {
        super.mostraDados();
        System.out.println("O valor da hora é: "+getValorHora());
        System.out.println("O salário do prof. é: " +salProf);

    }


}

E A MAIN:

public class TesteFuncionario {

    Funcionario [] p = new Funcionario[10];


        for (int i = 0; i < p.length; i++) {

        p[i] = new Medio();

    p[i].entraDados();
    
    p[i].getNome();
    p[i].getEnd();
    p[i].getMat();
    p[i].salProf();
    
    p[i].mostraDados();

    i= i+1;


       }

    }

}

Quando eu executo isso aí, só os métodos de input de dados rodam e, assim mesmo, somente 2 vezes e com erro na última vez. O que eu to fazendo de errado, afinal?

7 Respostas

muriloazs

Bom dia d3monz!

A principio, entendi a o objetivo do programa, mas não entendi o por que da condição do while ser nome != "99".

Primeiramente, vejamos a classe funcionário. Você não deve misturar os métodos de entrada e saída de dados com os atributos do funcionário.

Nessa classe funcionário, deverá existir apenas os métodos Set e Get.

A sua subclasse segue a mesma idéia, ela deverá herdar os atributos de funcionário e conter os métodos set e get. Correto?

Feito isso, os métodos de entrada e saida de dados deverão ser colocados na classe de uso específico do seu programa.

Ficaria mais ou menos assim:

abstract class Funcionario {

	private String nome, end;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEnd() {
		return end;
	}

	public void setEnd(String end) {
		this.end = end;
	}

	public int getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	protected int mat;

}
public class Medio extends Funcionario {

	private int aulas;

	public int getAulas() {
		return aulas;
	}

	public void setAulas(int aulas) {
		this.aulas = aulas;
	}

	public float getValorHora() {
		return valorHora;
	}

	public void setValorHora(float valorHora) {
		this.valorHora = valorHora;
	}

	public float getSalProf() {
		return salProf;
	}

	public void setSalProf(float salProf) {
		this.salProf = salProf;
	}

	private float valorHora, salProf;

}

e finalmente a classe principal

public class TesteFuncionario {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

                            // Veja que instânciei a classe médio, por que o objetivo é herdar os atributos da classe funcionário
		Medio[] m = new Medio[10];

		
		//métodos de input de dados;
		
		/* obs importante:
		 * na hora de guardar os dados que recebeu, voce irá usar os métodos Set para guardar os valores.
		 */
		
		for(int i=0;i<m.length;i++){			
			
			System.out.println(m[i].getNome()+","+m[i].getEnd()+","+m[i].getMat()+","+m[i].getSalProf()+","+m[i].getValorHora());
		}
		

	}
}
Outra coisa importantissima, na hora de fazer um laço usando o for:
for(int i=0;i<m.length;i++){		
			
			System.out.println(m[i].getNome()+","+m[i].getEnd()+","+m[i].getMat()+","+m[i].getSalProf()+","+m[i].getValorHora());
                                          // i = i+1; Isso não deve ser usado, pois o incremento  está sendo feito na declaração do laço.
		}

Por isso, sempre lembre de separar bem a função de cada classe, seu programa fica mais organizado e até mais fácil de escrever! :D

Abraço!

I

Ola d3monz, identifiquei 2 falhas não tao graves mas que faram o resultado do seu programa divergir do resultado esperado. são elas

nome !="99"

para comparar strings em JAVA você precisa user o método equals. portanto

nome.equals("99");

isso vai retornar um bool e caso você queira que não seja igual utilize o operador !

no seu MAIN quando voce faz esse for

for (int i = 0; i < p.length; i++) {   
  
        p[i] = new Medio();   
  
    p[i].entraDados();   
       
    p[i].getNome();   
    p[i].getEnd();   
    p[i].getMat();   
    p[i].salProf();   
       
    p[i].mostraDados();   
  
    i= i+1;   
  
  
       }   
  
    }

na linha de declaração do for a variável i já é incrementada e não precisa da ultima linha do for

for (int i = 0; i < p.length; [b][color=red]i++) [/color][/b]
i=i+1;

OK? tente atualizar esses pontos e ver como ficou. Realmente não olhei a fundo a logica de herança so bati o olho e vi esses erros…
espero ter ajudado!

d3monz

Valeu pelas dicas ai, mas ainda me ficaram duas dúvidas básicas:

1 - Eu preciso usar scanner pro input dos dados. Onde eu colocaria um método com scanner pra isso, então?

2 - Eu sei que eu posso criar uma matriz declarando o supertipo e povoá-la com seus respectivos subtipos. Queria fazer isso porque depois vou criar uma outra subclasse. Como eu faria isso?

muriloazs

d3monz:
Valeu pelas dicas ai, mas ainda me ficaram duas dúvidas básicas:

1 - Eu preciso usar scanner pro input dos dados. Onde eu colocaria um método com scanner pra isso, então?

2 - Eu sei que eu posso criar uma matriz declarando o supertipo e povoá-la com seus respectivos subtipos. Queria fazer isso porque depois vou criar uma outra subclasse. Como eu faria isso?

Faça esses métodos na classe que é usada especificamente no seu programa, no caso TesteFuncionario. Por que eu digo isso?

Imagine que você tenha um sistema maior, que tenha vários formulários e tudo mais, você irá reutilizar a classe funcionário para guardar os dados do funcionário e não precisará dos métodos de input de dados, já que é uma atividade específica do programa.

Não entendi direito a 2ª dúvida.

O fato é que se você criar um array de Funcionario, ele não terá os atributos de Medio, creio que esse seja o objetivo. E se você pretende criar outra subclasse, não há problema algum, ela também poderá herdar atributos e métodos assim como fez com Medio.

d3monz

Beleza, vou tentar aqui. Agora a minha dúvida é quanto ao teste lógico da repetição da entrada de dados, porque, como falei, o programa vai parar de ser executado quando o nome for igual a 99. Tô tentando fazer aqui com equals, mas tá dando erro de referência nula, segue o código da classe main:

public class TesteFuncionario {

    
    public static void main(String[] args) {


    int i = 0;

    Medio [] p = new Medio[10];

      while (p[i].getNome().equals("99")) {

       p[i] = new Medio();

       p[i].entraDados();
    
       p[i].getNome();
   
       p[i].salProf();
    
       p[i].mostraDados();

        i++;
    
            }
        
    }

}

Não tô conseguindo acertar isso de jeito nenhum...

d3monz

Mais uma vez obrigado a todos pelas dicas, mas já resolvi meu problema aqui de todas as formas.

B

Os métodos nextInt, nextFloat, nextXXX do Scanner tem problemas com o System.in. Usando somente o nextLine, com um Integer.parseInt para transformar em inteiro, deve resolver.

Criado 19 de abril de 2010
Ultima resposta 22 de abr. de 2010
Respostas 7
Participantes 4