Интерфейсы Java - ссылочный интерфейс указывает на метод другого интерфейса. Где этот метод определен? - PullRequest
2 голосов
/ 14 февраля 2011

Я понимаю, как работают интерфейсы в целом, но я ничего не понимаю. Я начал изучать JDBC, и я не могу понять это утверждение:

Connection conn = null; // set a reference pointing to nothing
Statement stmt = null;
PreparedStatement preparedStmt = null;
conn = DriverManager.getConnection('mysql/derby/other db', 'user', 'password');  

//This is what I don't understand
stmt = conn.createStatement(); // Interface reference calling another interface's method
// Or this
preparedStmt = conn.preparedStatement("INSERT INTO db.table values (?, ?, ?, ?)";

У меня есть Ссылка интерфейса , указывающая на метод другого интерфейса Соединение интерфейс Где этот метод определен?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Хотя у вас могут быть переменные, относящиеся к типам интерфейсов (например, 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 объект не может существовать.

1 голос
/ 14 февраля 2011

Не думайте о «указании на метод другого интерфейса» и «определении метода интерфейсов».Интерфейс в Java - это просто: он определяет интерфейс для вызова методов других объектов без необходимости теперь детализировать эти объекты, как будто вам не нужно знать, как работают клавиши на клавиатуре при нажатииих.(На самом деле, общедоступные конструкторы + методы неизвестных вам классов образуют интерфейс и тому подобное.)

В этом случае вы знаете, что DriverManager с помощью некоторой магии создает объект, который(bzw. чей фактический класс (неизвестный вам)) реализует соединение.Это включает в себя реализацию методов createStatement и prepareStatement.То, что вы делаете, - это не присвоение ссылки stmt , указывающей на метод другого интерфейса , а вызов (вызов) этого метода и предоставление вашей ссылки на объект, возвращаемый этим методом.

1 голос
/ 14 февраля 2011

getConnection указывает, что он возвращает объект типа Connection.Таким образом, он может возвращать любой тип, который расширяет соединение.Таким образом, readyStatement - это метод, определенный в интерфейсе Connection, но реализованный в одном из его подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...