Skip to content

Classes Abstratas

Introdução

  • classe abstrata = classe que não pode ser instanciada diretamente e serve como base para outras classes
    • permitindo a implementação parcial de comportamentos e exige a implementação de métodos abstratos nas subclasses
  • definida com a palavra-chave abstract
  • pode conter
    • métodos abstratos = sem implementação
      • devem ser implementados nas subclasses concretas
    • métodos concretos = com implementação
      • podem ser herdados diretamente pelas subclasses
  • propósito principal de uma classe abstrata = fornecer uma estrutura comum para suas subclasses
  • as subclasses devem implementar os métodos abstratos, mas podem também herdar comportamentos concretos
// classe abstrata - detectável pela palavra chave abstract
public abstract class Animal {
    // método abstrato = sem implementação
    public abstract void fazerSom();

    // método concreto = com implementação
    public void dormir() {
        System.out.println("Dormindo...");
    }
}
  • quando usar classes abstratas
    • quando se deseja criar uma estrutura comum para várias classes que compartilham funcionalidades, mas que também precisam implementar comportamentos específicos
    • quando se precisa de uma implementação parcial de métodos, que podem ser completados pelas subclasses
    • quando não se quer permitir que a classe base seja instanciada diretamente
// subclasse
public class Cachorro extends Animal {
    @Override
    public void fazerSom() {
        System.out.println("Latido");
    }
}

Classes abstratas x interfaces

Característica Classe Abstrata Interface
Métodos Pode ter métodos abstratos (sem implementação) e concretos (com implementação) Todos os métodos são abstratos (antes do Java 8). Após Java 8, pode ter métodos default e estáticos
Herança Uma classe pode estender apenas uma classe abstrata Uma classe pode implementar várias interfaces
Construtores Pode ter construtores Não pode ter construtores
Atributos Pode ter atributos de qualquer tipo (privados, protegidos, públicos) Só pode ter atributos public static final
Objetivo Fornecer uma implementação parcial e exigir que as subclasses completem a implementação Definir um contrato que as classes implementadoras devem seguir
Visibilidade dos Métodos Pode ter métodos de diferentes níveis de acesso (public, protected, private) Os métodos são implicitamente públicos

Observações importantes

  • uma classe abstrata não pode ser instanciada diretamente, mas pode ser herdada por outras classes
    • apenas suas subclasses podem ser instanciadas
Animal a = new Animal();  // Erro: Animal é uma classe abstrata.
  • herança = uma classe abstrata pode ser herdada por outras classes - que podem ser concretas ou abstratas -, mas uma classe concreta só pode herdar uma classe abstrata
    • isso limita o uso da herança múltipla
  • subclasses abstratas = uma classe abstrata pode ser estendida por outra classe abstrata, que pode ter seus próprios métodos abstratos ou concretos
  • diferença com interfaces
    • classes abstratas = podem ter implementação de métodos e membros de qualquer tipo
    • interfaces = apenas definem o contrato (métodos abstratos) - a partir do Java 8, podem ter métodos default e static

Exercícios

Questões

  1. Uma classe abstrata pode ser instanciada diretamente, desde que seus métodos abstratos sejam implementados.
  2. Uma classe abstrata pode ter tanto métodos abstratos (sem implementação) quanto métodos concretos (com implementação).
  3. Uma classe abstrata pode ter construtores, que podem ser chamados pelas subclasses.
  4. Uma classe abstrata pode ser estendida por outra classe abstrata, mas não por uma classe concreta.
  5. Uma classe abstrata é usada quando se deseja fornecer uma implementação comum para várias subclasses, mas também exige que as subclasses implementem seus próprios métodos abstratos.
  6. Em Java, uma classe abstrata pode implementar interfaces, mas não pode herdar de outra classe abstrata.
  7. Uma classe abstrata pode ter atributos e métodos com diferentes modificadores de acesso, como private, protected e public.
  8. Diferentemente das interfaces, uma classe abstrata pode ter atributos que não são obrigatoriamente static e final.
  9. Se uma classe herda de uma classe abstrata, ela é obrigatória a implementar todos os métodos abstratos da classe abstrata, a menos que também seja abstrata.
  10. As classes abstratas são mais flexíveis do que interfaces, porque podem fornecer implementação concreta e variada de métodos, e suas subclasses podem ser concretas ou abstratas.
  11. Uma classe abstrata não pode ter métodos estáticos.
  12. Uma classe abstrata pode ser usada para representar um conceito genérico que será detalhado em classes específicas, sem permitir a criação de instâncias diretas.
  13. Uma classe abstrata pode implementar métodos padrão (default) como em interfaces, a partir do Java 8.
  14. Em uma classe abstrata, os métodos abstratos não podem ser private.
  15. Uma classe abstrata é ideal quando se deseja que todas as subclasses compartilhem um comportamento comum e, ao mesmo tempo, ofereçam implementações específicas para métodos abstratos.

Gabarito

  1. Falso: uma classe abstrata não pode ser instanciada diretamente, mesmo que seus métodos abstratos sejam implementados. Ela precisa ser instanciada através de uma subclasse concreta que implemente todos os métodos abstratos.
  2. Verdadeiro: uma classe abstrata pode conter tanto métodos abstratos (sem implementação) quanto métodos concretos (com implementação). Isso permite que a classe forneça comportamentos comuns, enquanto ainda exige que as subclasses implementem certos métodos.
  3. Verdadeiro: uma classe abstrata pode ter construtores. Esses construtores podem ser chamados pelas subclasses, mas a classe abstrata em si não pode ser instanciada diretamente.
  4. Falso: uma classe abstrata pode ser estendida por outra classe abstrata ou concreta. Se for uma classe abstrata, a classe que herdar dela também precisará ser abstrata ou implementar todos os métodos abstratos.
  5. Verdadeiro: classes abstratas são usadas para fornecer uma implementação comum (com métodos concretos) e exigir que as subclasses implementem seus próprios métodos abstratos. Isso oferece flexibilidade e padronização.
  6. Falso: uma classe abstrata pode herdar de outra classe abstrata. Ela pode implementar interfaces, mas pode estender outra classe abstrata também. Não há restrição quanto a isso.
  7. Verdadeiro: uma classe abstrata pode ter atributos e métodos com diferentes modificadores de acesso, como private, protected e public, assim como qualquer outra classe em Java. Isso permite controlar o acesso a seus membros.
  8. Verdadeiro: diferente das interfaces, uma classe abstrata pode ter atributos de instância que não são static e final. Isso oferece mais flexibilidade na definição de atributos.
  9. Verdadeiro: quando uma classe herda de uma classe abstrata, ela é obrigada a implementar todos os métodos abstratos da classe abstrata, a menos que a própria classe seja abstrata. Neste caso, ela pode deixar a implementação para suas subclasses.
  10. Verdadeiro: classes abstratas são mais flexíveis do que interfaces porque podem fornecer implementações concretas de métodos, além de permitirem herança de atributos e métodos. As subclasses podem ser concretas ou abstratas, dependendo da implementação.
  11. Falso: uma classe abstrata pode ter métodos estáticos, assim como qualquer outra classe. Métodos estáticos em uma classe abstrata funcionam da mesma forma que em classes concretas, e não são obrigados a ser abstratos.
  12. Verdadeiro: uma classe abstrata pode ser usada para representar um conceito genérico que será detalhado em classes mais específicas. Ela não permite a criação de instâncias diretas, mas fornece um modelo que pode ser extendido.
  13. Falso: apenas interfaces podem ter métodos padrão (default) a partir do Java 8, e não classes abstratas. Classes abstratas podem ter métodos concretos com implementação, mas não podem ter métodos padrão como as interfaces.
  14. Verdadeiro: os métodos abstratos em uma classe abstrata não podem ser private, pois precisam ser acessíveis pelas classes filhas. O modificador de acesso para um método abstrato geralmente é public ou protected.
  15. Verdadeiro: uma classe abstrata é ideal para fornecer um comportamento comum a várias subclasses, enquanto ainda exige que as subclasses forneçam implementações específicas de certos métodos abstratos.