java 基础之接口与抽象类的差异

java 基础之接口与抽象类的区别

共同点:都是抽象类型

不同点:

1. 继承角度
一个具体类只能继承一个抽象类,但一个具体类可以实现多个接口。(java多继承)

2. 抽象类与抽象方法
含抽象方法的类必须被声明为抽象类,但抽象类不一定必须有抽象方法。
抽象类的抽象方法必须被子类实现。子类可以有选择地重写需要的非抽象方法,但是接口的实现类必须实现接口的所有方法。
另外Java抽象类可以提供某些方法的部分实现,而Java接口不可以。

3. 成员变量
接口必须是公开的(public)的,不能由私有(private)的方法或变量;
接口中的变量必须是public static final(接口中一般不定义数据成员),且必须给其初值,实现类中不能重新定义,也不能改变其值;
抽象类可以有私有方法或私有变量,抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

4. 设计理念不同
其实abstract class表示的是”is-a”关系(塑料碗和瓷碗都是碗),interface表示的是”like-a”(像雾像风又像雨)关系,组合起来就是”has a”关系(智能手机继承自手机,同时实现了闹钟、MP3等各种功能)。

简单地说,接口是模块之间的协议,一些模块用于实现某些协议的具体动作,另外一些模块只针对接口编程,这样实现低耦合。
抽象类主要是用于继承设计的,主要用于模板设计!

经典的设计模式:缺省/默认适配模式(Default Adapter)

声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。也就是说在层次结构中,Java接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。

在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。