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 ???
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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 ???
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();
> BarO 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();
> FooIsso 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!