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.