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