When to use interfaces vs abstract classes in Java?
Interfaces and abstract classes both provide a framework for future specific classes while also enforcing certain criteria to be met, but they do it in different ways. 1. **Interface**: An interface is a contract that defines a set of methods that the implementing class must have. It can't have any state or behavior, it's effectively a 100% abstract class. You can implement multiple interfaces, which offers a form of multiple-inheritance. When to use: Use interfaces when you want to define the role that other classes should play, regardless of where they sit in the class hierarchy. Also, use when your blueprint needs to be implemented by classes which are not related to each other (i.e., not from the same class tree). 2. **Abstract Class**: An abstract class, on the other hand, provides a default behavior that can be shared among multiple classes. You can define fields (state) and concrete methods (behavior) in an abstract class. An abstract class can carry partially implemented methods. However, you can only extend one abstract class, due to Java's single inheritance model. When to use: Use abstract classes when you have a clear, hierarchical structure and when you need to provide common behavior and/or default state that subclasses can inherit or override. Remember, the choice between abstract classes and interfaces isn't just about technical differences, but also about expressing your design intent.