If you write:
SimpleDoc mydoc = new SimpleDoc();
all the further code may depend on details exposed by the implementing class SimpleDoc. But if you write:
Doc mydoc = new SimpleDoc();
the further code my only depend on aspects exposed by Doc, which make the code even work if you decide in the future to write:
Doc mydoc = new ComplexDoc();
A good example for the differences is List, which has at least two implementations:
ArrayList
LinkedList
If you write:
List list = new ArrayList();
you are free to replace it later with:
List list = new LinkedList();
without breaking the code relying on the variable list (assuming you did not used casts or reflection to access implementation specific features of list).