From a design best practice point of view, one of the big advantages of programming to an Interface, along with Dependency Injection (automated using something like Spring or via constructor/setters) is that it reduces coupling in your code. This means that each individual class is more self contained and that changes to undelrying details are less likely to leak throughout other classes.
If you have an application with strong coupling, it results in changes that are made result in a ripple effect throughout the code.
Essentially, if you program to an interface, you should be able to make underlying changes to implementations without having a knock on effect in other classes.
The best practice concept of "Program to an Interface" is brought up in the Gang of Four Design Pattenr book http://en.wikipedia.org/wiki/Design_Patterns
Also, check out page 17 of the following pdf: http://userpages.umbc.edu/~tarr/dp/lectures/OOPrinciples-2pp.pdf
It gives some advantages then a code example.