In answer to your question, the two objects are the exact same. Both references could point at the same object:
Circle c = new Circle();
Shape s = c;
Coding to interfaces allows you to change the implementation class with minimum impact on your code. Say you have this:
Set<String> names = new HashSet<String>(); // using Set reference not HashSet
names.add("Frank");
names.add("John");
names.add("Larry");
for(String name: names) {
System.out.println(name + " is in the team");
}
Now your requirements change and you want the names to be printed in alphabetic order i.e. use HashSet instead of TreeSet. Because you have coded to the interface and not used any methods specific to the HashSet class you only have to change one line :
Set<String> names = new TreeSet<String>(); // the only line of code that changes
names.add("Frank");
names.add("John");
names.add("Larry");
for(String name: names) {
System.out.println(name + " is in the team");
}
Interfaces also allow you to use dependency injection. It allows you to use classes that may not even exist at the time you write your code.
http://en.wikipedia.org/wiki/Dependency_injection