Java/Herança e Polimorfismo/Herança e Classes Abstratas
Java⏱ ~2 min de leitura

Herança e Classes Abstratas

extends, abstract e override

Herança permite que uma classe (subclasse) herde atributos e métodos de outra classe (superclasse) usando extends. A subclasse recebe tudo da superclasse e pode adicionar novos membros ou sobrescrever comportamentos com @Override. O construtor da superclasse é chamado com super().

Classes abstratas (abstract) não podem ser instanciadas diretamente — existem para serem herdadas. Podem ter métodos abstratos (sem implementação, que forçam as subclasses a implementar) e métodos concretos (que fornecem comportamento padrão). São úteis quando subclasses compartilham código mas diferem em partes específicas.

Java não permite herança múltipla de classes — uma classe só pode estender uma única classe. Para herdar de múltiplas fontes use interfaces, que suportam implements múltiplos.

Exemplo.java
// ── Classe abstrata ───────────────────────────────
public abstract class Forma {
    protected String cor;

    public Forma(String cor) { this.cor = cor; }

    // Abstrato: OBRIGA subclasses a implementar
    public abstract double calcularArea();

    // Concreto: subclasses HERDAM (podem sobrescrever)
    public void exibir() {
        System.out.printf("Forma %s, área: %.2f%n", cor, calcularArea());
    }
}

// ── Subclasse ─────────────────────────────────────
public class Circulo extends Forma {
    private double raio;

    public Circulo(double raio, String cor) {
        super(cor);       // chama construtor da superclasse
        this.raio = raio;
    }

    @Override
    public double calcularArea() {
        return Math.PI * raio * raio;
    }
}

public class Retangulo extends Forma {
    private double largura, altura;

    public Retangulo(double l, double a, String cor) {
        super(cor);
        this.largura = l; this.altura = a;
    }

    @Override
    public double calcularArea() { return largura * altura; }
}

// Forma naoFunciona = new Forma("azul"); // ❌ abstrata!
Circulo c = new Circulo(5, "vermelho");
c.exibir();  // Forma vermelho, área: 78,54
💡 Dica pro

Prefira composição a herança quando possível ("favor composition over inheritance"). Herança cria acoplamento forte — se a superclasse mudar, as subclasses podem quebrar.

Recompensa+45 XP+exercícios