定义
抽象类:包含抽象方法的类。
- 包含抽象方法的类必须通过
abstract
关键字声明为抽象类,否则编译器会报错。 - 抽象方法需要通过
abstract
关键字进行声明。 - 抽象类可以不包含抽象方法。
- 抽象类不可以被实例化,即使它不包含抽象方法。
- 任何继承了抽象类的类必须
override
抽象基类中的抽象方法。如果不override
抽象基类中的抽象方法,则需要将该类申明为抽象类。
接口:完全抽象的类(不包含任何具体实现的方法)
- 接口中的域隐式地是
static
和final
的。 - 接口中的方法只能是
public
权限,这些方法在其实现类中必须显式申明为public
权限,否则会报 'attempting to assign weaker access privileges ('package-private'); was 'public'
编译错误。 - 任何继承了接口的类必须
override
接口中的方法,否则需要将类申明为抽象类。
总结:
- 抽象类和接口的本质都是为了抽象化,而抽象化的本质是为了复用。将做什么和怎么做分离开来,通过多态这个机制来实现 同一个接口(做什么)执行不同的方法体(怎么做)。
- 抽象类可以包含有具体方法体的方法;接口只能有不包含定义的方法(在JDK8以后
interface
引入了default method
这一feature从而实现了接口中也可以包含有具体方法体的方法)。
用法
extend:扩展。扩展是指同类扩展。extend
关键字后可以跟接口/抽象类/类。接口可以extend接口,抽象类/类可以extend抽象类/类。
implement:实现。实现是指实现接口中的方法。implement
关键字后只能跟随接口。接口不可以implement接口,抽象类/类可以implement接口。
- 接口 extend 接口 :
interface 接口名 extends 接口名1, 接口名2
- 抽象类/类 extend 抽象类/类
- 通过单一
extend
和多implement
实现多继承:class 类名 extends 类名 implements 接口名1, 接口名2