O que são herança e polimorfismo em tipos de dados de referência?
sobes.tech IA
Resposta da IA
A herança é um mecanismo que permite a uma nova classe (subclasse, classe filha) herdar campos e métodos de uma classe existente (classe pai, superclasse). Isto promove a reutilização de código e a hierarquia de classes.
O polimorfismo (diversidade de formas) é a capacidade de um objeto ter várias formas. No contexto de tipos de dados de referência, isso significa que uma variável de superclasse pode referenciar um objeto de uma subclasse. Isto permite tratar objetos de diferentes subclasses de forma unificada através de uma interface comum ou superclasse.
Existem dois tipos principais de polimorfismo:
- Tempo de compilação (polimorfismo estático): Geralmente alcançado através de sobrecarga de métodos (method overloading), quando numa classe há vários métodos com o mesmo nome, mas assinaturas diferentes (número e/ou tipos de parâmetros).
- Tempo de execução (polimorfismo dinâmico): Alcançado através de sobrescrita de métodos (method overriding), quando uma subclasse fornece a sua própria implementação de um método já definido na superclasse. Ao chamar esse método através de uma referência à superclasse, será executada a implementação da subclasse (se o tipo do objeto for uma subclasse).
Exemplo de herança e polimorfismo dinâmico:
// Classe base
class Animal {
public void makeSound() {
System.out.println("Som genérico de animal");
}
}
// Classe herdada
class Dog extends Animal {
@Override // Sobrescrita de método
public void makeSound() {
System.out.println("Au!");
}
}
// Classe herdada
class Cat extends Animal {
@Override // Sobrescrita de método
public void makeSound() {
System.out.println("Miau!");
}
}
public class Main {
public static void main(String[] args) {
// Tipo estático da variável Animal, tipo dinâmico do objeto Dog
Animal myDog = new Dog();
// Tipo estático da variável Animal, tipo dinâmico do objeto Cat
Animal myCat = new Cat();
// Tipo estático da variável Animal, tipo dinâmico do objeto Animal
Animal genericAnimal = new Animal();
// Demonstração de polimorfismo
myDog.makeSound(); // Chama o método de Dog
myCat.makeSound(); // Chama o método de Cat
genericAnimal.makeSound(); // Chama o método de Animal
}
}
Neste exemplo, Dog e Cat herdam de Animal. As variáveis myDog, myCat e genericAnimal têm tipo estático Animal, mas referenciam objetos de diferentes tipos dinâmicos (Dog, Cat, Animal). Ao chamar o método makeSound(), cada referência executa a implementação correspondente do método dependendo do tipo dinâmico do objeto, o que é polimorfismo em tempo de execução.