13.1 Herança e Polimorfismo em Java: Conceito de Herança
A herança é um dos pilares fundamentais da programação orientada a objetos (POO), e o Java, sendo uma linguagem que adota esse paradigma, oferece recursos robustos para sua implementação. Herança é um mecanismo que permite que uma nova classe derive propriedades e comportamentos de uma classe existente. A classe que é herdada é chamada de classe base, superclasse ou classe pai, enquanto a classe que herda é conhecida como classe derivada, subclasse ou classe filha.
Na prática, a herança possibilita a reutilização de código e a criação de uma hierarquia de classes relacionadas. Isso não só economiza tempo e esforço no desenvolvimento de software, mas também ajuda a manter o código organizado, mais fácil de manter e expandir.
Como a Herança Funciona em Java
Em Java, a herança é realizada com a palavra-chave extends. Quando uma classe é definida como a extensão de outra, ela herda todos os campos não privados (atributos) e métodos da classe pai. Isso significa que a classe filha pode usar esses membros como se fossem seus.
Exemplo:
class Vehicle {
protected String brand = "Ford"; // Atributo da classe Vehicle
public void honk() { // Método da classe Vehicle
System.out.println("Tuut, tuut!");
}
}
class Car extends Vehicle {
private String modelName = "Mustang"; // Atributo da classe Car
public static void main(String[] args) {
// Cria um objeto da classe Car
Car myCar = new Car();
// Chama o método da classe Vehicle
myCar.honk();
// Acessa o atributo da classe Vehicle
System.out.println(myCar.brand + " " + myCar.modelName);
}
}
Neste exemplo, Car é uma subclasse de Vehicle. A classe Car herda o método honk e o atributo brand da classe Vehicle, e também define seu próprio atributo, modelName.
Sobrescrita de Métodos
Uma subclasse em Java pode sobrescrever os métodos da superclasse. Isso é feito quando a subclasse precisa de uma implementação específica para um método herdado. A sobrescrita é uma forma de polimorfismo, que será discutido mais adiante.
Exemplo:
class Animal {
public void sound() {
System.out.println("O animal faz um som");
}
}
class Pig extends Animal {
public void sound() {
System.out.println("O porco diz: wee wee");
}
}
class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // Cria um objeto da classe Animal
Animal myPig = new Pig(); // Cria um objeto da classe Pig
myAnimal.sound();
myPig.sound();
}
}
Neste exemplo, a classe Pig sobrescreve o método sound da classe Animal. Quando o método é chamado no objeto myPig, a implementação da classe Pig é usada, não a da classe Animal.
Uso do super
A palavra-chave super em Java é usada dentro de métodos de subclasses para fazer referência a membros (métodos ou atributos) da superclasse. Isso é útil especialmente quando estamos sobrescrevendo métodos, mas queremos ainda assim acessar a implementação da superclasse.
Exemplo:
class Animal {
public void sound() {
System.out.println("O animal faz um som");
}
}
class Pig extends Animal {
public void sound() {
super.sound(); // Chama o método da superclasse
System.out.println("O porco diz: wee wee");
}
}
Aqui, a classe Pig chama o método sound da superclasse Animal antes de executar seu próprio código.
O Polimorfismo em Java
O polimorfismo, outro pilar da POO, permite que objetos de diferentes classes sejam tratados como objetos de uma superclasse comum. Isso é particularmente poderoso em combinação com a herança, pois permite que um único método ou classe opere em objetos de diferentes classes.
Polimorfismo em Java é, em sua maioria, realizado através de sobrecarga e sobrescrita de métodos. A sobrecarga ocorre quando dois ou mais métodos na mesma classe têm o mesmo nome, mas parâmetros diferentes. A sobrescrita, como vimos, é quando uma subclasse fornece uma implementação específica para um método que já é fornecido por sua superclasse.
Exemplo de polimorfismo:
class Animal {
public void sound() {
System.out.println("O animal faz um som");
}
}
class Pig extends Animal {
public void sound() {
System.out.println("O porco diz: wee wee");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("O cachorro diz: bow wow");
}
}
class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myPig = new Pig();
Animal myDog = new Dog();
myAnimal.sound();
myPig.sound();
myDog.sound();
}
}
Neste exemplo, a classe Main cria objetos de diferentes tipos, mas todos são tratados como instâncias da classe Animal. Isso demonstra polimorfismo, pois o método sound se comporta de maneira diferente dependendo do tipo de objeto que o invoca.
Conclusão
A herança e o polimorfismo são conceitos chave na programação orientada a objetos e são extensivamente utilizados em Java para criar código reutilizável e sistemas extensíveis. Ao compreender e aplicar esses conceitos, desenvolvedores podem escrever código mais limpo, mais modular e mais fácil de manter.
Espera-se que este curso sobre Java forneça uma compreensão sólida desses conceitos, permitindo que você os aplique em cenários do mundo real e construa aplicações robustas e eficientes.