Herança

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:[code]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§;
}
}[/code]

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.

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!

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.