I have come across the term "programming to an interface instead of an implementation" a lot, and I think I kind of understand what it means. But I want to make sure I understand it's benefits and it's possible implementations. "Programming to an interface" means, that when possible, one should refer to a more abstract level of a class (an interface, abstract class, or sometimes a superclass of some sort), instead of refering to a concrete implementation. A common example in Java, is to use: `List myList = new ArrayList();` instead of `ArrayList myList = new ArrayList();` . I have two questions regarding this: 1. I want to make sure I understand the main benefits of this approach. I think the benefits are mostly flexibility. Declaring an object as a more high-level reference, rather than a concrete implementation, allows for more flexibility and maintainablity throughout the development cycle and throughout the code. **Is this correct? Is flexibility the main benefit?** 2. Are there more ways of 'programming to an interface'? Or is "declaring a variable as an interface rather than a concrete implementation" the the only implementation of this concept? I'm **not talking about the Java construct Interface**. I'm talking about the OO principle "programming to an interface, not an implementation". In this principle, **the world "interface" refers to any "supertype" of a class** - an interface, an abstract class, or a simple superclass which is more abstract and less concrete than it's more concrete subclasses.