Herança

3 respostas
S

Estou começando em java agora e estava estudando herança e polimorfismo. Pelo que eu entendi, sendo a classe PassaroImportado filha da classe Passaro, eu poderia declarar um objeto do tipo PassaroImportado dessa forma:

Passaro p = new PassaroImportado();

afinal, todo PassaroImportado é um Passaro, então fui tentar implementar um codigo que usa dessa propriedade e tive uma certa dificuldade, pois do jeito que o código esta abaixo, ele roda perfeitamente, retornado o que eu quero retorne, porem se eu declaro da forma:

EmpregadoDaFaculdade p = new ProfessorDaFaculdade();

o código não compila, pois da erro na hora de chamar o método setHora(diz que não existe esse meétodo na classe mãe)...

gostaria que alguem me ajudasse com essa duvida dizendo o pq q quando eu declaro o objeto dessa forma
EmpregadoDaFaculdade p = new ProfessorDaFaculdade(); e não funciona, obrigado.

segue abaixo o codigo:
class EmpregadoDaFaculdade {
    private String nome;
    private double salario;

    void setSalario(double salario) {
        this.salario = salario;
    }

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

    double getGastos() {
        return this.salario;
    }

    String getInfo() {
        return "nome: " + this.nome + ", salario: " + this.salario;
    }

}

class ProfessorDaFaculdade extends EmpregadoDaFaculdade {
    private int horasDeAula;

    void setHora(int hora) {
        this.horasDeAula = hora;
    }

    int getHora() {
        return this.horasDeAula;
    }

    double getGastos() {
        return super.getGastos() + this.horasDeAula * 10;
    }

    String getInfo() {
        String info = super.getInfo();
        String informacao = info + ", horas de aula: " + this.horasDeAula;
        return informacao;
    }

}

class Relatorio {
    void relata(EmpregadoDaFaculdade f) {
        System.out.println(f.getInfo());
    }
}

class Main {
    public static void main(String[] args) {
        EmpregadoDaFaculdade e = new EmpregadoDaFaculdade();
        e.setNome("Empregado");
        e.setSalario(1000);
        Relatorio r = new Relatorio();
        r.relata(e);
        System.out.println("-----------");
        ProfessorDaFaculdade p = new ProfessorDaFaculdade();
        p.setNome("Professor");
        p.setSalario(10000);
        p.setHora(10);
        r.relata(p);
    }
}

3 Respostas

1112

Sim, o método setHora não existe na classe mãe.

Nesse caso,você deve usar um cast. Ficaria assim:

EmpregadoDaFaculdade p = new ProfessorDaFaculdade(); p.setNome("Professor"); p.setSalario(10000); ((ProfessorDaFaculdade)p).setHora(10); r.relata(p);

Nesse link você pode saber mais sobre polimorfismo.

S

Mas pelo que eu entendi, se p faz referencia a um objeto do tipo ProfessorDaFaculdade, não deveria dar esse erro, pois é na classe ProfessorDaFaculdade que o método getHora() esta implementado!

eu sei que estou errado, pq o código não compila dessa forma, mas eu não entendi o que esta errado!

obrigado pela ajuda!

1112

Você se referencia ao p como um EmpregadoDaFaculdade. Sem o cast, o programa não tem como saber que o empregado é professor, pois poderia haver uma outra classe, FaxineiroDaFaculdade, que também implementa EmpregadoDaFaculdade e que não tem o getHora implementado.

Criado 18 de janeiro de 2005
Ultima resposta 18 de jan. de 2005
Respostas 3
Participantes 2