我理解接口是如何工作的,但我对某件事感到困惑。我开始学习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 接口。这个方法定义在哪里?
答案 0 :(得分:2)
虽然您可以拥有接口类型的变量(例如Connection
,Statement
,...),但运行时的实际对象需要具有某种特定的实现类型。
例如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。这包括实施方法createStatement
和prepareStatement
。你在做什么没有指定stmt
引用指向另一个接口的方法,但是调用(调用)这个方法并让你的引用指向这个方法返回的对象。