A sobrecarga de construtores é um recurso fundamental da Programação Orientada a Objetos, permitindo criar vários construtores dentro da mesma classe, cada um preparado para inicializar objetos em diferentes contextos.


🔑 O que é Sobrecarga de Construtores?

📘 Exemplo cotidiano: Você pode criar um ninja apenas com nome, ou com nome + aldeia + atributos adicionais (referência leve ao universo Naruto para manter a estética do curso).


🧩 Exemplo Didático: Classe Ninja com Sobrecarga

package Polimorfismo;

public abstract class Ninja implements EstrategiaDeBatalha {

    // Atributos comuns
    String nome;
    String aldeia;
    int idade;
    int numeroDeMissoesConcluidas;
    NivelNinja rank; // GENNIN, CHUNNIN, JOUNNIN, KAGE

    // 🛠️ Construtor vazio (No-Args)
    public Ninja() {
    }

    // 🎯 Construtor básico
    public Ninja(String nome, String aldeia, int idade) {
        this.nome = nome;
        this.aldeia = aldeia;
        this.idade = idade;
    }

    // ♻️ Sobrecarga com reuso usando this()
    public Ninja(String nome, String aldeia, int idade, int numeroDeMissoesConcluidas, NivelNinja rank) {
        this(nome, aldeia, idade); // reaproveitando o construtor básico
        this.numeroDeMissoesConcluidas = numeroDeMissoesConcluidas;
        this.rank = rank;
    }

    // Método comum
    public void habilidadeEspecial() {
        System.out.println("Meu nome é " + nome + " e este é meu ataque especial!");
    }

    // Método abstrato (obrigatório nas subclasses)
    public abstract void realizarJutsu();
}


🌱 Subclasses que utilizam a Sobrecarga

As subclasses herdam automaticamente os construtores sobrecarregados da superclasse, bastando chamar super(...).

class Uzumaki extends Ninja {

    public Uzumaki(String nome, String aldeia, int idade) {
        super(nome, aldeia, idade);
    }

    public Uzumaki(String nome, String aldeia, int idade, int missoes, NivelNinja rank) {
        super(nome, aldeia, idade, missoes, rank);
    }

    @Override
    public void realizarJutsu() {
        System.out.println(nome + " executa um poderoso jutsu!");
    }
}

class Uchiha extends Ninja {

    public Uchiha(String nome, String aldeia, int idade) {
        super(nome, aldeia, idade);
    }

    public Uchiha(String nome, String aldeia, int idade, int missoes, NivelNinja rank) {
        super(nome, aldeia, idade, missoes, rank);
    }

    @Override
    public void realizarJutsu() {
        System.out.println(nome + " ativa uma técnica ocular avançada.");
    }
}


🎯 Por que usar Sobrecarga de Construtores?

Benefício Explicação
🔧 Flexibilidade Permite criar objetos simples ou completos, dependendo da necessidade.
🛠️ Reuso de código Minimiza duplicação usando this() para centralizar lógica de inicialização.
🧩 Organização Garante clareza, especialmente em classes com muitos atributos.
👥 Modelagem eficaz Facilita representar entidades com diferentes níveis de informação.

🚀 Resumo