4 接口和抽象类有什么区别?

约 485 个字 预计阅读时间 2 分钟

接口:只能包含抽象方法(但在 Java8 之后可以设置 default 方法或者静态方法),成员变量只能是 public static final 类型,当 like-a 的情况下用接口。

接口是对行为的抽象,类似于条约。在 Java 中接口可以多实现,从 like-a 角度来说接口先行,也就是先约定接口,再实现。

抽象类: 可以包含成员变量和一般方法和抽象方法,当 is-a 并且主要用于代码复用的场景下使用抽象类继承的方式,子类必须实现抽象类中的抽象方法。

在 Java 中只支持单继承。从 is a 角度来看一般都是先写,然后发现代码能复用,然后抽象一个抽象类。

补充:is-a、has-a、like-a 是什么?其怎么应用?

is-a、has-a、like-a 是什么? - is-a :是一个,代表继承关系,如果 A is-a B,那么 B 就是 A 的父类。 - has-a :有一个,代表从属关系,如果A has a B,那么 B 就是 A 的组成部分。 - like-a :像一个,代表组合关系,如果 A like a B,那么 B 就是 A 的接口。

is-a、has-a、like-a 的应用

  • 如果你确定两件对象之间是 is-a 的关系,那么此时你应该使用继承;比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承。
  • 如果你确定两件对象之间是 has-a 的关系,那么此时你应该使用聚合;比如电脑是由显示器、CPU、硬盘等组成的,那么你应该把显示器、CPU、硬盘这些类聚合成电脑类。
  • 如果你确定两件对象之间是 like-a 的关系,那么此时你应该使用组合;比如空调继承于制冷机,但它同时有加热功能,那么你应该把让空调继承制冷机类,并实现加热接口。