Java - substituindo
No capítulo anterior, falamos sobre superclasses e subclasses. Se uma classe herdar um método de sua superclasse, há uma chance de substituir o método, desde que não seja marcado como final.
O benefício da substituição é:capacidade de definir um comportamento específico para o tipo de subclasse, o que significa que uma subclasse pode implementar um método de classe pai com base em seu requisito.
Em termos de orientação a objetos, substituir significa substituir a funcionalidade de um método existente.
Exemplo
Vamos ver um exemplo.
Demonstração ao vivo
class Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class } }
Isso produzirá o seguinte resultado -
Saída
Animals can move Dogs can walk and run
No exemplo acima, você pode ver que, embora b é um tipo de Animal que executa o método move na classe Dog. A razão para isso é:Em tempo de compilação, a verificação é feita no tipo de referência. No entanto, no tempo de execução, a JVM descobre o tipo de objeto e executa o método que pertence a esse objeto específico.
Portanto, no exemplo acima, o programa irá compilar corretamente, pois a classe Animal possui o método move. Então, em tempo de execução, ele executa o método específico para aquele objeto.
Considere o seguinte exemplo -
Exemplo
Demonstração ao vivoclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } public void bark() { System.out.println("Dogs can bark"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class b.bark(); } }
Isso produzirá o seguinte resultado -
Saída
TestDog.java:26: error: cannot find symbol b.bark(); ^ symbol: method bark() location: variable b of type Animal 1 error
Este programa lançará um erro de tempo de compilação, pois o tipo de referência de b Animal não possui um método chamado bark.
Regras para substituição de método
-
A lista de argumentos deve ser exatamente a mesma do método substituído.
-
O tipo de retorno deve ser o mesmo ou um subtipo do tipo de retorno declarado no método substituído original na superclasse.
-
O nível de acesso não pode ser mais restritivo do que o nível de acesso do método substituído. Por exemplo:Se o método da superclasse for declarado público, o método de substituição na subclasse não poderá ser privado ou protegido.
-
Os métodos de instância podem ser substituídos somente se forem herdados pela subclasse.
-
Um método declarado final não pode ser substituído.
-
Um método declarado estático não pode ser substituído, mas pode ser declarado novamente.
-
Se um método não pode ser herdado, ele não pode ser substituído.
-
Uma subclasse dentro do mesmo pacote que a superclasse da instância pode substituir qualquer método de superclasse que não seja declarado privado ou final.
-
Uma subclasse em um pacote diferente só pode substituir os métodos não finais declarados como públicos ou protegidos.
-
Um método de substituição pode lançar quaisquer exceções desmarcadas, independentemente de o método substituído lançar exceções ou não. No entanto, o método de substituição não deve lançar exceções verificadas que sejam novas ou mais amplas do que as declaradas pelo método de substituição. O método de substituição pode lançar exceções mais restritas ou menos do que o método substituído.
-
Construtores não podem ser substituídos.
Usando a superpalavra-chave
Ao invocar uma versão de superclasse de um método substituído, a super palavra-chave é usada.
Exemplo
Demonstração ao vivoclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { super.move(); // invokes the super class method System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal b = new Dog(); // Animal reference but Dog object b.move(); // runs the method in Dog class } }
Isso produzirá o seguinte resultado -
Saída
Animals can move Dogs can walk and run
Java
- Operadores Java
- Interface Java
- Método String Length () em Java:como encontrar com exemplo
- Método Java String indexOf() com substring e exemplos
- Método Java String charAt() com exemplo
- Método Java String compareTo():como usar com exemplos
- String Java contém() Método | Verificar substring com exemplo
- Java String EndsWith() Método com Exemplo
- Java String replace(), replaceAll() e método replaceFirst()
- Variável estática em Java:o que é bloco e método estático [exemplo]