JDK8之前,接口的定义是严格的:只能定义变量和抽象方法,且不能写方法体,但是JDK8之后可以在接口中定义静态(static)方法和默认(default)方法。
具体区别
-
实现方式:
- 接口(Interface):接口是一种完全抽象的类型,它只能包含抽象方法和常量字段。接口中的方法都没有具体的实现,只有方法签名。类通过实现(implements)接口来使用接口定义的方法,一个类可以同时实现多个接口。
- 抽象类(Abstract Class):抽象类是一种半抽象的类型,它可以包含抽象方法和具体方法。抽象方法没有具体实现,而具体方法可以有代码块。类通过继承(extends)抽象类来使用抽象类定义的方法。
-
多继承支持:
- 接口:Java支持类实现多个接口,这使得接口在多继承场景下非常有用。
- 抽象类:Java不支持类继承多个抽象类,一个类只能继承一个抽象类。这是因为Java中类的继承是单一继承的。
-
构造方法:
- 接口:接口不能包含构造方法,因为接口不能直接实例化。
- 抽象类:抽象类可以有构造方法,并且在实现类的构造方法中通过super关键字调用抽象类的构造方法。
-
字段(成员变量):
- 接口:接口中的字段都是常量,它们默认是public、static、final的,不能被修改。
- 抽象类:抽象类可以有各种字段,可以是常量、实例变量,或者是静态字段。
-
用途:
- 接口:接口主要用于定义一组相关的方法,让不同的类实现这些方法,从而实现多态性。接口常用于定义类之间的契约,实现接口的类必须提供接口中声明的所有方法。
- 抽象类:抽象类可以用于定义通用的属性和方法,并且可以为子类提供一些默认的实现。抽象类常用于设计基类,提供一些公共行为,但不用完全实现子类的业务逻辑。