In Java, there are two ways to hide the complicated parts of a program and only show the important parts: abstract classes and interfaces.
An interface can only have abstract methods, which means they don't have a body with instructions on what to do. An abstract class can have both abstract and non-abstract methods. It can also have final, non-final, static, and non-static variables.
When you use an interface, all the methods must be implemented by the class that uses it. This is called total abstraction. A class can implement multiple interfaces, which is called multiple inheritance.
When you use an abstract class, it's good if you have related classes that need to share some code. You can put that code in the abstract class and have the related classes extend it. You can also have non-static or non-final fields in an abstract class. This is useful when you want to modify the state of the object.
In summary, you should use an interface when you want total abstraction and a class can implement multiple interfaces. You should use an abstract class when you have related classes that share some code and need to modify the state of an object.
For example, let's say you're building a program that has different types of animals. You could create an interface called "Animal" that has methods for "eat" and "move". Then, you could have a class called "Dog" that implements the "Animal" interface and has its own unique methods for "bark" and "fetch". Alternatively, you could create an abstract class called "Mammal" that has methods for "eat" and "move" that are common to all mammals. Then, you could have classes for "Dog", "Cat", and "Horse" that extend the "Mammal" abstract class and have their own unique methods.