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 abstractpublicabstractclassAnimal{// método abstrato = sem implementaçãopublicabstractvoidfazerSom();// método concreto = com implementaçãopublicvoiddormir(){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
uma classe abstrata não pode ser instanciada diretamente, mas pode ser herdada por outras classes
apenas suas subclasses podem ser instanciadas
Animala=newAnimal();// 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
Uma classe abstrata pode ser instanciada diretamente, desde que seus métodos abstratos sejam implementados.
Uma classe abstrata pode ter tanto métodos abstratos (sem implementação) quanto métodos concretos (com implementação).
Uma classe abstrata pode ter construtores, que podem ser chamados pelas subclasses.
Uma classe abstrata pode ser estendida por outra classe abstrata, mas não por uma classe concreta.
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.
Em Java, uma classe abstrata pode implementar interfaces, mas não pode herdar de outra classe abstrata.
Uma classe abstrata pode ter atributos e métodos com diferentes modificadores de acesso, como private, protected e public.
Diferentemente das interfaces, uma classe abstrata pode ter atributos que não são obrigatoriamente static e final.
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.
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.
Uma classe abstrata não pode ter métodos estáticos.
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.
Uma classe abstrata pode implementar métodos padrão (default) como em interfaces, a partir do Java 8.
Em uma classe abstrata, os métodos abstratos não podem ser private.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.