-
抽象类
抽象类和抽象方法都是用abstract关键字进行生命。如果一个类中包含抽象方法,那么这个类必须声明为抽象类。
抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。 -
接口
接口是抽象类的延伸,在java8之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。从java8开始,接口也可以拥有默认的方法实现,这还是因为不支持默认方法的接口的维护成本太高了。在java8之前,如果一个接口想要添加新方法,那么要修改所有实现了该接口的类。
接口的成员(字段+方法)默认都是public的,并且不允许定义为private或者protected。
接口的字段默认都是static和final的。
-
比较
- 从设计层面上看,抽象类提供了一种IS-A关系,那么就必须满足里氏替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种LIKE-A关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有IS-A关系。
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
- 接口的字段只能是static和final类型的,而抽象类的字段没这种限制。
- 接口的成员只能是public的,而抽象类的成员可以有多重访问权限。
-
使用选择
使用接口:- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现Compareable接口的compareTo()方法;
- 需要使用多重继承
使用抽象类: - 需要在几个相关的类中共享代码。
- 需要能控制继承来的成员的访问权限,而不是都为public。
- 需要继承非静态和非常量字段。
很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次接口要求,可以灵活地为一个类添加行为。并且从java8开始也可以有默认的方法实现,使得修改接口的成本也变的很低。
抽象类与接口
最新推荐文章于 2024-06-14 22:39:53 发布