When talking about Abstract classes VS. Interface classes, things can admittedly become confusing. On the surface level, it seems as if they both do exactly the same thing without any differences. However, there are plenty of key differences between the two.

One of the key differences between Abstract & Interface classes is how they are used. Abstract classes should be used when you know partial implementation of a class AND specifications for that class. In essence, you use Abstract when you want to implement a method, but dont know all of the methods that are used. Abstract classes are created using the keyword abstract, and used with the keyword extends. This keyword is used because the abstract class will act as an extension to the class using it, and taking in the concrete methods that are made within the abstract class.
The Interface differs because it has no concrete methods inside of it, essentially acting as an empty class that passes through empty methods. The keyword interface is used to create the interface, and implements is used. Interfaces are used when you know what the specifications are, but you dont know how to implement the methods in said classes.