1. Interface - это контракт системы с внешним окружением. Более Java-специфично: контракт для класса на определенное поведение реализованный в форме напоминающей полностью абстрактный класс.
Применять всегда. Это основной способ реализации абстракции.
2. Abstract class - это шаблон для группы классов кот. не может быть инстанциирован т.к. не содержит полного описания поведения (может содержать частичное).
Применять только в специфических случаях, когда нужно какое-то стостояние в абстракции.
Конкретные различия можно посмотреть тут:
https://ru.stackoverflow.com/a/1229336/258227