13.5 Herança e Polimorfismo em Java: Hierarquia de Classes
A programação orientada a objetos (POO) é um paradigma de desenvolvimento de software que se baseia no conceito de "objetos", que podem conter dados na forma de campos, frequentemente conhecidos como atributos, e código, na forma de procedimentos, frequentemente conhecidos como métodos. Dois dos pilares fundamentais da POO são a herança e o polimorfismo, que permitem a criação de um código mais reutilizável e flexível.
Herança em Java
A herança é um mecanismo que permite que uma nova classe seja criada com base em uma classe existente. A nova classe, conhecida como subclasse ou classe derivada, herda campos e métodos da classe existente, que é chamada de superclasse ou classe base. A herança é uma forma de reutilizar código e estabelecer uma relação de tipo entre classes, criando uma hierarquia.
Em Java, a herança é realizada com a palavra-chave extends
. Por exemplo:
class Animal {
void comer() {
System.out.println("Este animal come");
}
}
class Cachorro extends Animal {
void latir() {
System.out.println("O cachorro late");
}
}
Aqui, a classe Cachorro
estende a classe Animal
, o que significa que Cachorro
herda o método comer()
de Animal
. Isso significa que um objeto de Cachorro
pode chamar o método comer()
, mesmo que não tenha sido explicitamente definido na classe Cachorro
.
Java suporta apenas herança simples, o que significa que uma classe só pode estender uma única classe. No entanto, uma classe pode implementar várias interfaces, que é um tópico diferente e também uma forma de alcançar a polimorfia.
Polimorfismo em Java
Polimorfismo é a capacidade de um método de ter várias formas. Em Java, isso é conseguido principalmente de duas maneiras: polimorfismo de sobrecarga (overloading) e polimorfismo de sobrescrita (overriding).
Polimorfismo de sobrecarga acontece quando dois ou mais métodos na mesma classe têm o mesmo nome, mas parâmetros diferentes. Por exemplo:
class Exemplo {
void demo(int a) {
System.out.println("a: " + a);
}
void demo(int a, int b) {
System.out.println("a e b: " + a + "," + b);
}
double demo(double a) {
System.out.println("double a: " + a);
return a*a;
}
}
Polimorfismo de sobrescrita, por outro lado, é quando uma subclasse tem um método com a mesma assinatura (nome e parâmetros) que um método na superclasse. Ao sobrescrever um método, a subclasse fornece sua própria implementação. Um exemplo disso seria:
class Animal {
void som() {
System.out.println("O animal faz um som");
}
}
class Cachorro extends Animal {
@Override
void som() {
System.out.println("O cachorro late");
}
}
Com o polimorfismo de sobrescrita, quando um método é invocado, o método da subclasse é chamado, não o da superclasse. O uso da anotação @Override
é opcional, mas é uma boa prática de programação, pois ajuda a evitar erros e deixa o código mais legível.
Hierarquia de Classes
A hierarquia de classes é a organização de classes em uma estrutura de árvore onde a classe base é o nó raiz e as subclasses são os nós filhos. Essa estrutura permite a reutilização de código e a gestão da complexidade em sistemas grandes. Em uma hierarquia de classes, uma subclasse herda o estado e o comportamento da superclasse, podendo adicionar novos campos e métodos ou sobrescrever os existentes.
Um exemplo clássico de hierarquia de classes é a classificação biológica. Por exemplo, a classe Mamifero
pode estender a classe Animal
, e a classe Cachorro
pode estender a classe Mamifero
. Cada nível da hierarquia agrega características específicas que são herdadas pelos níveis abaixo.
Considerações Finais
A herança e o polimorfismo são conceitos essenciais no desenvolvimento orientado a objetos. Eles permitem a criação de uma estrutura de código que é ao mesmo tempo flexível e fácil de manter. A herança permite estabelecer uma relação "é-um" entre classes, enquanto o polimorfismo permite que objetos de diferentes classes sejam tratados de maneira uniforme. Juntos, eles proporcionam poderosas ferramentas para o desenvolvimento de software em Java e muitas outras linguagens de programação orientadas a objetos.
Entender e aplicar corretamente a herança e o polimorfismo pode ser desafiador para programadores iniciantes, mas é fundamental para a criação de sistemas robustos e escaláveis. Com a prática e o estudo desses conceitos, desenvolvedores podem dominar a arte da programação orientada a objetos e criar aplicações eficientes e de alta qualidade em Java.