Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Porque não utilizo a palavra override

public double getBonificacao()

Não entendi direito, se estou sobrescrevendo o método acima nas classes filhas porque não tem que usar a anotação @override ???

1 resposta
solução

Bom dia Oscar, tudo bem?

A anotação @Override é uma anotação de segurança que ajuda o compilador a garantir que um método está sobrecscrevendo outro. Ela serve como um acordo entre as classes mãe e filha, em que a filha pode ter certeza de que a a mãe tem um método com a assinatura devida.

Por exemplo, se você tiver as classes

class Foo {
  public void foo() {
    System.out.println("Foo");
  }
}

class Bar extends Foo {
  @Override
  public void foo() {
    System.out.println("Bar");
  }
}

A classe Bar está sobrescrevendo o método foo da classe Foo, e se você instanciar uma Bar e chamar o método foo , vai receber a saída Bar:

new Bar().foo();
> Bar

O que o @Override faz é garantir que a classe mãe Foo tenha o método foo(). Se isso não ocorrer, o código não compila:

class Foo {
  public void bar() {
    System.out.println("Foo");
  }
}

class Bar extends Foo {
  @Override
  public void foo() {
    System.out.println("Bar");
  }
}

O código acima não compila pois a classe Bar diz que está sobrescrevendo o método foo mas este não existe.

Já o código abaixo compila e roda normalmente, pois não há nenhum acordo entre as classes.

class Foo {
  public void foo() {
    System.out.println("Foo");
  }
}

class Bar extends Foo {
  public void foo() {
    System.out.println("Bar");
  }
}

Este último abaixo compila e roda normalmente, porém com um detalhe: a classe Bar tem acesso ao dois métodos!

class Foo {
  public void bar() {
    System.out.println("Foo");
  }
}

class Bar extends Foo {
  public void foo() {
    System.out.println("Bar");
  }
}

Bar instance = new Bar();
instance.foo();
> Bar
instance.bar();
> Foo

Isso ocorre pois ambos os métodos existem, e não existe nenhum contrato dizendo que é necessário existir um método foo na classe Foo.

Deu pra entender? Espero que sim, mas se ficou confuso não hesite em perguntar mais!

Um abraço e bons estudos!