Java接口 - 引用接口指向另一个接口的方法。该方法定义在哪里?

时间:2011-02-14 08:16:53

标签: java interface jdbc

我理解接口是如何工作的,但我对某件事感到困惑。我开始学习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 (?, ?, ?, ?)";

我有一个 Statement 接口引用指向另一个接口的方法 Connection 接口。这个方法定义在哪里?

3 个答案:

答案 0 :(得分:2)

虽然您可以拥有接口类型的变量(例如ConnectionStatement,...),但运行时的实际对象需要具有某种特定的实现类型。

例如DriverMananger.getConnection()接管找到可以处理您提供的JDBC URL的Connection实现的工作。

我们假设它是虚构的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 :(得分:1)

getConnection表示它返回Connection类型的对象。所以它可以返回任何扩展Connection的类型。 所以preparedStatement是在Connection接口中定义的方法,但是在其子类之一中实现。

答案 2 :(得分:1)

不要想到“指向另一个接口的方法”和“定义接口的方法”。 Java中的接口就是:它定义了一个接口来调用其他对象的方法,而不必现在知道这些对象的细节,就像你不必知道键盘上的键是如何工作的按下它们。 (事实上​​,公共构造函数+您不知道的类的方法就形成了一个接口。)

在这种情况下,你知道一些魔法的DriverManager创建了一个对象(bzw。其实际类(你不知道))实现了Connection。这包括实施方法createStatementprepareStatement。你在做什么没有指定stmt 引用指向另一个接口的方法,但是调用(调用)这个方法并让你的引用指向这个方法返回的对象。