java.sql包中有个DatabaseMetadate接口,该接口定义了老多的方法。但是该接口没有继承或者实现他的类,所以应该没有类实现它定义的方法。可是看下边
        Connection con=null;
        DatabaseMetaData m=null;
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/metadatatest","root","a");
        
        //获取数据库元信息
        m=con.getMetaData();
        //取得数据库信息
        ResultSet rs=m.getTables(null, null,null, new String[]{"TABLE"});
获得一个DatabaseMetadate对象后,却可以调用到DatabaseMetadate的方法。搞不太懂啊

解决方案 »

  1.   

    API里,所有已实现的类是空,只能说明在这个包里没有类实现这个接口。
    这个接口是留给开发driver的人实现的。java.sql只定义一个规范。注意---规范!
    这个规范是留给driver的开发人员和应用程序的开发人员用的,都遵守这个规范了,事情才能办好。
      

  2.   

    可是却还可以调用接口定义的方法并获得预期的结果啊
     Connection con=null; 
            DatabaseMetaData m=null; 
            Class.forName("com.mysql.jdbc.Driver"); 
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/metadatatest","root","a"); 
            
            //获取数据库元信息 
            m=con.getMetaData(); 
            //取得数据库信息 
            ResultSet rs=m.getTables(null, null,null, new String[]{"TABLE"}); 
      

  3.   

    你可以打印看一下,con.getClass().getName() m.getClass().getName()
    你就会发现它的实现类了,就是在mysql.jar中的类接口的设计很多时候就是为了这样的情况,让第三方实现我设计的接口,我只需要按照接口中的方法调用就行了,至于它实际类名是什么我无需关心。
      

  4.   

            //获取数据库元信息
            m=con.getMetaData();
            //取得数据库信息
            ResultSet rs=m.getTables(null, null,null, new String[]{"TABLE"}); m是什么,是一个实例,我们为什么不能call它的getTables方法呢?
    你不要以为con.getMetaData();这个方法中有这样的代码:
    DatabaseMetadate m = new DatabaseMetadate();
    那是不可能的。
    只可能是这样:
    SomeClass extends SuperClass implements DatabaseMetadate{
    ...
    重写DatabaseMetadate接口中的方法
    }Connection#getMetaData中有如下的代码:
    DatabaseMetadate m = new SomeClass();
    ...
    return m
    这样不就成立了么?接口,抽象类,多态,要再理解理解。
      

  5.   

    sun定义的是接口,他的具体实现要交给了driver开发商
      

  6.   

    4楼你直接说mysql的jdbc驱动实现了楼主不久明白了啊
      

  7.   

    sql中就是这么规定的,“龟腚”你懂不,不解释