Основное отличие интерфейса от абстрактного класса в Java и Kotlin заключается в том, что интерфейс может содержать только абстрактные методы (методы без тела), а абстрактный класс может содержать как абстрактные, так и конкретные методы (методы с телом).
Другими словами, интерфейс определяет только контракт, то есть какие методы должны быть реализованы в классах, которые его реализуют, но не содержит реализацию этих методов. Абстрактный класс же может содержать реализацию некоторых методов и в то же время может определять некоторые абстрактные методы, которые должны быть реализованы в классах-наследниках.
Еще одно отличие заключается в том, что класс может реализовать несколько интерфейсов, но может наследоваться только от одного класса (абстрактного или неабстрактного).
Выбор между использованием интерфейса и абстрактного класса зависит от конкретной ситуации. Если нужно только определить контракт, используют интерфейс, а если нужно определить какую-то общую функциональность для нескольких классов, используют абстрактный класс.