Java 中抽象类和接口的区别

2025年6月19日 | 阅读 5 分钟

抽象类

使用 abstract 关键字声明的类称为抽象类。它可以包含抽象方法和非抽象方法(带有主体的方法)。抽象类是不能直接实例化的类。它用作其他类的蓝图。

阅读更多 Java 中的抽象类

抽象类示例

示例

编译并运行

输出

drawing rectangle

Interface

Java 中的接口是类的蓝图。它具有静态常量和抽象方法。

接口是实现 Java 中抽象和多重继承的机制。它只能有抽象方法(没有主体的方法)。

  • Java 接口也代表了 IS-A 关系。
  • 它不能像抽象类一样被实例化。
  • 从 Java 8 开始,我们可以在接口中拥有默认方法和静态方法。
  • 从 Java 9 开始,我们可以在接口中拥有私有方法。

要了解更多信息,请阅读Java 中的接口

接口示例

示例

编译并运行

输出

drawing rectangle

抽象类 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 设计或松耦合系统,而抽象类更适合具有通用功能的框架和基类。

抽象类和接口 MCQ

1. 下列哪一项是抽象类可以拥有的,而接口不能拥有的?

  1. 方法声明
  2. Final 方法
  3. 静态方法
  4. 构造函数
 

答案:D)

解释:抽象类可以有一个构造函数,而接口不能。


2. 一个类在 Java 中可以实现多少个接口?

  1. 只有一个
  2. 两个
  3. 多次
 

答案:C)

解释:Java 中的一个类可以实现多个接口。


3. 接口独有,而抽象类中不可用的功能是?

  1. 抽象方法
  2. 具体方法
  3. 默认方法
  4. 私有方法
 

答案:C)

解释:Java 8 及更高版本中的接口可以有默认方法,这些方法提供方法实现,而抽象类不能有默认方法。


4. 抽象类可以直接实例化吗?

  1. 是的
  2. 不能
  3. 只有当它有一个构造函数时
  4. 只有当它没有抽象方法时
 

答案:B)

解释:抽象类不能直接实例化;它需要一个子类来为其抽象方法提供实现。


5. 下列哪一项是关于 Java 中抽象类而非接口的真理?

  1. 它们可以有抽象方法
  2. 它们可以扩展其他类
  3. 它们可以被实例化
  4. 它们可以有静态方法
 

答案:B)

解释:抽象类可以扩展其他类,而接口不能。


下一主题Java 中的包