Herança e Polimorfismo

Herança e polimorfismo são dois dos conceitos fundamentais da programação orientada a objetos. Eles permitem a criação de hierarquias de classes e a capacidade de objetos de diferentes classes se comportarem de maneira semelhante.

Herança

A herança é a capacidade de uma classe herdar atributos e métodos de uma classe mãe (ou superclasse). Isso permite que uma classe filha (ou subclasse) tenha todos os recursos da classe mãe e ainda acrescente novos recursos próprios. A herança é definida usando a palavra-chave extends.

public class Subclasse extends ClasseBase {
    // Campos e métodos adicionais da subclasse
}

A classe Subclasse herda todos os campos e métodos marcados como public e protected da classe ClasseBase. Isso significa que você pode usar esses campos e métodos na subclasse sem precisar reescrevê-los.

Por exemplo, considere a seguinte classe Animal:

public class Animal {
    protected String nome;

    public Animal(String nome) {
        this.nome = nome;
    }

    public void fazerBarulho() {
        System.out.println("O animal está fazendo barulho!");
    }
}

Agora, podemos criar uma subclasse chamada Cachorro que herda da classe Animal:

public class Cachorro extends Animal {
    public Cachorro(String nome) {
        super(nome);
    }

    public void fazerBarulho() {
        System.out.println("O cachorro está latindo!");
    }
}

A classe Cachorro herda o campo nome e o método fazerBarulho() da classe Animal. No entanto, ele também redefine o método fazerBarulho() para que ele exiba uma mensagem diferente. Além disso, a palavra-chave super deve ser usada no construtor da classe Cachorro para chamar o construtor da classe mãe, Animal.

Polimorfismo

Polimorfismo é a capacidade de objetos de diferentes classes se comportarem de maneira semelhante. Isso é feito usando interfaces ou classes abstratas, que definem um conjunto de métodos que uma classe deve implementar para se adequar a essa interface ou classe (abstrata ou concreta). Dessa forma, podemos tratar objetos de diferentes classes que implementam a mesma interface ou classe abstrata de maneira semelhante.

Exemplificando, considere a mesma classe Animal apresentada acima:

public class Cachorro extends Animal {
    @Override
    public void fazerBarulho() {
        System.out.println("O cachorro late.");
    }
}

public class Gato extends Animal {
    @Override
    public void fazerBarulho() {
        System.out.println("O gato mia.");
    }
}

public class Teste {
    public static void main(String[] args) {
        Animal animal1 = new Cachorro();
        Animal animal2 = new Gato();
        animal1.fazerBarulho();  // Saída: O cachorro late.
        animal2.fazerBarulho();  // Saída: O gato mia.
    }
}

A classe Animal, define métodos comuns a todos os animais. Então, a classe Cachorro e a classe Gato como subclasses de Animal são tratadas como animais. Podemos chamar métodos comuns a todos os animais, como o método fazerBarulho, em qualquer objeto que implemente a interface Animal, independentemente de ser um Cachorro ou um Gato.

Importante mencionar que a mesma situação pode ser replicada se implementada com o uso de, ao invés de uma classe concreta, uma classe abstrata ou uma interface. O importante para ser considerado polimorfismo é ser replicada a situação no método main da classe Teste onde dois objetos do tipo Animal executam ações diferentes devido a diferentes implementações.

Referências

Last updated