Java 中抽象类和接口的区别2025年6月19日 | 阅读 5 分钟 抽象类使用 abstract 关键字声明的类称为抽象类。它可以包含抽象方法和非抽象方法(带有主体的方法)。抽象类是不能直接实例化的类。它用作其他类的蓝图。 阅读更多 Java 中的抽象类 抽象类示例输出 InterfaceJava 中的接口是类的蓝图。它具有静态常量和抽象方法。 接口是实现 Java 中抽象和多重继承的机制。它只能有抽象方法(没有主体的方法)。 - Java 接口也代表了 IS-A 关系。
- 它不能像抽象类一样被实例化。
- 从 Java 8 开始,我们可以在接口中拥有默认方法和静态方法。
- 从 Java 9 开始,我们可以在接口中拥有私有方法。
要了解更多信息,请阅读Java 中的接口 接口示例输出 抽象类 vs. 接口简单来说,抽象类实现了部分抽象(0 到 100%),而接口实现了完全抽象(100%)。 抽象类 | Interface |
---|
抽象类可以有抽象方法和非抽象方法。 | 接口只能有抽象方法。从 Java 8 开始,它也可以有默认方法和静态方法。 | 抽象类不支持多重继承。 | 接口支持多重继承。 | 抽象类可以有 final、非 final、static 和非 static 变量。 | 接口只有 static 和 final 变量。 | 抽象类可以提供接口的实现。 | 接口不能提供抽象类的实现。 | 使用 abstract 关键字声明抽象类。 | 使用 interface 关键字声明接口。 | 抽象类可以扩展另一个 Java 类并实现多个 Java 接口。 | 接口只能扩展另一个 Java 接口。 | 可以使用“extends”关键字来扩展抽象类。 | 可以使用关键字 "implements" 来实现接口。 | Java 抽象类可以具有类成员,如 private、protected 等。 | Java 接口的成员默认为 public。 | 示例 public abstract class Shape{ public abstract void draw(); } | 示例 public interface Drawable{ void draw(); } |
Java 中抽象类和接口的示例让我们看一个使用接口和抽象类的简单示例。 输出 I am a
I am b
I am c
I am d
要记住的重要事项- 抽象类提供部分抽象 (0-100%),而接口提供完全抽象 (100%)。
- 接口支持多重继承,这允许一个类实现多个接口,有助于避免多类继承中出现菱形问题。
- 抽象类可以有构造函数、静态方法、实例变量和任何访问修饰符(private、protected 等),而接口不能有构造函数,并且它们的成员默认为 public、static 和 final。
- Java 8 引入了接口中的默认方法和静态方法,允许在接口内进行有限的实现,而传统接口只能声明抽象方法。
- 一个类可以扩展一个抽象类,但同时实现多个接口,这使得接口在多类型继承场景中更加灵活。
- 当一个类具有应与其子类共享代码或状态的基类时,请使用抽象类。当只想定义多个类可以遵循的契约或功能时,请使用接口。
- 可以将两者结合起来——一个类可以同时扩展一个抽象类并实现一个或多个接口。
- 接口更适合 API 设计或松耦合系统,而抽象类更适合具有通用功能的框架和基类。
抽象类和接口 MCQ1. 下列哪一项是抽象类可以拥有的,而接口不能拥有的? - 方法声明
- Final 方法
- 静态方法
- 构造函数
答案:D) 解释:抽象类可以有一个构造函数,而接口不能。
2. 一个类在 Java 中可以实现多少个接口? - 只有一个
- 两个
- 多次
- 无
答案:C) 解释:Java 中的一个类可以实现多个接口。
3. 接口独有,而抽象类中不可用的功能是? - 抽象方法
- 具体方法
- 默认方法
- 私有方法
答案:C) 解释:Java 8 及更高版本中的接口可以有默认方法,这些方法提供方法实现,而抽象类不能有默认方法。
4. 抽象类可以直接实例化吗? - 是的
- 不能
- 只有当它有一个构造函数时
- 只有当它没有抽象方法时
答案:B) 解释:抽象类不能直接实例化;它需要一个子类来为其抽象方法提供实现。
5. 下列哪一项是关于 Java 中抽象类而非接口的真理? - 它们可以有抽象方法
- 它们可以扩展其他类
- 它们可以被实例化
- 它们可以有静态方法
答案:B) 解释:抽象类可以扩展其他类,而接口不能。 |