Statement sta=con.createStatement();
ResultSet result=sta.executeQuery("Select * from class");1.上面的这段代码中Statement是一个接口,为什么可以直接调用它的方法executeQuery?
2.而sta.executeQuery("Select * from class");返回的是一个ResultSet,那么ResultSet result=sta.executeQuery("Select * from class");是不是就意味着实例化了一个ResultSet??
3.接口中的方法不都是abstract的吗?为什么不实现这些方法就可以直接调用呢??希望大家能详细地说说,3Q先!!!!!!!!!!!!!

解决方案 »

  1.   

    是不是在内部类里实现过这个接口阿。内部类扩展了这个接口的话。
    那么就可以用接口Statement调用在内部类里实现的方法拉。
      

  2.   

    你不要看等号左边的东西,要看等号右边的东西,con.createStatement() 这样就新建了一个 Statement 的实现类(由数据库驱动程序实现的)。正如楼上朋说说到的,这是一种 Abstract Factory 设计模计。
      

  3.   

    面向接口的体现,你在右边做操作时,实际上是获得了一个实际类型的对象,此实际类型恰好是Statement接口的一个实现类。
      

  4.   

    Sun 的 JDBC 是一种规范,其中定义的全是接口,由具体的数据库驱动去实现的。
      

  5.   

    有一本叫more effective in java上说得很清楚,
    如果能用接口类定义并用其子类来实现对象尽量这样做,
    因为这样安全些,你调用该对象时人家根本就不知道你是怎么实现的,当然有些方法接口中没有
    必须强制转换成子类对象.
      

  6.   

    //javadoc:返回一个新的默认 Statement 对象 
    createStatement
    Statement createStatement()
                              throws SQLException创建一个 Statement 对象来将 SQL 语句发送到数据库。没有参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。 
    使用返回的 Statement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。 
    返回:
    一个新的默认 Statement 对象 
    抛出: 
    SQLException - 如果发生数据库访问错误
    //javadoc:语句返回单个 ResultSet 对象。
    executeQuery
    ResultSet executeQuery(String sql)
                           throws SQLException执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 参数:
    sql - 要发送给数据库的 SQL 语句,通常为静态 SQL SELECT 语句 
    返回:
    包含给定查询所生成数据的 ResultSet 对象;永远不能为 null 
    抛出: 
    SQLException - 如果发生数据库访问错误或者给定 SQL 语句生成单个 ResultSet 对象之外的任何其他内容
      

  7.   

    以postgresql数据库的jdbc来说
    打开jdbc驱动可以找到
    public class org.postgresql.jdbc2Connection extends org.postgresql.jdbc2.AbstractJdbc2Connection implements java.sql.Connection {
    ...
    }
    其他几个接口的实现也可以相应的找到,明白了??!