Qual é o principal propósito de se utilizar classes abstratas?
Classes abstratas
7 Respostas
Até a versão 7 do java, era ter a possibilidade de implementar métodos concretos e forçar as subclasses a implementarem os métodos abstratos.
A partir do java 8, com as functional interfaces, isso se torna um pouco diferente, tendo em vista os default methods.
Classes abstratas é bem parecido com interfaces onde podem conter métodos abstratos para ser implementados nas classes derivadas concretas, mas, a diferença é que classes abstratas pode conter métodos implementados diferente das interfaces que só possui métodos para implementação, ou seja, essa é a diferença entre abstrata e interface.
-
Exemplo básico de classe abstrata:
public abstract class B { public abstract string GetString(); public virtual string GetName() { return GetType().Name; } }
-
Implementando classe abstrata:
public class A : B { public override string GetString() { return GetName().Substring(1, 1); } }
Nesse caso não precisei implementar o GetName() porque já está implementado na classe abstrata.
-
Um exemplo de interface:’
public interface C { int Id { get; set; } string Nome { get; set; } }
Percebe que não tem implementação e isso é uma característica da interface que só define quais métodos serão implementados.
Nota: esse exemplo foi feito em Csharp, não vi tag algum, aparentemente a duvida é num âmbito geral
Uma classe abstrata não permite que ninguém crie uma nova instância de classe. Uma classe abstrata praticamente não tem muita utilidade sem ser estendida. Lembrando que é possível ter métodos abstratos, mas é necessário marcar a classe com abstrata também
Considere as classes
public abstract class Abstrata {
public abstract void saudacao();
}
E
public class TesteAbstrata {
public static void main(String[] args) {
Abstrata abs = new Abstrata() {
public void saudacao() {
System.out.println("Olá");
}
};
abs.saudacao();
}
}
Tente compilá-las.
Na verdade, o princípio é o mesmo para interfaces: você só precisa, obrigatoriamente, implementar todos os métodos abstratos.
Quem disse?
É óbvio que o uso de interfaces é mais interessante e mais recomendado, mas, se o teu modelo é bem feito e você não precisará encapsular, nem expandir a estrutura, pode sim, usar a classe abstrata.
Este é o principal objetivo da classe abstrata. Afinal, qual a coerência em criar-se uma classe abstrata, sem os métodos abstratos?
Agora, o óbvio: a partir do momento que pretendemos criar um modelo coeso e pouco acoplado, é inevitável que o uso de interfaces é monstruosamente mais recomendado.
Fica aí uma discussão sobre as vantagens da functional interfaxce vs abstract class.
Realmente nesse caso sim, mas específico em um caso mais genérico, no qual eu estendo uma classe abstrata, já com seus métodos abstratos implementados e tento criar um novo objeto da classe abstrata, o compilador irá acusar um erro.
Esse é só um caso, realmente não citei com detalhes na resposta, fico agradecido por você demonstrar esses exemplos! 
O seu exemplo foi no C#, mas só abrindo um parenteses no java: a partir do Java 8 é possível ter métodos implementados na interface utilizando o modificador default
Mais isso é um recurso da linguagem, como eu disse na minha resposta como não tem uma tag que faça referencia eu entendo como geral, e no geral não tem isso.
Obrigado por oferecer um item a mais a resposta. (que server exclusivamente pra Java, pelo menos por enquanto e não posso dar uma opinião se isso é bom ou ruim, que seria outro questionamento).