Java 中的 abstract 关键字

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

Java 的 abstract 关键字 是一个非访问修饰符,用于类和方法以实现抽象。

abstract 关键字的用途

abstract 关键字通过允许我们定义类的蓝图或契约,而无需提供完整的实现细节,从而促进了 抽象。它促进了代码的重用,并强制子类实现特定的结构和行为,确保它们实现某些方法。

abstract 关键字的特征

  1. abstract 关键字可用于声明抽象类和抽象方法。
  2. 我们不能直接创建抽象类的对象。它是为了被子类继承而设计的。
  3. 抽象方法没有主体(即没有实现)。方法以分号结尾:abstract void draw();
  4. 抽象类可以实现接口,接口定义了一组方法,任何实现该接口的类都必须实现这些方法。
  5. 抽象类可以包含抽象方法和具体的(常规)方法(带有实现)。
  6. 抽象类可以拥有实例变量、构造函数,甚至静态方法。它们可以被抽象类本身及其子类使用。子类可以直接访问这些变量。
  7. abstract 关键字不能与变量和构造函数一起使用。
  8. 我们不能将 abstract 关键字与 final 一起使用。

abstract 关键字的用法

abstract 关键字用于定义抽象类和抽象方法。

抽象类

抽象类是不能被实例化的类(你不能创建它的对象),并且可能包含抽象方法(没有主体的方法)。例如,java.lang.Number 类是一个抽象类。

  • 抽象类可以包含构造函数和静态方法。
  • 抽象类可以包含重载的抽象方法。
  • 我们可以将局部内部类声明为 abstract。
  • 我们可以声明一个带有 throw 子句的抽象方法。

阅读更多 Java 中的抽象类

语法

抽象方法

在抽象类中使用 abstract 关键字声明但没有定义(实现)的方法称为抽象方法。当我们在超类中只需要方法声明时,可以通过将方法声明为 abstract 来实现。

  • 我们不能将抽象方法声明为 private
  • 我们不能将抽象方法声明为 static
  • 抽象方法不能是同步的。

阅读更多 Java 中的抽象方法

注意:我们不能在非抽象类中声明抽象方法。

语法

abstract 关键字的示例

将 abstract 关键字与类和方法一起使用

示例

编译并运行

输出

Dog barks
This animal eats food.

使用具有多个子类的抽象类

示例

编译并运行

输出

Drawing Circle
Drawing Square

abstract 关键字最佳实践

  • 抽象类用于共享代码: 当需要共享代码时,使用抽象类,以便多个子类可以继承该代码。
  • 强制实现: 在子类中实现所有抽象类的方法。
  • 抽象方法用于接口: 如果有一个充当基类的类,并要求覆盖某些方法,则使用抽象方法来强制执行此契约。
  • 不能实例化: 不能直接创建抽象类的实例。因此,我们必须创建实现了所有抽象方法的子类的实例。
  • 抽象类构造函数: 抽象类可以有构造函数,可以在实例化子类时调用。
  • 带接口的抽象类: 接口可以与抽象类一起实现。我们可以在抽象类中定义接口的某些方法,而将其他方法留为空白,以便在子类中实现。
  • 静态成员: 抽象类可以拥有静态成员,无需创建抽象类的实例即可访问。

结论

当在密切相关的类之间共享代码时,使用抽象类;使用接口定义任何类都可以实现的契约,而不管它在类层次结构中的位置如何。

Java abstract 关键字选择题

1. 关于 Java 中的抽象类,以下哪个陈述是正确的?

  1. 抽象类可以直接实例化。
  2. 抽象类必须至少有一个抽象方法。
  3. 抽象类可以同时拥有抽象方法和非抽象方法。
  4. 抽象类不能有构造函数。
 

答案:C

解释: 抽象类可以包含抽象方法(无主体)和具体方法(有主体)。它不能被实例化,并且可以有构造函数。抽象类不一定必须有抽象方法。


2. 如果子类没有覆盖其抽象超类的所有抽象方法,会发生什么?

  1. 编译错误
  2. 运行时异常
  3. 子类自动变为具体类
  4. JVM 跳过方法执行
 

答案: A

解释: 如果子类没有为所有继承的抽象方法提供实现,它也必须被声明为 abstract;否则,编译器将抛出错误。


3. 在 Java 中,哪个关键字用于定义没有实现的方法?

  1. final
  2. static
  3. private
  4. abstract
 

答案: D

解释: abstract 关键字用于定义没有主体且必须由子类覆盖的方法。


4. 在抽象方法中,以下哪项是不允许的?

  1. 无方法体
  2. 以分号结尾
  3. private 访问修饰符
  4. 在抽象类中声明
 

答案:C

解释: 抽象方法不能是 private 的,因为它们必须对子类可见以便覆盖。它们通常是 public 或 protected。


5. 以下哪些可以成为 Java 抽象类的一部分?

  1. 静态方法
  2. final 变量
  3. 构造函数
  4. 以上全部。
 

答案: D

解释: 抽象类可以有静态方法、final 变量和构造函数。虽然我们不能实例化抽象类,但在创建子类对象时仍会使用构造函数。