Интерфейс - это контракт.Он говорит, что будет у реализующего объекта (как минимум), но это все.Там написано: «В этом доме будет дверь, окно и дымоход».
Абстрактный класс больше похож на сборный дом.Он не завершен (вы должны добавить свой собственный сайдинг, например), но в нем уже есть детали (есть место для двери, но весь камин уже настроен.
Проблема с вводом кода винтерфейсы - это множественное наследование. Java не позволяет этого. У вас может быть класс, реализующий много интерфейсов, потому что интерфейсы только обещают, что будет метод с заданной сигнатурой.
Если интерфейсы содержат код, то вы можете реализовать3 из них, каждый с телом метода для myUsefulFunction (String thing) ... и теперь вы не знаете, какой из них вызывается.
Вот почему абстрактные классы могут иметь методы bodys (потому что вы можете расширять толькоодин класс), но интерфейсы не могут (потому что вы можете реализовать несколько интерфейсов).