Хотя у вас могут быть переменные, относящиеся к типам интерфейсов (например, Connection
, Statement
, ...), фактические объекты во время выполнения должны быть определенного типа реализации.DriverMananger.getConnection()
берет на себя работу по поиску реализации Connection
, которая может обрабатывать предоставленный вами URL JDBC.
Предположим, что это вымышленный класс MyDBConnection
(который, конечно, реализует Connection
).
Теперь ваша переменная conn
содержит ссылку на MyDBConnection
.
Когда вы вызываете createStatement()
для этого объекта, фактически выполняется MyDBConnection.createStatement()
.Этот метод может выглядеть следующим образом:
public Statement createStatement() {
return new MyDBStatement(this.someConnectionState);
}
После этого ваша переменная stmt
будет содержать ссылку на MyDBStatement
объект.
Помните: еслилюбой метод обещает вернуть что-то типа A
, он также может возвратить что-то подтипа A
(т.е. подкласс A
или класс, реализующий A
, если A
это интерфейс).Фактически, когда A
является интерфейсом, должен возвращать класс, реализующий A
.Поскольку чистый A
объект не может существовать.