java学习的基础书看了1,2遍了。不同的书也看过,基本对java有一定的了解。对于接口,感觉比较迷茫。接口也知道书本中写的一些使用接口的规范,也知道接口多线程、接口序列化、接口监听等用到接口。但还是迷茫,自己写程序,比如一些实用的程序,不知道什么情况下必须用接口~!
对于接口自己使用比较迷茫,估计跟初学,不是太熟练不是太董,有关。只懂得按照书本上,监听程序代码用接口,我也照抄。所以,想请各位达人帮忙给点接口的范例,多说明为什么必须用接口。或者把接口说得比较深入比较详细的一些文章给我。谢谢了。

解决方案 »

  1.   

    熟能生巧 再多看看设计模式会好些 在运用中体会
    笼统地说
    接口是制定标准和规范 should do 实现者之间有了共同的交互面
    继承是赋予了某种能力 can do
    对于concrete class而言 两者都是Type(Is a)
    我们可以说ArrayList是一个List,也可以说是一个Object
      

  2.   

    接口只定义了应该做什么,而没有定义该怎么做所以,如果你的程序只有你一个人完成,且每个功能只有一种实现的方法,我想你可以,注意是可以,不用接口如果有多人合作,你可能开发的快,可惜你需要的一个类,你的同伴还没有完成,你怎么办?等他吗?
    如果是面向接口,你可以自己先写一个最简单的实现来调试你的代码,Spring这时是个好帮手。如果一个功能有多种实现,比如导出文档。 有的要html的,有的是word/Excel/PPt/PDF 等等。
    因为你无法预见他们到底需要什么,这时候,你可以用接口,要求每个实现只需要完成 export 方法就行。
    然后你自己做了一个Excel的,以后按需要再完成其他的,而此时,你原来的程序根本不用修改,因为他们调用的是接口,而不是具体的某个实现类。
      

  3.   

    java2000_net说的有道理哦
    引用他的原话:
    "然后你自己做了一个Excel的,以后按需要再完成其他的,而此时,你原来的程序根本不用修改,因为他们调用的是接口,而不是具体的某个实现类。"
    以后怎么再完成呢,只要你编写个word类来继承那个接口就可以了,,是这样吧, java2000_net高手
      

  4.   

    java开发过程中,使用接口的好处是:当你调用别人的接口时候,可以不需要重部署,可以直接使用。而继承就不可以,必须要重新部署才能使用。
      

  5.   

    http://topic.csdn.net/u/20071229/20/50c600d9-8369-4c75-a53b-73249696082b.html
      

  6.   

    把这些文章都看懂了,面向对象就有小成了。
    http://blog.csdn.net/Slugfest/archive/2008/01/10/2034359.aspx
      

  7.   

    还有,java是单继承的,所以如果想继承自己写的更多的类的时候,肯定不能写成extends class1 class2 class3...
    这个时候你需要继承多个接口,例如implements interface1 interface2,而这样做的目的就在于,能够继承多个实现对应于每一个接口的“实现类”。
    并且方法中的参数也可以定义为接口类型,这样在传递参数的时候也可以转换成具体的类,这样的程序设计比较灵活。
    我觉得还是得多用,有一天自己不知不觉就入门了~
      

  8.   

    接口的存在是为了定义规范,比如:J2EE规范、JDBC规范等,Sun公司并没有去实现它们,
    只是让产品的提供商去实现,这样有一个好处,让使用的人只要学习一种就可以了,根本
    用不着去考虑具体是如何实现的。如果没有这个规范,那就讨厌了,MySQL的要去学习MySQL
    的实现,Oracle要去学习Oracle的实现等等。再有接口用于降低应用程序各层之间的耦合度,让干涉减至最小,实现程序的多态性。要想了解更多的可以去看看有关于面向对象设计原则的资料。
      

  9.   

    java2000_net 老紫竹 说得很好了。
    我补充一下自己的体会。
    前段时间为某银行写了一个单点登录的网站(简称MIS),
    该网站的作用是:所有登录进MIS的用户,当需要登录接入MIS的子系统时,直接跳转而不需要再次输入登录用户名密码。
    (为讨论的针对性,我们省去密码修改的功能,假设在MIS中可以得到当前用户在各子系统的登录用户名和密码)
    于是,我们如果能够知道当前用户登录子系统的URL请求时,直接让MIS的请求用户在IE中做URL跳转即可。
    但是我们并不知道未接入的各个子系统的登录地址、参数名称,那怎么办呢?
    (如:有的是:http://ip1:port1/login1.do?user1=?&pass1=?,有的是http://ip2:port2/login2.do?user2=?&pass2=?)
    于是设计接口如下:public interface ISingleSignOn{
     /**
     * 根据用户名密码、服务器信息,得到登录子系统的表单信息
     * @param loginURL 登录子系统的地址,如:http://ip1:port1/login1.do
     * @param userName 用户名
     * @param password 密码
     * @return 登录子系统所需要的URL字符串
     * @throws CanNotLoginException 不能登陆时抛出异常,如:子系统不可用、网络异常等
     */
    public String getLoginURL(String loginURL,String userName, String password) throws CanNotLoginException;

    }若一个新的子系统A需要接入MIS,则它先实现一个该类ISingleSignOn
    (假设它的用户名参数名为:username,密码参数名为:pwd,一个完整登陆地址为:http://127.0.0.1:9009/login.do?username=admin&pwd=admin)
    则ISingleSignOn的实现类可以这样写:public SingleSignOnExample implements ISingleSignOn{
     /**
     * 根据用户名密码、服务器信息,得到登录子系统的表单信息
     * @param loginURL 登录子系统的地址,如:http://ip1:port1/login1.do
     * @param userName 用户名
     * @param password 密码
     * @return 登录子系统所需要的URL字符串
     * @throws CanNotLoginException 不能登陆时抛出异常,如:子系统不可用、网络异常等
     */
    public String getLoginURL(String loginURL,String userName, String password) throws CanNotLoginException{
                    String url=loginURL;
                    url+="?username="+userName+"&pwd="+password;
                    return url;
            }
    }当然,loginURL、userName、pssword、实现类路径(classPath) 等这些内容都需要放在数据库表中维护。
    可以建立一个表,子系统的属性表来维护这些东西。然后在MIS的子系统的登录实现类中,你可以通过(伪代码)
    ISingleSignOn signOn = (ISingleSignOn)Class.forName(classPath).newInstance();
    String url = signOn.getLoginURL(.......):
    //本例中:classPath="SingleSignOnExample".
    来登录子系统A了。
      

  10.   

    感谢楼上这么多兄弟传授。老紫竹    得话最靠近白话。跟我后来看书理解的贴近。
    不过说真的,楼上除了几个兄弟,其他所有的兄弟的话,只是把java书籍的使用接口的简单的道理说出来。说实话,看了也等于白看。这些定义再书上都有。问题就是为什么非要用到接口,什么情况下自己写程序要用到接口。并非简简单单可以多继承的问题。看了楼上兄弟推荐的设计模式。刚看了第一个模式,策略模式,我终于明白了。知识掌握的不一定很高,才学来的,先学现卖,给总结一下接口的用法。为什么非要用接口!也为了广大之学习过java,但没有多少实践的人来说明一下。对楼上兄弟们抱歉,最近在忙其它事情,也看了设计模式,所以这么长时间没来结贴。下面总结一下。稍后!
      

  11.   

    鸭子有飞翔、叫 等行为。
    不可以使用继承。因为某种鸭子,比如机器鸭子,不会飞。所以不能单独继承。
    继承的话,你也可以把鸭子飞的动作重写成没动作。但对于以后增加其他的种类的鸭子来说,每个都写,不现实。所以要用接口。巴飞翔、叫,用接口来实现!  (很多学习java基本知识的时候,认识面就到这个层次!)
    只知道使用接口可以多继承。

    下面接着说,比如有的鸭子会刮刮叫,有的鸭子回哈哈叫,有的鸭子不会叫。
    那么用接口来实现,不等于吧每个接口重的行为都重新写一边么。比如,鸭子有10中叫的方法,你用接口继承这些叫唤的方法,不等于每次是用要把10中叫的方法重新写一边?
    而且以后每次增加叫的方法,也要把以前继承的写过的类,重新巴新加入的方法写一边。不现实。所以简单的用接口也不行!!!!!! (这个层次,学习java基础知识100编的人都不可能认识到!)哪怎么办呢巴叫唤的行为提出来,作为接口各种叫法,比如呱呱叫继承这个接口。哈哈叫也继承!爻力的回答,暂时没看,稍候看看。最后在结分!使用的时候申明一下,即可是用某种叫法。而且其他利用到接口的其他种类鸭子,以后新增叫法,继承接口,使用,也不会影响。某种鸭子的某些初始行为,可以在构造函数中申明好。比如使用set定义某种行为。使用的时候,就直接出现某种行为了。好了,解释完毕,我最后一行,使用的时候的说明,有点模糊。
    要详细写清数,必须用代码结合文字来说明。但没那么多的篇幅写上去。感兴趣的朋友,可以招本设计模式来看看!上面真正有为什么使用某些东西的详细说明。而不仅仅局限于怎么使用。java基础书上,往往局限于怎么使用。还有一点简单的道理。
      

  12.   

    鸭子有飞翔、叫 等行为。 
    不可以使用继承。因为某种鸭子,比如机器鸭子,不会飞。所以不能单独继承。 
    继承的话,你也可以把鸭子飞的动作重写成没动作。但对于以后增加其他的种类的鸭子来说,每个都写,不现实。 所以要用接口。巴飞翔、叫,用接口来实现!  (很多学习java基本知识的时候,认识面就到这个层次!只知道使用接口可以多继承。)  
    下面接着说,比如有的鸭子会刮刮叫,有的鸭子回哈哈叫,有的鸭子不会叫。 
    那么用接口来实现,不等于吧每个接口重的行为都重新写一边么。 比如,鸭子有10中叫的方法,你用接口继承这些叫唤的方法,不等于每次是用要把10中叫的方法重新写一边? 
    而且以后每次增加叫的方法,也要把以前继承的写过的类,重新巴新加入的方法写一边。 不现实。所以简单的用接口也不行!!!!!! (这个层次,学习java基础知识100编的人都不可能认识到!) 
    哪怎么办呢?把叫唤的行为提出来,作为接口 各种叫法,比如呱呱叫继承这个接口。哈哈叫也继承! 使用的时候申明一下,即可是用某种叫法。而且其他利用到接口的其他种类鸭子,以后新增叫法,继承接口,使用,也不会影响。 某种鸭子的某些初始行为,可以在构造函数中申明好。比如使用set定义某种行为。使用的时候,就直接出现某种行为了。 好了,解释完毕,我最后一行,使用的时候的说明,有点模糊。 
    要详细写清数,必须用代码结合文字来说明。但没那么多的篇幅写上去。 感兴趣的朋友,可以招本设计模式来看看! 

    上面真正有为什么使用某些东西的详细说明。而不仅仅局限于怎么使用。 java基础书上,往往局限于怎么使用。还有一点简单的道理。 
    爻力的回答,暂时没看,稍候看看。最后在结分! 
      

  13.   

    没有必须用的,只要你愿意,你可以不用接口,不用继承,不用重载,
    甚至一个main函数能搞定一切,
    先写个程序仅有main函数,再把功能扩充起来,等代码量多了,你自然明白该怎么写才看起来舒服
      

  14.   

    接口是对行为的抽象,也就是说,接口是对某些行为进行抽象,派生类可以实现这些方法,但是这些派生类之间可以是无相关的,这一点和抽象类是不同的。当子类(或某几个类)需要共用一个方法,但是这几个类完全不相关,甚至概念都不一样时,则使用接口较为合适,在接口里定义方法列表即可。interface表示的是"like-a"关系