Vamos construir:

✔️ Uma classe abstrata Ninja

✔️ Métodos abstratos e concretos

✔️ Subclasses como Uzumaki, Uchiha, Hyuga

✔️ Demonstração de Polimorfismo em tempo de execução

✔️ Demonstração de Polimorfismo em tempo de compilação (sobrecarga)


🏯 1. Classe Abstrata – Ninja (Abstração)

abstract class Ninja {

    protected String nome;
    protected String aldeia;

    public Ninja(String nome, String aldeia) {
        this.nome = nome;
        this.aldeia = aldeia;
    }

    // Método abstrato → obrigatório para subclasses
    abstract void usarJutsu();

    // Método concreto → comportamento comum
    public void seApresentar() {
        System.out.println("Sou " + nome + " da aldeia " + aldeia + ".");
    }
}

O que está acontecendo aqui?


🔥 2. Subclasses — Especialização + Sobrescrita

Uzumaki

class Uzumaki extends Ninja {

    public Uzumaki(String nome) {
        super(nome, "Konoha");
    }

    @Override
    void usarJutsu() {
        System.out.println(nome + " usa o Rasengan!");
    }
}

Uchiha

class Uchiha extends Ninja {

    public Uchiha(String nome) {
        super(nome, "Konoha");
    }

    @Override
    void usarJutsu() {
        System.out.println(nome + " ativa o Sharingan e usa Chidori!");
    }
}

Hyuga