Neste tutorial, aprenderemos sobre a substituição de métodos em Java com a ajuda de exemplos.
No último tutorial, aprendemos sobre herança. Herança é uma propriedade OOP que nos permite derivar uma nova classe (subclasse) de uma classe existente (superclasse). A subclasse herda os atributos e métodos da superclasse.
Agora, se o mesmo método for definido na superclasse e na subclasse, o método da classe subclasse substituirá o método da superclasse. Isso é conhecido como substituição de método.
Exemplo 1: Substituição de método
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Produto :
Eu sou um cão.
No programa acima, o displayInfo()
método está presente na superclasse Animal e na subclasse Dog.
Quando chamamos displayInfo()
usando o objeto d1 (objeto da subclasse), o método dentro da subclasse Dog é chamado. O displayInfo()
método da subclasse substitui o mesmo método da superclasse.
Observe o uso da @Override
anotação em nosso exemplo. Em Java, as anotações são os metadados que usamos para fornecer informações ao compilador. Aqui, a @Override
anotação especifica ao compilador que o método após esta anotação substitui o método da superclasse.
Não é obrigatório usar @Override
. No entanto, quando usamos isso, o método deve seguir todas as regras de substituição. Caso contrário, o compilador gerará um erro.
Regras de substituição de Java
- A superclasse e a subclasse devem ter o mesmo nome de método, o mesmo tipo de retorno e a mesma lista de parâmetros.
- Não podemos substituir o método declarado como
final
estatic
. - Devemos sempre substituir os métodos abstratos da superclasse (serão discutidos em tutoriais posteriores).
super palavra-chave em substituição de Java
Uma pergunta comum que surge ao executar a substituição em Java é:
Podemos acessar o método da superclasse após a sobreposição?
Bem, a resposta é sim . Para acessar o método da superclasse da subclasse, usamos a super
palavra - chave.
Exemplo 2: uso de superpalavra-chave
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Produto :
Eu sou um animal Eu sou um cão.
No exemplo acima, a subclasse Dog substitui o método displayInfo()
da superclasse Animal.
Quando chamamos o método displayInfo()
usando o objeto d1 da subclasse Dog, o método dentro da subclasse Dog é chamado; o método dentro da superclasse não é chamado.
Dentro displayInfo()
da subclasse Dog, costumamos super.displayInfo()
chamar displayInfo()
da superclasse.
É importante observar que os construtores em Java não são herdados. Portanto, não existe substituição de construtor em Java.
No entanto, podemos chamar o construtor da superclasse de suas subclasses. Para isso, usamos super()
. Para saber mais, visite Java super keyword.
Especificadores de acesso em substituição de método
O mesmo método declarado na superclasse e suas subclasses podem ter especificadores de acesso diferentes. No entanto, existe uma restrição.
Só podemos usar esses especificadores de acesso em subclasses que fornecem acesso maior do que o especificador de acesso da superclasse. Por exemplo,
Suponha que um método myClass()
na superclasse seja declarado protected
. Então, o mesmo método myClass()
na subclasse pode ser public
ou protected
, mas não private
.
Exemplo 3: especificador de acesso na substituição
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Produto :
Eu sou um cão.
No exemplo acima, a subclasse Dog substitui o método displayInfo()
da superclasse Animal.
Sempre que chamamos displayInfo()
usando o d1 (objeto da subclasse), o método dentro da subclasse é chamado.
Observe que o displayInfo()
é declarado protected
na superclasse Animal. O mesmo método possui o public
especificador de acesso na subclasse Dog. Isso é possível porque o public
fornece um acesso maior do que o protected
.
Substituindo Métodos Abstratos
Em Java, as classes abstratas são criadas para serem a superclasse de outras classes. E, se uma classe contém um método abstrato, é obrigatório substituí-lo.
Aprenderemos mais sobre classes abstratas e sobreposição de métodos abstratos em tutoriais posteriores.