En respuesta a su pregunta, los dos objetos son exactamente iguales. Ambas referencias podrían apuntar al mismo objeto:
Circle c = new Circle();
Shape s = c;
Codificación de las interfaces le permite cambiar la clase de implementación con un impacto mínimo en su código. Digamos que tiene esto:
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");
}
Ahora sus necesidades cambian y desea que los nombres que se imprimirán en orden alfabético, es decir utilizar HashSet en lugar de TreeSet. Debido a que usted ha codificado a la interfaz y no se utiliza ningún método específico para la clase HashSet es suficiente con cambiar una línea:
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");
}
Las interfaces también le permiten usar la inyección de dependencia. Le permite usar clases que quizás ni siquiera existan en el momento de escribir su código.
http://en.wikipedia.org/wiki/Dependency_injection