也许这是一个非常愚蠢的问题。
我正在尝试学习使用 Java 连接到 MySql 数据库,并且我已经完成了。我的问题是:
ResultSet rs=statement.executeQuery(sql);
这段代码工作正常。然后使用
rs.next();
我可以得到我想要的信息。
但是 ResultSet 是一个接口吗?怎么会有方法?
我的文件顶部有这个导入:
import java.sql.ResultSet;
谢谢你。
ResultSet
是interface
由 的返回类型实现的statement.executeQuery()
。ResultSet
简单地说“对于任何人来实现我的类型,他们必须至少提供这些操作/方法”。如果返回类型statement.executeQuery()
想要实现 ResultSet,则由该类提供接口中所有方法的实现。
由于polymorphism
,您可以使用任何类implements
ResultSet 作为 ResultSet 对象本身。
ResultSet
确实是一个interface
- 它指定了一个合同。Object
退货方必须履行本statement.executeQuery(sql);
合同。
所以statement.executeQuery(sql);
返回一些Object
,因此必须implements
为ResultSet
interface
合同中定义的所有方法提供具体的实现。
一个简单的例子
public static interface MyInterface {
void doStuff();
}
public static class MyInterfaceImplementer implements MyInterface {
@Override
public void doStuff() {
System.out.println("Doing stuff");
}
}
public static void main(String[] args) throws InterruptedException {
final MyInterface mi = new MyInterfaceImplementer();
mi.doStuff();
}
输出:
Doing stuff
因此MyInterface
提供了一个实现对象必须具有public void doStuff()
方法的合同。MyInterfaceImplementor
表示 if 通过声明 it 来履行该合同implements MyInterface
。
因此,我可以将我的引用分配给MyInterface
它的具体实现者,interface
并且实际调用的方法是MyInterfaceImplementer
.
这是面向对象编程的主要特征之一,它被称为继承。
这意味着任何子类都可以在声明了母类的地方使用。
在您的情况下,该方法statement.executeQuery(sql);
返回一个ResultSet
. 在这种情况下,语句正在创建一个实现ResultSet
并返回它的子类。作为子类,所有母类方法都已实现并可调用。
包中的接口java.sql
是数据库厂商在为你编写JDBC驱动时实现的。
加载 JDBC 驱动程序时会加载实现类。
这就是您的代码只需切换 JDBC 驱动程序 JAR 并更改连接参数即可更改数据库的方式。(只要您坚持直接使用 JDBC 并且不使用任何供应商特定的 SQL。)
接口具有方法,在设计良好的系统中,您使用接口声明的方法。任何实现接口的类都必须定义接口声明的所有方法并为它们提供实现。
因此,当您在接口 ResultSet 上使用方法时,您实际上是在使用在该接口的实现上声明的方法。