✅Conceito de Classes e Métodos Abstratos
- É uma classe que não pode ser instanciada.
- Pode ter métodos com ou sem corpo (abstratos).
- Pode ter construtores, atributos e métodos concretos (com implementação).
- Usada como base para outras classes que estendem e completam a lógica.
abstract class Animal {
abstract void emitirSom(); // método abstrato
void dormir() {
System.out.println("Dormindo...");
}
}
✅ O que é um método abstrato?
- É um método sem corpo, ou seja, sem implementação.
- A classe que o contém deve ser abstrata.
- As subclasses concretas devem implementar todos os métodos abstratos.
❌ Coisas que DÃO ERRO (com explicação)
❌ Tentar instanciar uma classe abstrata
Animal a = new Animal();
// ERRO: Animal é abstrata
❌ Declarar método abstrato em classe concreta
class Ave {
abstract void voar();
// ERRO: a classe precisa ser abstrata
}
❌ Método abstrato com corpo
abstract class Peixe {
abstract void nadar() {
// ERRO: não pode ter corpo
System.out.println("Nadando");
}
}
❌ Classe concreta que herda método abstrato e não implementa
abstract class Animal {
abstract void emitirSom();
}
class Gato extends Animal {
// ERRO: método abstrato não implementado
}
⚠️ Pegadinhas de Prova
⚠️ 1. Método final não pode ser abstract
abstract class Teste {
final abstract void algo();
// ERRO: final não permite sobrescrita
}
⚠️ 2. static, private e final não podem ser usados com abstract
abstract class A {
private abstract void m(); // ERRO
static abstract void n(); // ERRO
final abstract void o(); // ERRO
}
⚠️ 3. Uma classe abstrata pode ter construtor
abstract class Carro {
Carro() {
System.out.println("Construindo carro");
}
}
✅ Funcionamento correto de classes Abstratas
✅ 1. Classe abstrata com métodos concretos
abstract class Animal {
abstract void emitirSom();
void comer() {
System.out.println("Comendo");
}
}
✅ 2. Subclasse concreta implementa todos os métodos abstratos
class Vaca extends Animal {
@Override
void emitirSom() {
System.out.println("Muuu");
}
}
✅ 3. Subclasse pode ser abstrata também (sem implementar tudo)
abstract class Ave extends Animal {
// ainda não implementou emitirSom
}
📝 Simulado com Respostas
🚀 Clique nas perguntas para ver as respostas, tente resolver primeiro.🏋️♀️
1) Qual das opções abaixo é verdadeira sobre classes abstratas?
✅ Resposta: C
A) Classes abstratas não podem ter métodos concretos.
B) Classes abstratas sempre devem ser herdadas.
C) Classes abstratas podem ter construtores.
D) Métodos abstratos podem ser private.
2) O que acontece ao compilar este código?
✅ Resposta: Erro de compilação. A classe Cavalo não implementa o método abstrato som().
abstract class Animal {
abstract void som();
void dormir() {
System.out.println("Zzz");
}
}
class Cavalo extends Animal {}
3) Qual das opções causa erro?
✅ Resposta: Erro. m2() não foi implementado.
abstract class Teste {
abstract void m1();
abstract void m2();
}
class Concreta extends Teste {
void m1() {}
}
4) É possível instanciar uma classe abstrata?
✅ Resposta: Não. Ex: new Animal() → erro de compilação.
5) O código abaixo compila?
✅ Resposta: Sim. Classes abstratas podem ter métodos com corpo.
abstract class A {
void metodo() {}
}
6) O que acontece neste caso?
✅ Resposta: Compila e funciona. A classe B implementa corretamente m().
abstract class A {
abstract void m();
}
class B extends A {
void m() {}
}
7) É válido declarar um método abstract como static?
✅ Resposta: Não. Métodos abstratos não podem ser static.
8) O que acontece se uma classe filha também for abstrata?
✅ Resposta: Compila. A responsabilidade de implementar m() fica para a próxima subclasse concreta.
abstract class A {
abstract void m();
}
abstract class B extends A {
// sem implementar m()
}
9) O seguinte código é válido?
✅ Resposta: Sim. Classes abstratas podem ter construtores.
abstract class A {
A() {
System.out.println("Construtor A");
}
}
10) Assinale a alternativa incorreta:
✅ Resposta: C (incorreta).
A) Classes abstratas podem conter atributos.
B) Classes abstratas podem conter métodos concretos.
C) Classes abstratas não podem ter construtores.
D) Métodos abstratos não têm corpo.
11) Considere o seguinte código:
abstract class Animal {
abstract void fazerSom();
}
class Gato extends Animal {
void fazerSom() {
System.out.println("Miau");
}
}
12) O que ocorre ao escrevermos o código abaixo no método main() e compilarmos?
✅ Resposta: C
Comentário: Não é possível instanciar uma classe abstrata diretamente. Isso gera erro de compilação.
A) Compila e imprime “Miau”
B) Erro em tempo de execução
C) Erro de compilação
D) Compila e não imprime nada
13) Qual das opções abaixo é inválida em relação a métodos abstratos?
✅ Resposta: C
Comentário: Um método abstract não pode ser private, pois precisa ser sobrescrito pelas subclasses.
A) Podem estar em classes abstratas
B) Podem ser sobrescritos por subclasses
C) Podem ser private
D) Não podem ter corpo
14) Assinale a afirmativa correta:
✅ Resposta: C
Comentário: Classes abstratas podem conter métodos estáticos, métodos concretos e construtores.
A) Classes abstratas só podem conter métodos abstratos
B) Classes abstratas não podem conter construtores
C) Classes abstratas podem conter métodos estáticos
D) Classes abstratas precisam ser herdadas por pelo menos uma subclasse concreta
15) O que acontece ao tentar compilar o seguinte código?
✅ Resposta: B
Comentário: Métodos abstract não podem ter corpo.
abstract class Exemplo {
abstract void executar() {}
}
A) Compila normalmente
B) Erro de compilação: método abstrato não pode ter corpo
C) Erro de compilação: classe abstrata não pode conter métodos
D) Compila, mas gera erro em tempo de execução
16) Dado o código:
abstract class Forma {
abstract double calcularArea();
}
abstract class Forma2D extends Forma {
// Nenhuma implementação
}
17) É correto afirmar que:
✅ Resposta: C
Comentário: Como Forma2D também é abstrata, ela não precisa implementar o método abstrato da superclasse.
A) Forma2D precisa implementar calcularArea()
B) Forma2D não compila
C) Forma2D pode permanecer abstrata sem erro
D) Forma2D só compila se for final
18) Qual alternativa causa erro de compilação?
✅ Resposta: A
Comentário: protected é mais permissivo que o default (package-private) e a sobrescrita está correta.
abstract class Animal {
abstract void mover();
}
class Peixe extends Animal {
protected void mover() {
System.out.println("Nadando");
}
}
A) O código compila normalmente
B) A visibilidade do método está incorreta
C) Peixe precisa ser abstrata
D) mover() não pode ser sobrescrito
19) Dado o código:
abstract class Pai {
abstract void metodo();
}
class Filho extends Pai {
final void metodo() {}
}
Esse código:
✅ Resposta: A
Comentário: É totalmente válido sobrescrever um método abstrato e torná-lo final, impedindo novas sobrescritas futuras.
A) Compila e funciona
B) Compila, mas o método final não será executado
C) Gera erro, pois não se pode sobrescrever método abstrato como final
D) Gera erro, pois final não pode ser usado em métodos
20) É possível declarar um método abstract como static?
✅ Resposta: C
Comentário: Métodos static não podem ser abstratos, pois não participam do polimorfismo de instância.
A) Sim, mas só se for final também
B) Sim, mas ele precisa ser implementado imediatamente
C) Não, pois static e abstract são incompatíveis
D) Sim, desde que a classe também seja final
21) O que acontece se uma classe abstrata não tiver nenhum método abstrato?
✅ Resposta: C
Comentário: Classes abstratas podem não ter métodos abstratos, sendo usadas como base para impedir instância direta.
A) Erro de compilação
B) Compila, mas é considerada inválida
C) Compila normalmente
D) Só pode ser usada como interface
22) O seguinte código compila?
✅ Resposta: B
Comentário: A classe Sub criou uma sobrecarga e não sobrescreveu o método executar(). Isso gera erro de compilação.
abstract class Base {
abstract void executar();
}
class Sub extends Base {
void executar(int a) {}
}
A) Sim, executar está implementado
B) Não, executar() não foi implementado corretamente
C) Sim, pois overload é suficiente
D) Não compila, pois a assinatura é diferente