Compreendendo Classes Abstratas e Interfaces em Java

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

  1. Não pode ser instanciada: É obrigatório criar uma subclasse para utilizá-la. O operador new não funciona em classes abstratas.
  2. 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.
  3. Métodos concretos: Uma classe abstrata pode ter métodos com implementação completa, que podem ser herdados ou sobrescritos pelas subclasses.
  4. Construtores: São permitidos e utilizados durante a inicialização das subclasses.
  5. Restrições de modificadores: Métodos abstratos não podem ser final, static ou private.

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

  1. 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");
    }
}

  1. Todos os métodos são implicitamente public abstract.
  2. Todas as variáveis são implicitamente public static final.
  3. 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.
  4. 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.
  5. O arquivo compilado de uma interface gera um bytecode com extensão .class.
  6. Classes que não implementam todos os métodos abstratos devem ser declaradas como abstratas.
  7. 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

  1. Classes abstratas suportam métodos concretos e construtores; interfaces, por padrão, não.
  2. 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();

  1. Métodos em classes abstratas podem ser public ou protected. Em interfaces, apenas public é permitido.
  2. 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.

Tags: java Classe Abstrata Interface Orientação a Objetos Polimorfismo

Publicado em 7-10 03:27