Java接口跟Java抽象类

Java接口和Java抽象类

Java接口和Java抽象类

关键字: java接口 java抽象类 默认适配模式

Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方才是它们的最佳位置呢?


(1)Java抽象类的优点:可以提供某些方法的部分实现,而Java接口却不可以。
(2)Java接口的优点:由于Java的单继承性,一个Java类只能实现一个Java抽象类,而却可以实现任意多个接口,因此Java接口是定义混合类型的理想工具。
(3)从设计理念层面看:Java抽象类在Java语言中体现了一种继承关系,即父类和派生类在概念本质上应该是相同的,而对于Java接口则不然,并不要求Java接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。下面看一个很好的实例。
设计一个AlarmDoor,本质上是Door,同时它具有报警功能,我们应该如何来设计呢?
前面已经说过,抽象类在Java语言中表示一种继承关系,所以对于Door这个概念,应该使用抽象类实现。另外,AlarmDoor又具有报警功能,说明它又能完成报警概念中定义的行为,所以报警概念可以通过接口方式实现,代码如下:

Java代码

1. abstract class Door {

2. abstract void open();

3. abstract void close();

4. }

5.

6. interface Alarm {

7. void alarm();

8. }

9.

10.class AlarmDoor extends Door implements Alarm {

11. void open() {

12. //implement

13. }

14. void close() {

15. //implement

16. }

17. void alarm() {

18. //implement

19. }

20.}

abstract class Door {

abstract void open();

abstract void close();

}

 

interface Alarm {

void alarm();

}

 

class AlarmDoor extends Door implements Alarm {

void open() {

//implement

}

void close() {

//implement

}

void alarm() {

//implement

}

}


(4)结合Java抽象类和Java接口的优点,定义一个经典的设计模式:声明类型的工作仍然由Java接口承担,但同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。也就是说在层次结构中,Java接口在最上面,然后紧跟着抽象类,这个模式就是“默认适配模式”。在Java语言API中使用了这种模式,而且全部遵循一定的命名规范:Abstract+接口名。