Substituição de método Java

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 @Overrideanotação em nosso exemplo. Em Java, as anotações são os metadados que usamos para fornecer informações ao compilador. Aqui, a @Overrideanotaçã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 finale static.
  • 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 superpalavra - 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 publicou 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 protectedna superclasse Animal. O mesmo método possui o publicespecificador de acesso na subclasse Dog. Isso é possível porque o publicfornece 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.

Artigos interessantes...