Sobrescrita de Métodos em Java: Personalizando Comportamento da Superclasse
No capítulo anterior, falamos sobre superclasses e subclasses. Se uma classe herda um método de sua superclasse, há a chance de sobrescrever (override) o método, desde que não seja marcado final.
O benefício da sobrescrita: capacidade de definir comportamento específico ao tipo da subclasse, ou seja, a subclasse implementa método da superclasse conforme sua necessidade.
Em termos orientados a objetos, sobrescrever significa substituir a funcionalidade de um método existente.
Exemplo Básico
class Animal {
public void move() {
System.out.println("Animais podem se mover");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Cães podem andar e correr");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // referência e objeto Animal
Animal b = new Dog(); // referência Animal, objeto Dog
a.move(); // executa método da classe Animal
b.move(); // executa método da classe Dog
}
}
Saída:
Animais podem se mover
Cães podem andar e correr
Mesmo b sendo tipo Animal, executa o método move de Dog. Em tempo de compilação, verifica-se o tipo da referência. Em tempo de execução, a JVM descobre o tipo do objeto e executa o método pertencente a esse objeto.
Exemplo: Método Adicional na Subclasse
class Animal {
public void move() {
System.out.println("Animais podem se mover");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Cães podem andar e correr");
}
public void bark() {
System.out.println("Cães podem latir");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Dog();
a.move();
b.move();
b.bark(); // ERRO DE COMPILAÇÃO
}
}
Erro:
TestDog.java:26: error: cannot find symbol
b.bark();
^
symbol: method bark()
location: variable b of type Animal
1 error
Erro em tempo de compilação pois tipo de referência Animal não tem método bark.
Regras para Sobrescrita de Métodos
- A lista de argumentos deve ser exatamente igual à do método sobrescrito.
- O tipo de retorno deve ser o mesmo ou subtipo do declarado no método original na superclasse.
- O nível de acesso não pode ser mais restritivo. Ex.: se superclasse é
public, subclasse não pode serprivateouprotected. - Métodos de instância só podem ser sobrescritos se herdados pela subclasse.
- Método declarado
finalnão pode ser sobrescrito. - Método declarado
staticnão pode ser sobrescrito, mas pode ser redeclarado (hiding). - Se método não pode ser herdado, não pode ser sobrescrito.
- Subclasse no mesmo pacote pode sobrescrever qualquer método da superclasse que não seja
privateoufinal. - Subclasse em pacote diferente só pode sobrescrever métodos
publicouprotectednão-finais. - Método sobrescrito pode lançar qualquer unchecked exception. Não deve lançar checked exceptions novas ou mais amplas que as do método sobrescrito. Pode lançar exceções mais específicas ou em menor número.
- Construtores não podem ser sobrescritos.
Usando a Palavra-chave super
Ao invocar a versão da superclasse de um método sobrescrito, usa-se super.
Exemplo
class Animal {
public void move() {
System.out.println("Animais podem se mover");
}
}
class Dog extends Animal {
public void move() {
super.move(); // invoca método da superclasse
System.out.println("Cães podem andar e correr");
}
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog();
b.move();
}
}
Saída:
Animais podem se mover
Cães podem andar e correr
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Método Java String length(): Como Obter o Tamanho de uma String (Exemplo)
- Dominando Java String.indexOf(): Localizando Substrings e Exemplos Práticos
- Entendendo Java String.charAt(): Sintaxe, Tipo de Retorno, Exceções e Exemplo Prático
- Dominando o Método compareTo() do Java String: Sintaxe, Casos de Uso e Exemplos Práticos
- Método Java String.contains(): Como Verificar Substrings – Exemplos Práticos
- Dominando Java String.endsWith(): Como Verificar Sufixos de String com Exemplos
- Dominando Substituição de Strings em Java: replace(), replaceAll() e replaceFirst() Explicados
- Java Static Explicado: Variáveis, Métodos e Blocos – Exemplos Práticos