5
respostas

Classes Abstratas

Depois do curso, ficou claro pra mim o benefício do uso de Interfaces, mas fiquei me perguntando em relação a quando seria bom utilizar classes abstratas no nosso código. Com as devidas proporções sempre vi semelhanças em classes abstratas e interfaces. Quais situações são aconselháveis o uso de classes abstratas ? Elas também podem ser utilizadas para diminuir o acoplamento ? Obrigado!

5 respostas

Uma classe Java não pode estender de mais de uma classe (abstrata ou concreta), enquanto que pode implementar diversas interfaces.

Até o Java 7, as interfaces não podiam implementar corpo dos métodos, enquanto que classes abstratas podem ter métodos com corpo (concretos) e métodos sem corpo (abstratos).

Oi Daniel, estou ciente dessas diferenças. Minha dúvida é mais quando usar, no curso vimos o uso de Interfaces para diminuir o acoplamento e vimos alguns problemas relacionados a Herança. Mas não foi muito abordado a questão de classes abstratas e fiquei na dúvida de quando elas seriam úteis em que situações o uso delas ajudaria o programador.

Rui,

Classes abstratas são muito utilizadas quando parte dela já deve existir uma implementação.

Por exemplo, Uma interface chamada Imposto pode ter um método chamado calcular();

Todas as classes que implementar o Imposto, devem implementar o método calcular();

Supondo a interface tenha também o método enviarEmail(), porém, todos os impostos enviam email da mesma maneira. Para não precisar implementar esse método em todos as classes que implementaram Imposto, basta você transformá-la em uma classe abstrata e implementar o método enviarEmail(). Dessa forma, todas as classes terão essa implementação por padrão. (E caso a forma de enviar email mude, não será preciso alterar código).

Entrando na discussão, com o Java 8 surgiu o conceito de métodos default em interfaces. Com isso o grande argumento para o uso de classes abstratas meio que se perdeu. Qual seria, agora, a principal razão para se utilizar classes abstratas?

Olá pessoal,

Giovani, o Java 8 traz sim, de fato, os Default Methods. Entretanto, lembre-se de que, em uma Interface, não é possível declarar variáveis a menos que sejam constantes. Diante deste cenário, estes métodos 'default' são úteis apenas para chamar outros métodos sem manipular o estado do objeto. As classes abstratas, no entanto, podem fazer alterações no estado do objeto (ou seja, nas propriedades dele).