3:使用接口
  Java可以创建一种称作接口(interface)的类,在这个类中,所有的成员函数都是抽象的,也就是说它们都只有说明没有定义,你可以如下所示来说明一个接口。
public interface interfaceName 
//成员函数说明  接口中成员函数的缺省引用类型是private,接口(interface)的内部变量是不可更改的,并且总是static和final。
  通过使用关键字implement,你可以在定义类时继承一个接口。不过与extends不同的是,一个类可以同时继承多个接口。
  使用接口的优点在何处呢?通过创建一个接口,你可以说明一整套抽象的成员函数而无须去具体实现它,所有继承了这个接口的类,都将有着具有相同原形的成员函数。例如,你想所有的shapes都有一个draw()成员函数,你可以创建一个接口并且用Shape命名:public interface Shape 
void draw();  现在,无论你何时创建一个继承自Shape的类,都将拥有一个成员函数draw()。

解决方案 »

  1.   

    多重继承。java不支持一个类继承多个类,用接口就变相达到了这个目的。
      

  2.   

    哦,现在有点明白他的用处了,起先只是知道他的定义和实现一个接口的方法,好像接口中的缺省引用应该是Public吧!
      

  3.   

    多重继承。java不支持一个类继承多个类,用接口就变相达到了这个目的。如果想多重继承的话那类是不是要实现他的每一个父接口的方法,本人刚开始
    学习Java问的问题可能有点搞笑,请不要见怪。  :)
      

  4.   

    在这里应该谢谢 regnay(border徐) 你的回答使我有点明白了他的用处。
      

  5.   

    从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
      

  6.   

    从设计理念层面看abstract class和interface上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。
      

  7.   

    考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:使用abstract class方式定义Door:
    abstract class Door {
    abstract void open();
    abstract void close();

    使用interface方式定义Door:
    interface Door {
    void open();
    void close();

    其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢
      

  8.   

    同样感谢dooby(德鲁比),德鲁比的意思是不是说接口和abstract class 在某些时候具有同样的功能?
        如果要求Door还具有报警的功能,我想应该使用abstract class的结构吧,是不是因为每个门的报警都可能相同,那就可以把他的缺省行为在abstract class中实现呢?
      

  9.   

    “德鲁比”已经说的非常清楚了!把一类事物中的通性(属性)或者行为(方法)抽象出来,放在一个类中(所以就叫抽象类:P),那么所有继承了此类的都具有了这些通性和行为,也就表明你“是”这一类事物了!
    所以,最好当你要描述的东西“is a”这类事物时,才使用继承。接口应该说是“更加抽象的抽象类”,它有自己的特性。具体,可以去看看“think in java”、“core java”,“effective java”等一些书,有非常详尽的解释!