接口就是方法的定义,而去实现它
接口其实也算是抽象类的一种特殊形式,在java中不是多继承的,但是导入多个接口,所以接口比抽象类使用更灵活,
不过接口和抽象的本质是一样的,都是OOP多态的体现,有了抽象(接口也是抽象),我们可以更高效的编写程序,可以写出复用性更高的程序,所以才有了这么多的设计模式!建议你多看看是,多用一用,多写写。在这里问接口是什么,你永远也不能真真明白,因为太多东西了,太复杂了,不是几句话说的清楚了,关键是自己好好的去思考,去领悟,去体会,

解决方案 »

  1.   

    楼上说得好.
    java不支持多继承性,即一个类只能有一个父类.单继承性使得java简单,易于管理程序.为了克服单继承性得缺点,java使用了接口,一个类可以实现多个接口.
      

  2.   

    java是单根语言,不能多重继承,为了模拟C++中的多重继承,提供了interface。
    实际上就是C++中的虚基类。java中可以同时实现多个接口。但接口中的方法只能定义,不能实现,具体在子类中去实现
      

  3.   

    有关接口与"多重继承"的关系,我想楼上大家都说的比较详细了。我说说别的。接口就是一个类提供者和使用者之间的协议,定义了对象的一种可以预期的行为,类提供者负责实现这个行为,类使用者通过该协议访问/调用这个行为。这样双方都可以很happy的做自己分内的事。另外,单就"接口"这个概念而言,抛开Java中的interface关键字,接口可以是一个系统提供给使用者用于操纵该系统的方法/函数集,也可以指(用户)界面。
      

  4.   

    to sean_gao(大胃) :可以给举个例子吗?
    最好能够指明哪个是类提供者,哪个是类使用者,希望有程序代码和注释!
    我想这样会使你抽象的语言实例化,让大家更深刻的理解一下!
    谢谢!
      

  5.   

    最好的例子
    看看java核心包的容器(Collection、HashMap、HashSet)代码,是Josh Bloch写的。
    jdk里有
    你也可以到这个网址中看:
    http://javaresearch.gro.clinux.org/jdk140/:)
      

  6.   

    我来给个例子说明...在项目设计时,定义一个数据库的访问接口,给所有项目成员使用在文档中描述这个数据库接口数据库接口名:
       IDBConn接口方法:
       RecordSet executeSQL(String sql)
       void commit()
       void rollback()好了,现在可以编码实现它。如sean_gao(大胃)所说,接口是设计协议的概念,而不只是指JAVA语言中的interface,我们分别用abstract class和interface两种方法实现它.//1.用interface实现接口
    import java.sql.*;interface IDBConn{
       ResultSet executeSQL(String sql);
       void commit();
       void rollback();
    }class DBConn implements IDBConn{
    public ResultSet executeSQL(String sql){
    System.out.println("call DBConn.executeSQL: " + sql);
    return null;
    }

    public void commit(){
    System.out.println("call DBConn.commit");
    }

    public void rollback(){
    System.out.println("call DBConn.rollback");
    }
    }public class test2 { public static void main(String[] args) {
    IDBConn conn = new DBConn();
    conn.executeSQL("SELECT * FROM TEST");
    conn.commit();
    conn.rollback();
    }
    }//2.用abstract class实现接口
    import java.sql.*;abstract class IDBConn{
       abstract ResultSet executeSQL(String sql);
       abstract void commit();
       abstract void rollback();
    }class DBConn
    {
       IDBConn dbConn = new IDBConn(){
        ResultSet executeSQL(String sql){
        System.out.println("call DBConn.executeSQL: " + sql);
    return null;
    }
       void commit(){
    System.out.println("call DBConn.commit");
       }
       void rollback(){
    System.out.println("call DBConn.rollback");
       }
       };   IDBConn getIDBConn(){
      return dbConn;
       }   ResultSet executeSQL(String sql){
      return dbConn.executeSQL(sql);
       }
       
       void commit(){
      dbConn.commit();
       }
       
       void rollback(){
      dbConn.rollback();
       }}public class test2 { public static void main(String[] args) {
    IDBConn conn = new DBConn().getIDBConn();
             conn.executeSQL("SELECT * FROM TEST");
    conn.commit();
    conn.rollback();
    }
    }
      

  7.   

    更正:接口描述中的RecordSet 应为ResultSet
      

  8.   

    -----------转载----------
    接口和抽象类
    在去年的12 月初, 我在Design Patterns Explained 的讨论组上看到这个系列帖子,
    觉得很有意思, 所以整理出来。如果你喜欢这种形式, 请写信到[email protected], 我会整理
    更多有趣的帖子出来。
    面向对象中有一个术语: 派生。在用Java 编程的时候, 派生的来源可以是抽象类
    ( abstract class)、也可以是接口( interface)。何时使用抽象类? 何时使用接口? 这几
    个帖子正是讨论了这个问题。
    ( 提出问题)
    Alan, 我买了你的书, 读到了其中“ Bridge 模式” 那一章。然后, 我把一位朋友— —
    他是个Java专家, 有五、六年使用Java的经验— — 叫来, 把你的书给他看, 并请他为我解
    释你的Java 代码。我自己比较偏向于使用接口, 而你更多的使用了抽象类。他得出的结论
    是: 你偏向于使用抽象类, 这反映出你对C++的爱好多于对Java的爱好。毕竟Java才有接
    口这个概念, 而C++只有抽象类。因此, 我们感觉: 如果把你的示例代码中的抽象类换成接
    口, 也许会使它们更能反映出实际情况和“ 按照协议设计” 的思想。实际上, 如果读过Peter
    Coad的书, 你会发现他也主要使用接口。
    ( Alan Shalloway 的答复)
    感谢你对这本书的评论。
    我用Java 也有五、六年了, 所以我不认为使用抽象类就表示没有经验。实际上, 我觉
    得Java 的一大缺憾就是它不支持多继承, 所以开发者经常被迫使用接口, 因为继承只能使
    用一次。当然了, 这里面涉及到多继承的性能问题和基类成员的名字重复问题。但是不管怎
    么说, 不允许多继承总是值得质疑的。
    至于我这本书, 我选择使用抽象类, 是因为大多数人都熟悉它— — 不是每个人都喜欢去
    看章节后面的C++示例的, 所以我决定用这种更通用的示例。
    接口的问题就是它无法拥有默认行为。如果你用接口来定义一个什么东西并希望跨过这
    层封装来添加一些行为, 你就必须使用委托。在我的记忆中, 有很多次就是因为不支持默认
    行为而造成了麻烦。为了绕过这个限制, 我会使用委托, 但是这也是个痛苦的事情。
    BTW: 我很喜欢Coad的书— — 我认为那是有史以来最好的设计书籍之一。
    ( Scott Bain 的跟贴)
    从我自己的角度来说, 我是一个Java程序员( 从来没用过C++)。但是每当我遇到单继
    承关系的时候, 我倾向于使用抽象类, 尽管我知道Java 不支持多继承。为什么这样? 因为
    即使我现在没有任何默认行为, 将来我还可以放进一些默认行为, 而不必修改子类的结构。
    而且, 如果要在一个继承体系中放置工厂方法来生成子类的实例, 抽象类是就是最好、
    最合乎逻辑的地方。因为客户对象只需要“ 知道” 抽象类就可以了, 通过转型得到的实例完
    全封装了子类的存在和选择子类的规则。这使得系统的扩展变得简单,而且不会造成副作用。
    只有当需要让一个类“ 象什么” 而非“ 是什么” 的时候, 我才会使用接口。
    ( Alan Shalloway 的回复)
    PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
    精彩! 很高兴看到这样的回复! J
    我也发现, 在Java 中缺少默认行为造成的影响似乎还没有真正引起人们的重视。从一
    开始, SUN 似乎就忽略了向后兼容的问题。我可以大胆的预言: 完全用接口构建成的系统将
    在几年之后发现这是一个大问题。据我所知, 有几个基于COM 模型( 也就是接口) 构建的应
    用程序的开发者现在已经陷入了维护问题, 因为当他们想修改接口来应对新的情况( 比如添
    加新的参数或新的方法) 时, 这会耗去他们大量的时间。如果使用抽象类, 修改就不会这么
    困难, 因为你可以只修改默认方法, 子类就不用动了。
    我可不是说不能使用接口, 但是你必须清楚: 有些时候应该使用接口, 而有些时候就是
    应该使用抽象类。不幸的是, 由于Java不支持多继承, 你必须很小心的做出选择。
    ( Scott Bain 的跟贴)
    同样精彩! 关于接口, 我再来废话几句:
    有时候, 一个东西可以“ 是” 几个东西。不明白这句话吗? 我就拿我自己来举个例子吧:
    我“ 是”一个程序员、一个老师、一个作者、一个父亲… … 你可以说我“ 实现了老师的接口”,
    学生们会向我询问关于上课的问题。我还“ 实现了父亲的接口”, 但是我的学生可能知道这
    一点, 也可能不知道。如果他们知道这一点, 他们就可以放心的向我询问关于抚养小孩的问
    题了。
    但是, 尽管我实现了所有这些接口, 我还有一个抽象类— — “ 人”。这个抽象类给我提
    供了所有的默认行为( 比如说我偶尔会走背运)。