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

Duvida!!!

Esse seria o exercicio que estou com duvida!! Posso chamar um método abstrato de dentro de um outro método da própria classe abstrata? Um exemplo: o mostra do Funcionario pode invocar this.getBonificacao()?

Sim você pode chamar, mais a minha duvida seria isso. ja que vo invocar/chamar um metodo abstrato em um metodo sem ser abstrato, minha duvida é, por chamar o metodo abstrato dentro do escopo do mentodo, as subclasse seria obrigado a implementar esse metodo? porquê você esta se refenciando a um metodo abstrato.

8 respostas
solução!

Olá Alisson,

Vamos considerar o seguinte exemplo:

public abstract class Funcionario {
    public abstract double getBonificacao();

    public void mostraBonificacao() {
        System.out.println(getBonificacao());
    }

Nesse caso, se conseguíssemos instanciar a classe Funcionario, o que aconteceria se tentássemos invocar o método mostraBonificacao()?

Teríamos um problema porque o funcionario não tem o método getBonificacao() implementado! Por isso, quando temos pelo menos um método abstrato em nossas classes, temos que torná-la abstrata. Fazendo isso, agora não conseguimos mas instanciar a classe Funcionario e não precisamos nos preocupar com o problema citado acima.

Mas e se tivermos classes que herdam de Funcionario? Por exemplo, um Gerente:

public class Gerente extends Funcionario {
    ...
}

Como a classe Funcionario tem um método abstrato, o Gerente será forçado a implementá-lo:

public class Gerente extends Funcionario {
    public double getBonificacao() {
        return 500.0;
    }
}

Agora, o que vai acontecer quando invocarmos o método mostraBonificacao() no Gerente?

Nesse caso não temos problema algum! O método mostraBonificacao() agora só pode ser invocado em classes que herdam de Funcionario (ele é abstrato). Todas as classes que herdam de Funcionario precisam implementar o getBonificacao(). Logo, quando invocarmos o mostraBonificacao(), o método getBonificacao() sempre vai existir!

A vantagem de fazer isso é que conseguimos deixar um comportamento padrão para todos funcionários na classe Funcionario (mostraBonificacao) e deixamos a parte que pode variar de acordo com o cargo (getBonificacao) para que seja implementada nas subclasses do Funcionario.

Dessa forma podemos implementar algoritmos bem complexos em uma classe base e permitir que partes desse algoritmo sejam customizadas nas classes filhas.

Espero ter ajudado!

Ótima explicação Jeferson.

Fiquei com dúvida também, mas foi bem esclarecida com essa explicação, obrigado!

Tive a mesma dúvida, mas essa explicação matou a charada. Muito bem explicado Jeferson! Valeu!

muito bom tirei minha duvida

Eu criei uma classe abstrata Funcionario e fiz igual à sua, Jefferson. Depois criei um Gerente e chamei o método mostraBonificacao(), que me retornou 0.0. Por que isso aconteceu?

ICARO, Foi setado um salario ?

Para o gerente, não. Saulo!