Uma classe abstrata em Java atua como um modelo base para outras classes. Ela não pode ser instanciada diretamente e serve para estabelecer um contrato e fornecer implementações comuns às suas subclasses.
A declaração utiliza a palavra-chave abstract, tanto na classe quanto em métodos que não possuem corpo:
public abstract class Veiculo {
public abstract void acelerar();
}
Características Principais
- Não pode ser instanciada: É obrigatório criar uma subclasse para utilizá-la. O operador
newnão funciona em classes abstratas. - Métodos abstratos: Possuem apenas a assinatura, sem implementação. Toda subclasse concreta deve sobrescrevê-los. Se a subclasse também for abstrtaa, a obrigatoriedade é repassada.
- Métodos concretos: Uma classe abstrata pode ter métodos com implementação completa, que podem ser herdados ou sobrescritos pelas subclasses.
- Construtores: São permitidos e utilizados durante a inicialização das subclasses.
- Restrições de modificadores: Métodos abstratos não podem ser
final,staticouprivate.
Purpose
Melhoram a manutenibilidade e a escalabilidade do código, sando ideais para arquiteturas em camadas e reutilização de lógica. Também adicionam uma camada adicional de validação ao polimorfismo dinâmico.
Interfaces
Interfaces definem um conjunto de assinaturas de métodos sem fornecer implementação. São declaradas com a palavra-chave interface, e a implementação é feita com implements.
Por convenção, nomes de interfaces começam com a letra I maiúscula e costumam utilizar palavras adjetivas. Segundo normas comuns de codificação, métodos e atributos em interfaces não necessitam de modificadores explícitos.
Características Principais
- Não pode ser instanciada e métodos não têm implementação:
interface IImprimivel {
void imprimir();
// Erro de compilação: não é permitido implementar
void imprimir() {
System.out.println("texto");
}
}
- Todos os métodos são implicitamente
public abstract. - Todas as variáveis são implicitamente
public static final. - Ao sobrescrever métodos da interface, é obrigatório o uso de
public, pois a visibilidade não pode ser mais restritiva que a definida na interface. - Não possui blocos estáticos de inicialização (antes do Java 8) nem construtores, já que interfaces são puramente conceitos abstratos e não criam objetos diretamente.
- O arquivo compilado de uma interface gera um bytecode com extensão
.class. - Classes que não implementam todos os métodos abstratos devem ser declaradas como abstratas.
- Java permite implementação múltipla de interfaces, contornando a limitação de herança simples.
interface IVoavel {
void decolar();
}
interface INadavel {
void mergulhar();
}
class Hidroaviao implements IVoavel, INadavel {
@Override
public void decolar() {
System.out.println("Hidroavião ganha altitude.");
}
@Override
public void mergulhar() {
System.out.println("Hidroavião navega na água.");
}
}
Herança entre Interfaces
Interfaces podem herdar de múltiplas outras interfaces utilizando extends:
interface IHibrido extends IBaseA, IBaseB {
// métodos adicionais
}
Comparação: Classe Abstrata x Interface
- Classes abstratas suportam métodos concretos e construtores; interfaces, por padrão, não.
- Nenhuma das duas pode ser instanciada diretamente, mas ambas podem receber referências de objetos de subclasses concretas:
Base base = new Derivada();
IContrato contrato = new Derivada();
- Métodos em classes abstratas podem ser
publicouprotected. Em interfaces, apenaspublicé permitido. - Atributos em interfaces são sempre
public static final. Em classes abstratas, os membros têm visibilidade padrão, podendo ser modificados ou redefinidos nas subclasses.