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.
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.
Ponto Chave: Você não pode criar um objeto de uma classe abstrata. Ela existe apenas para ser estendida (herdada) por outras classes.
<aside> 💡
Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela serve como um modelo geral para outras classes mais específicas.
</aside>
✔️ Classes abstratas podem conter:
Permitem:
Uma classe abstrata pode conter:
abstract e não possuem implementação. Eles são como "promessas" que as subclasses concretas devem cumprir, fornecendo sua própria implementação.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:
Forma é uma classe abstrata (marcada com abstract). Isso significa que você não pode fazer new Forma().cor e um construtor que o inicializa.desenhar(). Isso obriga qualquer classe que herdar de Forma a fornecer uma implementação específica para como ela será desenhada.exibirInformacoes(), que já tem sua lógica implementada e pode ser herdado e utilizado pelas subclasses.