面向对象:Java 接口VS抽象类
2022-03-07 本文已影响0人
阿猫阿狗Hakuna
抽象类的特性
- 不允许被实例化,只能被继承,不能new一个抽象类的对象出来;
- 抽象类可以包含属性和方法。方法既可以包含实现,也可以不包含,不包含代码实现的方法叫做抽象方法;
- 子类继承抽象类,必须实现抽象类中所有的抽象方法。
接口的特性
- 接口不能包含属性(也就是成员变量);
- 接口只能声明方法,不能包含代码实现;
- 类实现接口时,必须实现接口中声明的所有方法;
两者区别
抽象类表示的是is-a的关系,而接口表示的是has-a的关系,表示具有某种功能。对于接口,还有一种叫法,称为协议(contract)。
抽象类和接口能解决的编程问题
1.抽象类是为代码复用而生的。多个子类可以继承抽象类中定义的属性和方法,避免在子类中,重复编写相同代码。
2.抽象类更多是为了代码复用,而接口更侧重于解耦。接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码可扩展性。
该用抽象类还是接口?
如果要表示is-a的关系,且为了解决代码复用问题,就用抽象类;
如果要表示一种has-a的关系,且是为了解决抽象而非代码复用问题,就可以使用接口。
抽象类是自下而上的设计思路,先有子类的代码重复,然后再抽象成上层父类;而接口正好相反,是一种自上而下的设计思路。编程时,一般先设计接口,然后再去考虑具体实现。