Neste capítulo, vamos mergulhar nas Classes Abstratas, uma ferramenta fundamental na Programação Orientada a Objetos para criar hierarquias de classes mais flexíveis e organizadas. Elas nos permitem definir um "projeto" de classes que ainda não está completo, mas que serve de base para outras classes mais específicas.



🧩 O que são Classes Abstratas?

Imagine que você está projetando uma nova linha de veículos. Você sabe que todos os veículos terão certas características (como cor, velocidade máxima) e certas ações (como ligar o motor, frear). No entanto, faz sentido criar um "Veículo Genérico" que você possa dirigir? Provavelmente não. Você quer dirigir um Carro, uma Moto, ou um Caminhão.

Uma Classe Abstrata é exatamente isso: um projeto ou um modelo para outras classes, mas que não pode ser instanciada diretamente. Ela serve como uma base, uma ideia geral que precisa ser complementada por outras classes mais específicas.

✔️ Classes abstratas podem conter:


❓ Por Que Usar Classes Abstratas?

Permitem:


🗜️ Componentes de uma Classe Abstrata

Uma classe abstrata pode conter:

  1. Atributos: Variáveis que descrevem características comuns.
  2. Métodos Concretos (com corpo): Métodos que já possuem uma implementação e que podem ser usados diretamente pelas subclasses (ou sobrescritos, se necessário).
  3. Métodos Abstratos (sem corpo): São métodos declarados com a palavra-chave abstract e não possuem implementação. Eles são como "promessas" que as subclasses concretas devem cumprir, fornecendo sua própria implementação.

🧪 Exemplo Prático: Desenhando Formas Geométricas

Vamos pensar em diversas formas geométricas: Círculo, Retângulo, Triângulo. Todas elas são "formas" e todas podem ser "desenhadas" e "exibidas". No entanto, não faz sentido ter uma "Forma Genérica" que possa ser desenhada por si só, sem saber se é um círculo ou um quadrado.

// Declaração de uma Classe Abstrata
public abstract class Forma { // Note a palavra-chave 'abstract'

    // Atributo comum a todas as formas
    String cor;

    // Construtor (classes abstratas podem ter construtores)
    public Forma(String cor) {
        this.cor = cor;
    }

    // Método abstrato: Cada forma se desenha de um jeito,
    // então a implementação é deixada para as subclasses.
    public abstract void desenhar(); // Não tem corpo, termina com ';'

    // Método concreto: Todas as formas podem exibir suas informações de forma similar.
    public void exibirInformacoes() {
        System.out.println("Cor da forma: " + this.cor);
    }
}

Neste exemplo: