В ответ на ваш вопрос, два объекта абсолютно одинаковы. Обе ссылки могут указывать на один и тот же объект:
Circle c = new Circle();
Shape s = c;
Кодирование интерфейсов позволяет вам изменять класс реализации с минимальным воздействием на ваш код. Скажем, у вас есть это:
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");
}
Теперь ваши требования меняются, и вы хотите, чтобы имена печатались в алфавитном порядке, т. Е. Используйте HashSet вместо TreeSet. Поскольку вы закодировали интерфейс и не использовали никаких методов, специфичных для класса HashSet, вам нужно изменить только одну строку:
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");
}
Интерфейсы также позволяют использовать внедрение зависимостей. Он позволяет вам использовать классы, которые могут даже не существовать на момент написания кода.
http://en.wikipedia.org/wiki/Dependency_injection