Sobes.tech
Junior

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/filha) herdar propriedades (campos) e comportamentos (métodos) de uma classe existente (superclasse/pai), expandindo ou sobrescrevendo a funcionalidade. Isto promove a reutilização de código e estabelece relações de "é um" (is-a).

O polimorfismo é a capacidade de objetos de diferentes classes responderem de forma diferente ao mesmo nome de método, dependendo do seu tipo específico em tempo de execução. Ele fornece flexibilidade e extensibilidade ao código, permitindo tratar objetos de subclasses através de uma referência à superclasse.

Nestes tipos de dados por referência (classes), estes conceitos desempenham um papel fundamental:

  • Herança: A subclasse tem acesso aos membros da superclasse e pode adicionar os seus próprios ou modificar o comportamento dos métodos herdados (sobrescrita - overriding). Um objeto da subclasse pode ser utilizado em qualquer lugar onde se espere um objeto da superclasse.
  • Polimorfismo: Diferentes objetos relacionados com uma mesma hierarquia de herança podem ser tratados pelo mesmo código, chamando o mesmo método, mas a implementação desse método será específica para o tipo de objeto em tempo de execução.

Exemplo em Java:

// Superclasse (pai)
class Animal {
    public void makeSound() {
        System.out.println("Faz um som");
    }
}

// Subclasse (filha), herda de Animal
class Dog extends Animal {
    // Sobrescreve o método da superclasse
    @Override
    public void makeSound() {
        System.out.println("Au!");
    }
}

// Subclasse (filha), herda de Animal
class Cat extends Animal {
    // Sobrescreve o método da superclasse
    @Override
    public void makeSound() {
        System.out.println("Miau!");
    }
}

// Exemplo de polimorfismo
public class PolymorphismExample {
    public static void main(String[] args) {
        Animal myAnimal = new Animal(); // objeto da superclasse
        Animal myDog = new Dog();       // objeto da subclasse, referência à superclasse
        Animal myCat = new Cat();       // objeto da subclasse, referência à superclasse

        myAnimal.makeSound(); // Vai imprimir: Faz um som
        myDog.makeSound();    // Vai imprimir: Au! (polimorfismo - método do Dog)
        myCat.makeSound();    // Vai imprimir: Miau! (polimorfismo - método do Cat)
    }
}