Just wanted to summarize previous answers:
Интерфейс - это просто список методов, то есть в нем мы определяем что будут делать наши методы. Как черный ящик: отдаем входные данные и получаем результат, абстрагируясь от того, как будет получен результат.
Обычный класс (реализация интерфейса) - здесь мы определяем как будут работать наши методы.
Абстрактный класс - часть методов абстрактные, т.к. мы не может определить на данном этапе как они будут выполняться, другая часть - обычные методы. Используется в следующих ситуациях:
Пусть у нас есть интерфейс и несколько его реализаций (обычных классов): в интерфейсе будет описан метод для вычисления определенного интеграла Римана а также метод для определения точности результата. Реализаций несколько: метод прямоугольников, метод трапеций, метод Монте-Карло. Создадим 3 обычных класса для 3-х методов, унаследуем эти класса от интерфейса. После реализации можно заметить, что метод для определения точности результата дублируется во всех 3-х классах, следовательно он может быть вынесен на предыдущий уровень иерархии: создаем абстрактный класс унаследованный от нашего интерфейса, реализуем в нем второй метод, а первый оставляем не реализованным (абстрактным). При добавлении нового метода вычисления нам уже не нужно беспокоиться о реализации метода определения точности результата.
Также используется для предотвращения создания объектов данного типа. Если класс объявлен как абстрактный мы не можем создать объект new AbstractClass();
Таким образом абстрактный класс является прослойкой в иерархии между выше стоящим интерфейсом и ниже стоящими реализациями.