您的位置:首页 > 编程语言 > Java开发

Java 接口与抽象类

2017-04-18 15:22 615 查看
    这个是面试题中经常遇见的(和java是否支持多继承一起问),其实接口和抽象类是俩种形式来体现java的OPP思想,但这俩者有很多不同的地方。

抽象类定义了都需要子类去继承它,如果你定义了一个抽象类而不去继承它,那么等于白白创建了这个抽象类,因为抽象类不能被实例化。

抽象类中不能写具体的方法实现,只能写抽象方法,因为抽象类中不能有方法体(抽象类作为父类,子类去继承时里面的抽象必须实现而且是自动生成的,

普通父类是能够写方法体的,就是说当多个类有一个共同的方法实现就写一个普通父类,如果有共同的方法而实现不一样就可以写一个抽象类做父类)。

对于一个父类,如果它的莫个方法在父类中实现出来没有任何的意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract

方法,此时这个类也成为abstract类了( 不是抽象类只能有抽象方法,也可以拥有成员变量和普通的成员方法,接口interface中的变量被隐式public static 

final修饰,方法只能是public abstract方法,而且不能有具体的实现。可以看出接口更抽象是一种特殊的抽象类)。

    在java中继承 abstract class 一个类只能继承一个,因为java不支持多继承,所以为了达到多继承的效果出现了接口interface。

    什么时候用接口什么时候用抽象类可以看下在博客中广为流传的例子:

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

    使用接口

      interface Door {

       void open ();

       void close();

}

     这么看来interface和abstract  class没有什么区别,现在如果加上Door的报警功能,如果加在abstract class中,那么以后继承的门都有alarm功能,所以

应该将alarm功能以interface的方式实现。从这里可以看出, Door的open()、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本

身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,

包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。如下:

interface  Alarm{

   void  alarm();

}

abstract class Door {

   void open();

   void  close();

}

class AlarmDoor extends Door implements Alarm {

   void open (){

    }

    void close(){

    }

    void alarm(){

    }

}

java 中的接口和oc中的协议差不多,oc没有接口,但是oc的协议可以自定义是否强制实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: