Um Ihre Frage zu beantworten: Die beiden Objekte sind genau gleich. Beide Verweise können auf dasselbe Objekt verweisen:
Circle c = new Circle();
Shape s = c;
Die Kodierung in Schnittstellen ermöglicht es Ihnen, die Implementierungsklasse mit minimalen Auswirkungen auf Ihren Code zu ändern. Angenommen, Sie haben Folgendes:
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");
}
Nun ändern sich Ihre Anforderungen und Sie möchten, dass die Namen in alphabetischer Reihenfolge ausgegeben werden, d.h. Sie verwenden HashSet statt TreeSet. Da Sie sich an die Schnittstelle gehalten und keine spezifischen Methoden der Klasse HashSet verwendet haben, müssen Sie nur eine Zeile ändern:
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");
}
Schnittstellen ermöglichen Ihnen auch die Verwendung von Dependency Injection. Damit können Sie Klassen verwenden, die zum Zeitpunkt der Erstellung Ihres Codes möglicherweise noch gar nicht existieren.
http://en.wikipedia.org/wiki/Dependency_injection