抽象类和接口都是用于实现抽象和多态的机制,但它们有以下几个主要区别:
-
定义方式不同:
- 抽象类可以定义抽象方法和非抽象方法,也可以包含成员变量。
- 接口只能定义抽象方法,不能包含成员变量(Java 8之前),也不能有方法实现(Java 8 开始接⼝⽅法可以有默认实现)。
-
继承方式不同:
- 一个类只能继承一个抽象类。
- 一个类可以实现多个接口。
-
访问修饰符不同:
- 抽象类中的成员可以使用各种访问修饰符(public、protected、default)。
- 接口中的成员默认使用 public 修饰,不能使用其他修饰符。
-
构造函数:
- 抽象类可以有构造函数。
- 接口不能有构造函数。
-
接 ⼝ 中除了 static 、 final 变量,不能有其他变量, ⽽ 抽象类中则不 ⼀ 定。
-
实现方式不同:
- 继承抽象类的子类必须实现抽象类中的所有抽象方法,否则该子类也必须声明为抽象类。
- 实现接口的类必须实现接口中定义的所有方法。
-
设计理念不同:
- 抽象类是对一种事物的抽象,它定义了一种事物的基本特征和行为。
- 接口更多的是定义一种规范或者契约,它只定义行为,不关心具体实现。
-
从设计层 ⾯ 来说,抽象是对类的抽象,是 ⼀ 种模板设计, ⽽ 接 ⼝ 是对 ⾏ 为的抽象,是 ⼀ 种 ⾏ 为的规范。
总的来说,抽象类是对事物的抽象,接口是对行为的抽象。如果你需要对一组相关的类进行抽象描述,并且它们有一些共同的特征和行为,可以使用抽象类。如果你只是希望定义一组规范或者契约,并且不关心具体实现,那么可以使用接口。在实际开发中,根据具体需求来选择使用抽象类还是接口。
1. 在 JDK8 中,接 ⼝ 也可以定义静态 ⽅ 法,可以直接 ⽤ 接 ⼝ 名调 ⽤ 。实现类和实现是不可以调⽤ 的。如果同时实现两个接 ⼝ ,接 ⼝ 中定义了 ⼀ 样的默认 ⽅法,则必须重写,不然会报错。2. jdk9 的接 ⼝ 被允许定义私有 ⽅ 法 。
总结
⼀
下
jdk7~jdk9 Java
中接
⼝
的变化:
1. 在 jdk 7 或更早版本中,接 ⼝⾥⾯ 只能有常量变量和抽象 ⽅ 法。这些接 ⼝⽅ 法必须由选择实现接⼝ 的类实现。2. jdk 8 的时候接 ⼝ 可以有默认 ⽅ 法和静态 ⽅ 法功能。3. jdk 9 在接 ⼝ 中引 ⼊ 了私有 ⽅ 法和私有静态 ⽅ 法。