Simply put: an interface is a contract, an abstract class is a skeletal implementation. (In addition, Java interfaces are mainly used because it is not possible to extend multiple classes.)
The contract says that, as stated in the implementation.
Interface example: java.util.List . It has all the methods that any list should have: add() , size() , indexOf() , etc.
An example of an abstract class: java.util.AbstractList . Although it has many abstract methods, some List methods are applied there that do not depend on how the elements are stored in a specific list ( addAll() , equals() , toString() and others). To create a complete implementation, not all List methods must be implemented, which makes it easier to work with developers.
source share