Java中类,抽象类,接口之间的异同

2019-02-16  本文已影响0人  Harper324

类与抽象类的主要区别在于:

1、抽象方法必须为public或者protected,缺省情况下默认为public。

2、抽象类不能用来创建对象:抽象类创建对象其实没有任何意义。

3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

接口与抽象类的主要区别有:

1、语法层面的区别

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

   5)抽象类可以有构造方法,而接口不可以有构造方法。

2、设计层面的区别

1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。比如,老虎和牛都能吃东西,在设计时可以将老虎设计为一个类Tiger,牛设计为一个类Cow,但吃不能设计为一个类,因为它是行为特性而不是对一类事物的抽象描述,可以将吃设计为接口Eat,包含eat()方法

2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。PPT模板就是模板式设计,对模板做的修改也会出现在应用该模板的全部PPT中,而辐射式设计则需要对每个子类都进行更改

门和报警的例子:门都有open( )和close( )两个动作,可以定义通过抽象类和接口来定义这个抽象概念:

// 抽象类
abstract class Door {
    public abstract void open();
    public abstract void close();
}

//接口
interface Door {
    public abstract void open();
    public abstract void close();
}

但是现在如果需要门具有报警alarm( )的功能,有两种思路来实现:

1)将这三个功能都放在抽象类里面,所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}
上一篇 下一篇

猜你喜欢

热点阅读