13.2 Herança e Polimorfismo em Java: Palavra-chave 'extends'
A herança é um dos pilares fundamentais da programação orientada a objetos (OOP). Em Java, a herança permite que uma classe herde campos e métodos de outra classe, promovendo a reutilização de código e a criação de uma relação hierárquica entre as classes. A palavra-chave extends
é usada para estabelecer essa relação de herança entre duas classes.
Conceito de Herança
Na herança, temos duas entidades principais: a classe pai (ou superclasse) e a classe filha (ou subclasse). A classe filha herda os atributos e comportamentos da classe pai, mas também pode definir seus próprios membros e comportamentos. Isso significa que a classe filha é uma especialização da classe pai, onde ela não apenas possui os traços da classe pai, mas também adiciona suas características únicas.
Usando a palavra-chave 'extends'
Para implementar a herança em Java, usamos a palavra-chave extends
na declaração da classe filha. Vejamos um exemplo simples:
class Animal {
void comer() {
System.out.println("Este animal come");
}
}
class Cachorro extends Animal {
void latir() {
System.out.println("O cachorro late");
}
}
No exemplo acima, Cachorro
é uma subclasse de Animal
. Isso significa que Cachorro
herda o método comer()
de Animal
e também define seu próprio método latir()
. Um objeto da classe Cachorro
pode chamar ambos os métodos.
Polimorfismo e Herança
Polimorfismo é outro conceito chave na OOP que está intimamente relacionado à herança. Significa "muitas formas" e permite que objetos sejam tratados como instâncias de suas classes pai ao invés de suas classes reais. Em Java, isso é possível graças à herança e ao fato de que uma variável de referência de superclasse pode apontar para um objeto de subclasse. Isso permite que métodos sejam chamados de forma polimórfica.
Por exemplo:
Animal meuAnimal = new Cachorro();
meuAnimal.comer(); // Chama o método da classe Animal
// meuAnimal.latir(); // Erro de compilação: o tipo Animal não possui o método latir
Aqui, a variável meuAnimal
é do tipo Animal
, mas aponta para uma instância de Cachorro
. Isso permite que o método comer()
seja chamado polimorficamente. No entanto, se tentarmos chamar latir()
através de meuAnimal
, receberemos um erro de compilação, pois o compilador só conhece os métodos definidos na classe Animal
.
Sobrescrita de Métodos
Uma característica importante da herança em Java é a capacidade de sobrescrever métodos. Isso significa que uma subclasse pode fornecer sua própria implementação de um método que já está definido em sua superclasse. Para sobrescrever um método, a subclasse deve definir um método com a mesma assinatura que o método da superclasse.
class Gato extends Animal {
@Override
void comer() {
System.out.println("O gato come peixe");
}
}
No exemplo acima, a classe Gato
sobrescreve o método comer()
da classe Animal
. A anotação @Override
é opcional, mas é uma boa prática usá-la, pois ela informa ao compilador e aos desenvolvedores que o método é uma sobrescrita intencional.
Polimorfismo e Sobrescrita de Métodos
Quando um método é sobrescrito, o polimorfismo garante que a versão sobrescrita do método seja chamada quando o objeto é tratado como uma instância da superclasse. Isso é uma parte fundamental do que torna o polimorfismo tão poderoso em Java.
Animal meuGato = new Gato();
meuGato.comer(); // Chama o método sobrescrito da classe Gato
Neste caso, mesmo que meuGato
seja do tipo Animal
, o método comer()
que é chamado é o da classe Gato
, porque o objeto real é uma instância de Gato
.
Considerações Finais
A herança e o polimorfismo são conceitos fundamentais que permitem que as classes Java sejam reutilizáveis, extensíveis e gerenciáveis. A palavra-chave extends
é a porta de entrada para a herança, enquanto o polimorfismo permite que objetos de diferentes classes sejam tratados de maneira uniforme. Compreender esses conceitos é essencial para qualquer programador que deseja dominar Java e desenvolver sistemas robustos e flexíveis.
Além disso, é importante estar ciente das limitações e considerações ao usar herança, como o problema do "diamante" em heranças múltiplas (que Java resolve ao não permitir herança múltipla de classes) e a importância do encapsulamento para manter uma hierarquia de classes bem definida e segura.
Em resumo, a herança e o polimorfismo são ferramentas poderosas que, quando usadas corretamente, podem significativamente melhorar o design e a manutenção do software. A palavra-chave extends
é apenas o começo de um vasto mundo de possibilidades que a programação orientada a objetos oferece.