理解Abstract class和Interface
抽象类是什么
Java中的Abstract class和Interface都是用来定义某种抽象事物的,这两者和类这一概念的区别在于类可以实例化,而他们不能(类用来表示人类、鸭子等可以有实际映射的存在,而Abstract class和Interface用来表示物种这一不能实例化的概念)。
抽象体(即被Abstract和Interface定义的抽象事物)在实际编程中定义一类行为,却不对其做实际的描述,在继承或者实现中才涉及到具体的实现,也就是说,抽象体隐藏了具体的实现,而仅仅提供统一的接口,在实际实现中可以根据需要进行实现或者扩展。这符合面向对象设计原则中的"对修改封闭,对扩展开放"的原则。
语法上的区别
abstract class Java语法
abstract class AbstractClass {
//阿里Java规范推荐抽象类的名称命名规范应当用Abstract开头
//abstract应当省略,默认当然是abstract的
abstract void dosth1();
abstract void dosth2();
}
interfact Java语法
interface bloger {
void dosth1();
void dosth2();
}
其中abstract class中可以拥有普通数据成员,而interface只能是static final的并且一般不推荐在interface中添加数据成员。
我理解为abstract class倾向于实现可以保留自己特性的,允许一定程度上不开放的抽象,而interface则是彻底的开发,甚至不允许拥有private的方法。
编程实践上的区别
许多更早的书或者博客在分析abstract class和interface的区别时会提到是否允许方法的默认实现,在之前的Java版本中interface是不允许有默认实现的,但是在Java8中加入了interface的default方法。
public interface defaultable {
default int defaultMethod(int a){
return a;
}
}
设计模式上的使用
abstract class和interface在使用上最大的区别应当是IS A 和 LIKE A 的区别,继承一个抽象类表示是什么,而实现一个接口仅仅表示实现了某个功能,即使在他们可以实现对方功能的情形下也应当明确区分其区别,这影响到代码的可维护性和可阅读性。
另一方面,Java是不支持多继承的,却可以同时实现多个接口,如果我们继承了某个抽象类,就应当表示子类在本质上属于父类(比如桌子属于家具),而接口的实现仅仅表示可以完成某种功能。也就是说,使用继承描述不会轻易改变的更本质的部分,而使用接口实现更灵活的扩展功能。
网友评论