今天突然脑袋开窍了,明白接口是什么意思了?

lirong_wfmall 2007-04-12 08:43:46
学习JAVA以后,觉得接口并没有什么用,里面只有方法的定义,并没有实现。觉得用处不大。看了尚学堂的马老师的课程,说到了接口,他说三流的公司卖产品,二流的公司卖服务,一流的公司卖标准,而这个标准就是接口,不同公司的产品如果要互相兼容的话,必须遵循这个接口来。
比如说Statement接口,用于执行静态 SQL 语句并返回它所生成结果的对象。查看JAVA的帮助文档可以看到里面有很多的方法和字段,但我们看到的都是空的,只是定义,SUN并没有帮我们实现,但是它规定这个标准,比如执行SQL语句,它提供了 boolean execute(String sql)
boolean execute(String sql, int autoGeneratedKeys)
boolean execute(String sql, int[] columnIndexes)
boolean execute(String sql, String[] columnNames)
这四种方法,SUN先把这些方法的格式参数规定好,告诉别人,你要实现Satement这个接口,你必须要按照这个格式实现我这个方法。你不管连哪种数据库,都有引入连接数据库的包,你要连接ORACLE的数据库,你必须要使用ORACLE的JAVA包,而上面的那些方法呢,在它的包中ORACLE就按照SUN这个标准实现了这些方法。如果要连接MYSQL数据库,要引入MYSQLP的JAVA包,而MYSQL也严格按照SUN这个标准实现了上面这些方法。而我们对数据库操作的时候,直接查看JAVA的文档,查看这个接口,用什么语句连接,用什么语句查询数据直接使用就可以了。不管ORACLE和MYSQL具体怎么实现的,那就不用管了。不知道这样理解对不对。
...全文
576 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
约翰羊 2007-04-13
  • 打赏
  • 举报
回复
接口就是标准.
比如说电源插头,有两爪的,有三个爪的.
这就是标准,而不管你是电视还是收音机.是冰箱还是洗衣机...
xlmaxlma 2007-04-12
  • 打赏
  • 举报
回复
支持一下,看来LZ对接口的概念的确是种顿悟,看完LZ的分析,我对接口的概念也清晰不少,呵呵,感谢一下
kaoloveting 2007-04-12
  • 打赏
  • 举报
回复
up
lirong_wfmall 2007-04-12
  • 打赏
  • 举报
回复
接口的作用其实是提供你 在不改动原有代码的基础上 增加、改变类的功能。那么为什么在设计模式里应用广泛呢?因为在面向对象的设计原则中有那么一条开放封闭原则,内容大致如下:一个良好的设计应该可以在不改动原有代码或者改动少数代码的基础上增加或者改变原有的功能。因此接口正好符合这一需求。接下来看一下代码实例你就会明白。以下代码是模仿JDBC的设计原则所写的,并不是原代码,但是设计思想是一致的,之所以选择这样一个例子是因为你可以对接口的应用有一个感性的认识

假设read()方法从数据库里读取一个数据。由于不同数据库的读数据的实现方法各有不同,因此Java如何统一这一差异呢?

interface readData
{
object read();
}

好,Sun把JDBC里读取数据的接口定义成这样。那么厂商A在自己产品的JDBC驱动里这样实现:

class dbReader implements readData
{
public object read()
{
//与厂商A数据库相关的读取操作实现
}
}

好了,那么你在你的程序里使用了厂商A的数据库,因此你要用他的JDBC驱动来写程序:

class dbProgram
{
//加载驱动
//调用相应的JDBC方法取得connection等必要对象
object readData=read();//这里的read()方法在JDBC的接口中定义过
}

至此,你完成了对于数据库的读取。到此为止一切顺利。

一天,你的程序由于种种原因要使用厂商B的数据库驱动了(也许是你的客户要求这么做,也许是厂商A倒闭了,他的数据库再也不是主流了)。那么你很幸运,因为你使用Java,你使用JDBC访问数据库。你的代码会如何改动呢?通常如果你的数据库变动的话会造成对代码的巨大变动,但是现在,使用JDBC(注意JDBC是一套接口规范)的话,你只要改变你加载的JDBC驱动就可以了,以下的代码一律不用更改。为什么呢?因为厂商A和B的驱动都符合JDBC规范是吧?因此都实现了readData接口中的read()这个方法对吗?这样虽然你更换了数据库,但是你的程序其实是调用了对应数据库的read()方法,因此你可以不改变读取代码而只是更改要加载的数据库驱动就可以。那么Java又是如何实现动态的调用呢?面向对象的程序中可以这样引用一个实现了某个接口的类的实例:readData rd=new dbReader();//接口名称 变量名=new 实现了接口的类的名称()

调用接口中的方法就可以这样,rd.read()

可以看到,在代码中始终可以用接口类型的变量来引用具体实现他的类。这样的好处是不管类的具体实现怎么变,由于他必须实现接口中定义的方法,所以我们始终可以保证用readData接口类型的变量能够调用到具体实现这个接口的类的read()方法。

上面的例子由于是自己乱编的所以我在以实际的JDBC应用来举个例,希望大家能够彻底的弄懂。
import java.sql.*;
public class first{
public static void main(String args[])
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
URL url=" jdbc:odbc:tic ";
Connection db=DriverManager.getConnection(url,"fisher","yht8125");
Statement sq_stmt=db.createStatement();
String sql_str="select * from tic";
ResultSet rs=sq_stmt.executeQuery(sql_str);
}
来个更好的。
xlmaxlma 2007-04-12
  • 打赏
  • 举报
回复
LZ的形容很恰当,的确有“标准”的意思呀!

好比造一幢房子,必须实现“标准”的门、窗、楼道、厅房等等;而至于如何实现以及怎么实现,每家设计建筑公司都会有自己的方案,但都在标准的要求之下。
晨星 2007-04-12
  • 打赏
  • 举报
回复
接口和实现本来就不必要总是在一起的嘛。
就连一般的类设计中,被子类覆盖(override)的方法不也是一种“标准”和“实现”分离的例子吗?——标准由父类定,实现在子类选择:选择是直接原封不动地继承还是override一下。

接口不过是把标准这个概念完全给独立出来了而已,即父类型在制定标准的时候,未必一定要有实现,可以都有(一般的class),可以有一部分(abstract class),也可以一点都没有(interface)。
lirong_wfmall 2007-04-12
  • 打赏
  • 举报
回复
我整整学了半年的JAVA,一直对接口很茫然,昨天突然,对接口有所了解。
晨星 2007-04-12
  • 打赏
  • 举报
回复
还可以再考虑一下另外一个例子:如果没有Comparable接口,那如何能方便地实现编一个排序函数,使它能够给过去,现在和将来的各种用户自定义的类型排序。
晨星 2007-04-12
  • 打赏
  • 举报
回复
嗯,偶也来学习学习。:)

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧