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.
Continue em nosso aplicativo
Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.
ou continue lendo abaixo...Baixar o aplicativo
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.