Classes abstratas servem como modelos para outras classes. Elas definem a estrutura essencial de um grupo de objetos, mas deixam detalhes específicos para as subclasses.


📌 O que são Classes Abstratas?

💡 Pense em uma classe abstrata como um “manual base” de técnicas — cada estilo específico implementa sua própria versão.

(referência leve ao universo ninja)


🧪 Exemplo de Classe Abstrata + Subclasses

// Classe abstrata
abstract class Ninja {
    // Método abstrato: obrigatoriamente implementado pelas subclasses
    abstract void realizarJutsu();

    // Método concreto compartilhado
    public void apresentar() {
        System.out.println("Sou um ninja treinado.");
    }
}

// Subclasse que implementa o método abstrato
class Uzumaki extends Ninja {
    @Override
    void realizarJutsu() {
        System.out.println("Rasengan!");
    }
}

// Outra subclasse
class Uchiha extends Ninja {
    @Override
    void realizarJutsu() {
        System.out.println("Sharingan ativado!");
    }
}

public class TesteAbstracao {
    public static void main(String[] args) {
        Ninja n1 = new Uzumaki();
        Ninja n2 = new Uchiha();

        n1.apresentar();
        n1.realizarJutsu();

        n2.apresentar();
        n2.realizarJutsu();

        // Ninja n = new Ninja(); // ❌ ERRO — classes abstratas não podem ser instanciadas
    }
}


🧩 Classes Abstratas x Interfaces

Ícone Conceito Características Exemplo
🏗️ Classe Abstrata Pode ter métodos abstratos e concretos; suporta uma única herança abstract class Ninja
📜 Interface Define apenas contratos; suporta múltiplas implementações interface Sensor

👊 Exemplo combinando ambos

// Interface com contrato
interface Sensor {
    void detectar();
}

// Classe abstrata base
abstract class Ninja {
    abstract void realizarJutsu();

    public void apresentar() {
        System.out.println("Sou um ninja treinado.");
    }
}

// Subclasse concreta usando abstrata + interface
class Uzumaki extends Ninja implements Sensor {
    @Override
    void realizarJutsu() {
        System.out.println("Rasengan!");
    }

    @Override
    public void detectar() {
        System.out.println("Detectando energia ao redor...");
    }
}

class Uchiha extends Ninja implements Sensor {
    @Override
    void realizarJutsu() {
        System.out.println("Amaterasu.");
    }

    @Override
    public void detectar() {
        System.out.println("Analisando padrões com precisão.");
    }
}

public class Teste {
    public static void main(String[] args) {
        Sensor s1 = new Uzumaki();
        Sensor s2 = new Uchiha();

        s1.detectar();
        s2.detectar();
    }
}


⚔️ Resumo Final

Tema Classe Abstrata Interface
Pode ser instanciada? ❌ Não ❌ Não
Tem métodos concretos? ✅ Sim ❌ Até Java 7 / ✔️ default a partir do Java 8
Suporta múltiplas heranças? ❌ Não ✔️ Sim
Uso ideal Modelos base Contratos/funcionalidades