接口Connection中createStatement()方法返回一个Statement对象,
而接口Statement中executeQuery()等方法发送SQL语句后返回一个ResultSet对象,我想请问一下,Statement和ResultSet不是接口吗,接口怎么会有对象呢?
那些接口中的方法好像是抽象的,怎么能用呢?不是很理解,希望懂的人能教我一下!先谢谢了!

解决方案 »

  1.   

    以Statement为例, Statement是接口,它不能被new但是它可以作为“引用”来引用那些实现了Statement的类实例。这就叫做接口回调。
    刚好没事,我来多唠叨几句。
    实际情况是这样的,当sun决定开发jdbc时,他们发现这个一个问题,他们面对着很多数据库,每个数据库对于数据的操作可能不同。因此,他们没有把java.sql这个包写成具体的操作类。而是定义了很多接口,然后他们告诉各个数据库厂商,要想人们在java程序里连接他们的数据库就必须实现他们定义的这些接口。所以当你要连接数据库时,第一步一定是类似Class.forName("oracle.jdbc.driver.OracleDriver");这样的语句,这句话其实很关键,因为这句话告诉了DriverManager它要连接的Driver是谁,它可以通过你告诉它的信息,去找到数据库厂商提供的具体的实现了Connection 、 Statement 、ResultSet等的具体类,这样当你写了
    Statement stmt = conn.createStatement();这样的语句的时候,返回的其实是实现了Statement接口的由具体数据库厂商提供的实现类。而你只是利用Statement 来引用它而已。这样的好处很多,最直接就是,你不需要知道oracle,或者mysql他们实现Statement 接口的类具体名字是什么,你就可以使用他们。否则oracle出个StatementForOracle,mysql出个StatementForMysql,而你每次实例化Statement 时都给先看看自己用的谁的数据库,然后查查它的Statement类具体叫什么,就会很麻烦。
    罗嗦了一堆,希望有帮助,其实就是一个概念“接口回调”
      

  2.   

    一个小技巧如果你想知道你所用的是什么东西System.out.println(conn.getClass());
      

  3.   

    真正实现这些功能的是写在那些驱动包里并实现了Connection、Statement、ResultSet等接口的类,对应不同的数据库就更换不同的驱动包。这也许就是面向接口编程吧~~