13.3 Herança e Polimorfismo em Java: Sobrescrita de Métodos (Method Overriding)
A herança é um dos pilares fundamentais da Programação Orientada a Objetos (POO), permitindo a criação de novas classes com base em classes existentes. Em Java, isso é feito com a palavra-chave extends
. A herança promove a reutilização de código e a criação de uma hierarquia de classes. Associada à herança, temos o conceito de polimorfismo, que, em sua forma mais simples, pode ser entendido como a capacidade de um objeto ser referenciado de várias formas.
O polimorfismo se manifesta de duas maneiras principais em Java: sobrecarga de métodos (method overloading) e sobrescrita de métodos (method overriding). Nesta seção, focaremos na sobrescrita de métodos, que é um mecanismo pelo qual uma subclasse oferece uma implementação específica de um método que já é fornecido por uma de suas superclasses.
Entendendo a Sobrescrita de Métodos
A sobrescrita de métodos ocorre quando uma subclasse em Java redefine um método da superclasse. Para que um método seja sobrescrito, ele deve ter a mesma assinatura na subclasse e na superclasse, ou seja, o mesmo nome e os mesmos parâmetros. A sobrescrita é uma ferramenta poderosa que permite que uma classe herde métodos de uma classe pai e ainda assim modifique seu comportamento conforme necessário.
Regras para Sobrescrita de Métodos
Existem algumas regras importantes que devem ser seguidas para sobrescrever um método corretamente em Java:
- O método na subclasse deve ter o mesmo nome, tipo de retorno (ou subtipo) e parâmetros que o método na classe pai.
- A visibilidade do método sobrescrito na subclasse não pode ser mais restritiva do que a visibilidade do método da classe pai.
- O método sobrescrito não pode lançar exceções verificadas mais amplas do que as lançadas pelo método da classe pai.
- Métodos marcados como
final
não podem ser sobrescritos. - Métodos estáticos não são sobrescritos, mas sim ocultados, o que é um conceito diferente.
Exemplo de Sobrescrita de Métodos
Vamos considerar um exemplo simples para ilustrar a sobrescrita de métodos:
class Animal {
public void emitirSom() {
System.out.println("O animal emite um som.");
}
}
class Cachorro extends Animal {
@Override
public void emitirSom() {
System.out.println("O cachorro late: Au! Au!");
}
}
No exemplo acima, a classe Cachorro
sobrescreve o método emitirSom
da classe Animal
. Quando um objeto do tipo Cachorro
chama o método emitirSom
, a implementação sobrescrita é executada, fazendo com que seja impresso "O cachorro late: Au! Au!" em vez de "O animal emite um som.".
Uso da Anotação @Override
A anotação @Override
é usada acima do método sobrescrito. Embora não seja obrigatória, é uma boa prática usá-la porque ela informa ao compilador que você pretende sobrescrever um método da superclasse. Se o método correspondente não for encontrado na superclasse, o compilador gera um erro, evitando possíveis erros de digitação ou assinatura de método.
Benefícios da Sobrescrita de Métodos
A sobrescrita de métodos permite que os desenvolvedores criem sistemas mais flexíveis e reutilizáveis. Ela oferece os seguintes benefícios:
- Comportamento Específico: As subclasses podem definir um comportamento específico que é diferente do comportamento definido pela superclasse.
- Polimorfismo: O mesmo método pode ter várias implementações diferentes, dependendo do objeto que está sendo referenciado.
- Manutenção de Código Simplificada: Se um método da superclasse for modificado, apenas as sobrescritas que dependem da implementação original precisarão ser alteradas.
Considerações Finais
A sobrescrita de métodos é um recurso essencial na POO e em Java. Ela permite que os desenvolvedores criem classes mais especializadas que se comportam de maneira apropriada, mantendo a consistência e a reutilização de código. Ao entender e aplicar corretamente a sobrescrita de métodos, você pode criar sistemas robustos e facilmente extensíveis.
Por fim, é importante lembrar que a sobrescrita de métodos é apenas um aspecto do polimorfismo em Java. Outros aspectos, como a sobrecarga de métodos e a implementação de interfaces, também desempenham um papel crucial na criação de aplicações complexas e flexíveis. Com a prática e a compreensão desses conceitos, você estará bem equipado para aproveitar o poder da POO em seus projetos Java.