抽象类和接口代表的都是抽象类型,是抽象层的具体表现。
从语法层上看抽象类可以有自己的成员变量也可以有非抽象方法,而在接口中只有不能被修改的成员变量
(必须是static final的,不过在接口中一般不定义成员变量)所有的方法都是抽象的。从某种意义上说接口是一种特殊的抽象类。
从编程角度看抽象类和接口可以实现一样的功能。带还是有区别的。抽象类是java中表示一种单个继承的关系一个类只能有一个父类。却可以实现多个接口。在抽象类的定义中可以实现部分方法其继承并不要求实现所有的抽象方法。但在接口中所有的方法只有声明。所有实现都是在子类中完成的。这会造成维护上的麻烦。(如果后来想改进接口的功能适应新的情况,就会很麻烦)如果是抽象类的话,那么只需要修改定义在抽象类中的默认行为就可以了。
从设计层看抽象类偏向于说明属性而接口说明的是功能。
比如说我有一把会报警的锁。虽然他有报警功能但本质上他还是一把锁。我就可以继承锁的抽象类。实现报警的接口。
java接口是定义混合类的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
结合抽象类和接口的各自优势,可以得到最理想的设计实现方式:声明类型的工作仍然有java接口承担,但同时给出一个实现了这个接口的实现类,其他同属于中个抽象类的具体类可以选择实现接口,也可以选择继承整个抽象类,也就是说在层次结构中接口在最上面,紧跟着的是抽象类,这样两个抽象的功能的优点都发挥了出来。这就是"缺省适配模式",在API中就使用了这种模式。
|