也许这是一个非常愚蠢的问题。
我正在尝试使用Java学习连接到MySql数据库,我已经完成了。我的问题是:
ResultSet rs=statement.executeQuery(sql);
此代码工作正常。然后使用
rs.next();
我可以得到我想要的信息。
但是ResultSet是一个接口?它怎么有方法?
我在我的文件上有这个导入:
import java.sql.ResultSet;
谢谢。
答案 0 :(得分:4)
ResultSet
是interface
,由statement.executeQuery()
的返回类型实现。 ResultSet
简单地说“对任何人来说,实施我的类型,他们必须提供至少这些操作/方法”。如果返回类型statement.executeQuery()
想要实现ResultSet,那么由该类提供接口中所有方法的实现。
由于polymorphism
,您可以使用implements
ResultSet作为ResultSet对象本身的任何类。
答案 1 :(得分:3)
ResultSet
确实是interface
- 它指定了合同。从Object
返回的statement.executeQuery(sql);
必须履行此合同。
所以statement.executeQuery(sql);
会返回Object
implements
ResultSet
interface
的{{1}},因此必须为合同中定义的所有方法提供具体的实现。< / p>
一个简单的例子
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
表示如果通过声明implements MyInterface
来履行合同。
因此,我可以将MyInterface
的引用分配给interface
的具体实现者,实际调用的方法是MyInterfaceImplementer
中的方法。
答案 2 :(得分:2)
这是面向对象编程的主要特征之一,它被称为继承。
这意味着任何子类都可以在声明母类的地方使用。
在您的情况下,方法statement.executeQuery(sql);
会返回ResultSet
。在这种情况下,语句正在创建一个实现ResultSet
并返回它的子类。作为子类,所有母类方法都可以实现和调用。
答案 3 :(得分:2)
java.sql
包中的接口由数据库供应商在为您编写JDBC驱动程序时实现。
加载JDBC驱动程序时会加载实现类。
这就是您的代码只需切换JDBC驱动程序JAR和更改连接参数即可更改数据库的方式。 (只要您坚持使用直接JDBC并且不使用任何特定于供应商的SQL。)
答案 4 :(得分:2)
接口有方法,在设计良好的系统中,您可以使用接口声明的方法。任何实现接口的类都必须定义接口声明的所有方法,并为它们提供实现。
因此,当您在接口ResultSet上使用方法时,您实际上正在使用在该接口的实现上声明的方法。