| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3789 人关注过本帖
标题:[原创]关于接口的教程
取消只看楼主 加入收藏
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
 问题点数:0 回复次数:4 
[原创]关于接口的教程
接口教程
      By Tempnetbar
欢迎转载,转载请注明出处

很多初学者都对接口的用处非常疑惑,我也曾经苦思冥想了很久,终于悟出来了。除了要告诉大家接口的知识之外我也想建议大家遇到问题自己多多思考,这样才能比较牢固的掌握,多看看现有的资料,我是通过一些设计模式的资料摸到蛛丝马迹的。

好,言归正传。接口究竟有什么用?他的应用主要是在设计模式领域,当然了,这样说可能有点偏颇,因为接口的作用其实是提供你 在不改动原有代码的基础上 增加、改变类的功能。那么为什么在设计模式里应用广泛呢?因为在面向对象的设计原则中有那么一条开放封闭原则,内容大致如下:一个良好的设计应该可以在不改动原有代码或者改动少数代码的基础上增加或者改变原有的功能。因此接口正好符合这一需求。接下来看一下代码实例你就会明白。以下代码是模仿JDBC的设计原则所写的,并不是原代码,但是设计思想是一致的,之所以选择这样一个例子是因为你可以对接口的应用有一个感性的认识,因为JDBC想必大家都会用到。同时对JDBC的理解也能够深入一点。献丑了:

假设read()方法从数据库里读取一个数据。由于不同数据库的读数据的实现方法各有不同,因此Java如何统一这一差异呢?答案是他提供JDBC接口。JDBC是接口同时也是Java访问数据库的规范,数据库厂商根据这个规范来写符合自己数据库产品的JDBC驱动,在使用JDBC时是不是要加载一个对应数据库的驱动呢,记起来了吧?并且你可以看一下Java的API文档,关于java.sql包里的内容,你看到的多数是什么?多数都是接口(文档里以斜体表示)OK,先给大家建立一个暗示,让大家感觉一下接口和JDBC的暧昧关系,呵呵~
好,实例代码goes here:

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);
}
在使用JDBC时要指定驱动就是为了能够让JVM用Class.forName来加载对应的驱动,这样就可以保证调用到对应的方法了。Connection和Statement以及ResultSet都是接口,理论上接口里的方法是不能调用的因为都是抽象方法。这里为什么可以呢?因为他们已经引用了一个具体实现他们的类,类里的方法已经是具体的了。这些具体实现的方法就是数据库厂商做的,但是你可以看到无论用什么数据库,调用时的写法都一样,因为方法的名字已经在接口里定义了,这样你的代码就可以不用改变,而实现功能的增加或者替换。

那么我想这其中的奥秘大家应该已经能够体会到了,大家再好好的悟一下吧,相信对接口的用处可以基本了然了,要认识接口的更多应用可以去看设计模式。当然你也可以不局限于模式,接口在你的程序中会发挥更多重要的作用。一般来说如果你的程序中存在变点(在未来功能可能变动的地方)都应该用接口或者是抽象类来实现。这样才能保证以后变动的顺利。

写得不好请大家多多指正!
搜索更多相关主题的帖子: 接口 教程 
2005-02-22 16:45
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
对了,嘿嘿

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2005-02-23 12:42
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
不仅限于数据库的应用

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2005-03-06 17:27
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
以下是引用bagger在2005-10-21 8:15:00的发言:
我刚刚开始学JAVA

我有个小问题,接口和抽象类有什么本质区别啊?

看了楼主的讲解,很受教育,但在接口和抽象类的区别方面还是不明白!

接口是比抽象类更加抽象的东西。你可以通过一些数学知识来理解。比如一个2次多项式的一般形式是a*x^2+b*x+c来表示,这就可以理解为一个2次多项式接口。那么一个2次多项式抽象类要比这个接口具体一点,但是还是有一点抽象性的。比如当b=0时,他就表示只有2次项的多项式。


相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2006-12-26 18:38
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
以下是引用shenuli在2006-3-8 19:16:00的发言:
那我们要怎样做才能更好的利用接口!!!?
比方说, 原先我们已经有一段代码,现在要往里头添加
一些方法,利用接口不还得去修改愿代码吗!!?

请注意,接口一旦公布是很少会去修改的。我所说的更改代码而对外不造成影响是指修改接口中定义的方法对应的代码。比如mysql5和mysql4有些调用发生了变化,但是你在用jdbc操作mysql5和mysql4的数据库时是不会发现有任何区别的,原因就是这些变化已经写入了mysql的jdbc驱动中,当你用接口调用的时候是不受任何影响的。如果你往里面添加方法而要改动接口那就说明你设计的时候接口设计的有问题


相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2006-12-26 18:42
快速回复:[原创]关于接口的教程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016704 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved