Когда вы на самом деле вызываете что-то, у вас есть ссылка на экземпляр конкретного подкласса, который предоставляет все тела.Дело в том, что вам (как клиенту) не нужно заботиться о том, что это за реализация - она предоставляется вам DriverManager
(и т. Д.).Все, о чем вам нужно заботиться, это то, что это «что-то, что реализует данный интерфейс» или «то, что расширяет абстрактный класс».
Более простой пример - использование типов коллекций:
List<String> list = new ArrayList<String>();
doSomething(list);
...
public static void doSomething(List<String> list) {
// Act on the list
}
Здесь doSomething
не нужно знать, что мы использовали ArrayList<E>
- он может работать на любом виде List<String>
... но, как вы можете видеть, как это происходитмы создаем экземпляр ArrayList<E>
, который является конкретным классом.