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.
🏗️ Vários construtores na mesma classe
Cada um possui uma combinação única de parâmetros (quantidade, tipo ou ordem).
🎛️ Flexibilidade na criação de objetos
Permite instanciar a classe com diferentes níveis de informação.
♻️ Reutilização de código
Um construtor pode chamar outro usando this(...).
✔️ Organização e clareza
Torna o código mais legível, evitando duplicação e facilitando manutenção.
📘 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).
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();
}
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.");
}
}
| 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. |