操作数据库要用到ResultSet 也就是ResultSet rs =Statement对象.execute(SQL);这里的语句创建了ResultSet 对象 。接口为什么能实例化一个对象呢? 而且 我在查看API帮助文档时发现不光是ResultSet接口 还有Connection,Statement 也都是接口。 他们都没有实现方法为什么还可以调用他们的方法?
操作数据库要用到ResultSet 也就是ResultSet rs =Statement对象.execute(SQL);这里的语句创建了ResultSet 对象 。接口为什么能实例化一个对象呢? 而且 我在查看API帮助文档时发现不光是ResultSet接口 还有Connection,Statement 也都是接口。 他们都没有实现方法为什么还可以调用他们的方法?
其实用winrar打开jdbc驱动.jar 就能看到,比如oracle:
classes12.zip\oracle\jdbc\OracleResultSet.class
可惜找不到.java来看看
只定义规范,可以让别的厂家自由实现.就像数据库方面
首先要 Class.forName(....);这个先注册一个驱动,实际上它里面一个静态块,它会往 DriverManager中的静态变量中与写入 Connection的实现类
Connection conn=DriverManager.getConnection(...);这个方法就会取得刚才注册的实现类
这样,conn就是一个实际上已经实现的类,而不是纯接口对象(纯接口是没办法实例化的)
通过conn,你就可以得到其他接口的实现类的对象了
有点迷糊 ~~~
Connection conn=DriverManager.getConnection(...);如果DriverManager.getConnection(...)这个方法返回了 一个实现接口的类,那么是不是应该接受这个实现类的变量应该是类型为这个实现类的一个实例化的对象呢? 不应该是一个接口类型的对象啊(其实接口是不是不能实例化呀?)~~
static Connection getConnection(String url)
Attempts to establish a connection to the given database URL. http://www.javaeye.com/topic/503033
interface MyInterface {}
class MyClass implements MyInterface {}那么程序中就可以这样做:
MyInterface obj = new MyClass();
那么在
Connection conn = DriverManager.getConnection(......);
这条语句中的 conn 实质上是一个实现了 Connection 接口的一个类的实例。这个 conn 的类型会根据数据库厂商的不同而不同,但这些类都实现了 Connection 接口。你可以通过
Class cls = conn.getClass();
得到它的类的信息,看它的类的完整名字,实现了哪些接口,有哪些方法
楼主可以在eclipse editor选中ResultSet 再按住ctrl+t快捷键,就可以看到实现类了