Отличия абстрактного класса от интерфейса?
============================================

 В чем отличие абстрактного класса от интерфейса в Java? И в каких ситуациях лучше применять абстрактный класс, а в каких - интерфейс? 

> В чем отличие абстрактного класса от интерфейса в Java?

  
  

Все упирается в понятие "тип". В былые времена, то есть во времена языка Simula, из которого черпали вдохновение создатели C++, были только классы. И на классах базировалась система типов. Причем механизм наследования был реализован так, как реализован, исключительно для экономии памяти, которая в те времена была очень дорогой.  
  

Для того чтобы достичь полиморфизма, мы должны иметь возможность объявлять абстрактные типы. Мол "любая хрень которая имеет такой тип будет работать как надо". Потому в языках типа C++ появились абстрактные классы. Поскольку иногда нам хочется делать композицию абстрактных типов, в C++ реализовали множественное наследование.  
  

В Java, которая во многом черпала вдохновения из C++ и smalltalk, решили ввести еще одну сущность - интерфейсы. Это был своего рода упрощенный способ задать абстрактный базовый тип. По итогу чтобы не решать проблему бриллианта (или ромба) от множественного наследования было решено отказаться и дать возможность классам имплементить несколько интерфейсов.  
  

За счет этого мы получаем возможность делать композицию типов как мы захотим. То есть вся разница сводится к тому, что при наследовании от абстрактного класса, мы именно наследуем классы, в то время как интерфейсы позволяют нашим классам имплементить абстрактные типы.  
  

В целом абстрактные классы нужны тогда, когда вам нужно наследование. Обычно это в ситуациях, когда у вас есть несколько классов, которые должны иметь общий абстрактный тип (то есть нельзя выделить наиболее слабого по ограничениям предка). Например если мы делаем цепочку классов String <- Email, то тут нет смысла в абстрактных классах так как тип String уже включает в себе подмножество типов Email.  
  

В целом в java8 уже ввели возможность интерфейсам иметь базовую реализацию, так что не удивлюсь если со временем от ключевого слова extends в принципе откажутся, избавившись от лишней сущности.  
  

Так же рекомендую к прочтению: [www.javaworld.com/article/2073649/core-java/why-ex...](http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html) 

 Если выражаться "проще википедии", то главная разница между абстрактным классом и интерфейсом в том, что интерфейсы можно множественно наследовать, а абстрактные классы могу содержать не абстрактные вещи.  
  

Что касается их использования... тут все гораздо проще, если понимать, зачем нужен абстрактный класс, а зачем - интерфейс. Абстрактный класс используется, когда мы хотим получить конкретную реализацию, но она должна гибкой. Интерфейс используется, чтоб реализация этой вещи вообще была. 

 Интерфейсы используются для множественного наследования. В интерфейсе нельзя прописывать реализацию методов. Этими ограничениями мы исключаем одну из проблем множественного наследования: если мы наследуемся от 2 классов с одинаковым методом (такое в с++ возможно), то вызывая этот метод в наследнике, то непонятно какую реализацию использовать. Наследуясь от нескольких интерфейсов, мы пишем реализацию конкретно под наш класс и эта проблема исключается. 

 Всё уже есть в википедии: 
> Интерфейс — это просто чистый абстрактный класс, то есть класс, в котором не определено ничего, кроме абстрактных методов.

 

 Абстрактный класс содержит абстрактные методы с общим функционалом, который будет логичен для методов его наследников(смотри в сторону принцип подстановки Барбары Лискоу). Интерфейс же просто описывает возможности. 

 1. Interface - это контракт системы с внешним окружением. Более Java-специфично: контракт для класса на определенное поведение реализованный в форме напоминающей полностью абстрактный класс.  

Применять всегда. Это основной способ реализации абстракции.  

  

2. Abstract class - это шаблон для группы классов кот. не может быть инстанциирован т.к. не содержит полного описания поведения (может содержать частичное).   

Применять только в специфических случаях, когда нужно какое-то стостояние в абстракции.  

  

Конкретные различия можно посмотреть тут: <https://ru.stackoverflow.com/a/1229336/258227>