Boa noite (ou bom dia) para todos!
Estou atualmente estudando alguns conceitos de Programação Orientada a Objetos, a linguagem Java e como conceito e linguagem se relacionam.
Enfim, notei que na linguagem Java há 2 palavras reservadas que distinguem como uma Classe pode ser utilizada. São elas:
1 - Abstract: quando uma Classe é abstrata, a mesma não pode ser instanciada em tempo de execução. Nenhum objeto pode ser criado.
2 - Final: quando uma classe é final, a mesma não pode ser herdada. Não pode possuir sub-classes.
O Java não permite a existência de uma classe que possua a seguinte assinatura:
public abstract final class Exemplo { ... }
ou
public final abstract class Exemplo { ... }
Talvez do ponto de vista conceitual, não seja relevante ter uma classe com essa formatação, afinal, não poderia ser herdada e muito menos instanciada. Não teria real valor para abstração. Contudo, elas podem sim ser bem uteis para quando possuímos classes utilitárias.
Uma classe utilitária, geralmente não precisa ser herdada e muito menos instanciada, pois todos os seus métodos são estáticos.
Por curiosidade, caso precisemos ter uma classe “abstract final” podemos simplesmente tornar o construtor da mesma privado. Uma classe com o construtor privado, não pode ser herdada e também não pode ser instanciada.
1 - Uma classe que possui o construtor privado não pode ser herdada, pois no momento que uma sub-classe fosse instanciada, o construtor dessa sub-classe dependeria de criar em memória a super-classe primeiro, para isso o construtor da super-classe teria de ser invocado. Afinal, um objeto filho não pode existir sem ou antes de seus objetos pais.
2 - Uma classe que possui o construtor privado não pode ser instanciada, pois após a construção do objeto hipotético, talvez seu estado não tivesse viabilidade prática para a funcionalidade que deve ser exercida, e que por causa disso, erros em tempo de execução poderiam ser causados por estados arbitrários. Também, se o new não consegue acessar o método de construção da classe pretendida, um objeto não pode ser construído em memória heap e se o objeto não pode ser construído, o new não pode retornar nenhum valor de memória para futura referencia do objeto no contexto em que a instancia foi invocada.
O que vocês acham? Já pararam para pensar sobre isso? Qual a opinião de vocês?
Obrigado pela atenção.