Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida Herança classe abstrata e não abstrata

Suponha que temos 2 classes: - Funcionário com os métodos: setSalario(); getBonus(); * getNome();

  • Gerente que herda de funcionário e possui os métodos:
    • getBonus() - (reescrito da classe funcionário);
    • cobraEntrega() - (método novo);

Minha dúvida é, por que o código abaixo não compila se a classe Funcionário for abstrata, mas compila e roda corretamente se a classe Funcionário não for abstrata? Em ambos os casos a JVM não deveria identificar em tempo de execução que o tipo instanciado na variável joaquim é Gerente?

Funcionario joaquim = new Gerente();
joaquim.setSalario(2000);
joaquim.cobraEntrega();
4 respostas

Olá, você esta certo no ponto em que a JVM verifica o tipo em tempo de execução, entretanto, classes abstratas não podem ter instâncias. Então, apenas tipos que herdam de uma classe abstrata podem ser instanciados.

No seu exemplo, se Funcionario fosse uma classe concreta seu código funcionaria como você espera.

O código do Felipe Júnior deveria compilar, independentemente do fato da classe Funcionario serabstrata ou não, não é? Visto que em

Funcionario joaquim = new Gerente();

ele não instancionou um objeto Funcionario(abstrato), e sim um objeto Gerente. O fato da variável joaquim ser do tipo Funcionario não deveria gerar um erro de compilação, pois é possível ter uma variável de um tipo de classe abstrata, correto?

solução!

Pessoal,

Realizei o teste aqui e foi falha minha, na verdade em nenhum dos casos irá compilar, pois o método cobraEntrega() só pertence à classe Gerente e consequentemente a classe Funcionário não saberá da sua existência.

Apesar de em tempo de execução eu apontar para um Gerente, estamos falando que a variável é o tipo Funcionário. Logo, Funcionário tem método setSalario() mas não tem método cobraEntrega().

Abaixo os códigos das classes para teste

public class Funcionario {

    protected double salario;
    private String nome;

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

    public double getBonus(){
        return this.salario * 0.2;
    }

    public String getNome(){
        return nome;
    }
}
public class Gerente extends Funcionario{

    public double getBonus(){
        return this.salario * 0.3;
    }

    public void cobraEntrega(){
        System.out.println("Está pronta?");
    }
}
public class TestaFuncionario {

    public static void main(String[] args) {
        Funcionario joao = new Funcionario();
        joao.setSalario(1000);

        System.out.println(joao.getBonus());

        Funcionario joaquim = new Gerente();
        joaquim.setSalario(2000);
        joaquim.cobraEntrega();
    }
}

Obrigado, Felipe Júnior!