An interface is something used when you want to implement functionality in the future. Interfaces must have their methods defined by the classes that implement them. Abstract classes allow you to implement their methods in the abstract class and then re-define them if you wish in sub-classes.
When copeg said, "Program to an interface, not an implementation," he meant that an object should be written in an abstract form (not necessarily with abstract classes) so that it can easily be reused. As a rule, class hierarchies should be avoided:
class Foo
class SuperFoo extends Foo
should be:
class Foo
class SuperFoo
{
Foo foo;
}
Always favor object composition over inheritance.