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

Implementação de método abstrato sem @Override

Em aulas anteriores vimos a utilização da anotação override, cuja a finalidade é garantir que a classe-filha esteja especificando a funcionalidade de um método existente em sua superclasse. Se a classe-filha não utiliza o @Override acima de seu método, então este método é um método própria da classe, e não o método da superclasse, certo?

Pois bem, nessa aula fomos introduzidos ao conceito de método abstrato:

//não pode instanciar essa classe, pq é abstrata
public abstract class Funcionario {

        private String nome;
        private String cpf;
        private double salario;

        //metodo sem corpo, nao ha implementacao
        public abstract double getBonificacao(); //ESSE AQUI

        public String getNome() {
                return nome;
        }

//Código omitido

Peguemos a classe-filha a seguir como exemplo:

public class Designer extends Funcionario {

    public double getBonificacao() {
        System.out.println("Chamando o método de bonificacao do Designer");
        return 200;
    }
}

Minha dúvida é: na classe-filha não temos a anotação override que define que a classe-filha está especificando o método getBonificacao(). Por que nesse caso não precisamos fazer o @Override?

3 respostas

A anotação @Override não é necessária para fazer a sobrescrita de métodos, ele é utilizado para indicar aos programadores e ao compilador que aquele método foi sobrescrito. Com a utilização da anotação o compilador verifica se você está realmente sobrescrevendo outro método.

Não é necessário utilizar a anotação, se a classe filha ter um método com a mesma assinatura que a classe mãe, ao executar o java irá utilizar o método da classe instanciada, ou seja, da classe filha A anotação @Override indica para o compilador e para o programador que aquele método é sobrescrito, e é a garantia que o método tem a mesma assinatura da classe mão, tanto que se tentar utilizar essa anotação em um método que não existe a classe não irá compilar

solução!

Oi Fellipe, tudo bem?

O @Override garante que o método da classe filha que tem essa anotação está sobrescrevendo um método existente com a mesma assinatura na classe mãe. Ou seja, se você tem o getBonificacao() tanto na classe mãe quanto na classe filha com amesma assinatura, você pode usar o @Override para garantir que, caso você mude a assinatura do getBonificacao() na classe mãe, esse mesmo método pare de funcionar na classe filha também, te obrigando a corrigir a o código nesses casos.

Agora, em relação à sua dúvida: Por que quando lidamos com a implementação de um método da classe filha que especifica um método abstrato da classe mãe, nós não precisamos fazer o @Override?

Bom, isso se deve à própria natureza do método abstrato que, por não possuir uma implementação, obriga a classe filha a implementar um método de mesmo nome, caso contrário, o programa não compila. Você pode imaginar que existe um @Override implícito na herança de uma classe abstrata com métodos abstratos, não tenho certeza se é isso que acontece por baixo dos panos, mas na prática é assim que funciona.

Obs.: Uma classe não precisa implementar o método abstrato da classe mãe caso ela também seja abstrata (mas assim que aparecer uma classe concreta, ela precisará implementar os métodos abstratos da classe mãe).

Espero ter ajudado, qualquer dúvida é só avisar!

Bons estudos!!