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
finalestatic. - 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.








