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的方法。搞不太懂啊
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的方法。搞不太懂啊
这个接口是留给开发driver的人实现的。java.sql只定义一个规范。注意---规范!
这个规范是留给driver的开发人员和应用程序的开发人员用的,都遵守这个规范了,事情才能办好。
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"});
你就会发现它的实现类了,就是在mysql.jar中的类接口的设计很多时候就是为了这样的情况,让第三方实现我设计的接口,我只需要按照接口中的方法调用就行了,至于它实际类名是什么我无需关心。
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
这样不就成立了么?接口,抽象类,多态,要再理解理解。