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.
🔒 Não podem ser instanciadas diretamente
(não é possível fazer new Ninja()).
🏗️ Servem como base para outras classes.
⚙️ Podem ter:
🎯 Obrigam as subclasses a implementar métodos importantes.
💡 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)
// 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
}
}
| Í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 |
// 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();
}
}
| 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 |