2

在 Java 继承中,“重写抽象方法”这个表述可以与“实现一个抽象方法”这个表述互换使用吗?

我在“OCA Java SE 8 Programmer I Study Guide”一书中第 5 章第 296 页的问题 #15 中遇到了以下问题:

问:关于具体子类,下列哪项是正确的?(选择所有适用的)

  • A. 一个具体的子类可以声明为抽象的。
  • B. 具体的子类必须实现所有继承的抽象方法。
  • C. 具体的子类必须实现继承接口中定义的所有方法。
  • D. 一个具体的子类不能被标记为最终的。
  • E. 抽象方法不能被具体的子类覆盖。

我的答案是 B & E。但是书上说,正确的答案只有 B。我的问题是关于选项 E。书上说,选项 E 不正确,因为抽象方法必须被具体的子类覆盖。我最初的想法是抽象方法必须在被子类覆盖之前实现。那么为什么选项不正确呢?

4

2 回答 2

1

抽象方法是一种已声明包含实现的方法。

  • 您可以在抽象类中覆盖抽象方法和普通方法。
  • 只有声明为的final方法不能被覆盖。
于 2018-02-02T03:56:03.913 回答
1

让我一次一个地解释每一点。

A. 一个具体的子类可以声明为抽象的。

答:不正确。

根据定义,具体类是那些can be instantiated和此类can also extends是基本抽象类的类。

B. 具体的子类必须实现所有继承的抽象方法。

答:正确

如果方法标记为abstracts在基类中,则扩展基类的子类应确保实现所有抽象方法。You will otherwise get a compile time error.

C. 具体的子类必须实现继承接口中定义的所有方法。

答:不正确

仅当具体子类具有directly implemented the interface by this class itself.

但是在这种情况下,基类可能已经实现了继承的接口。因此,由于从接口继承,具体子类不需要实现基类中的所有方法。

D. 一个具体的子类不能被标记为最终的。

答:不正确

如果一个子类被标记为 final,那么这个类就不能再被任何其他可用的子类扩展。用关键字标记类final特别用于实现不变性。

使用不可变类,我们可以调用访问器方法(例如 getter 方法)、复制对象或传递对象——但任何方法都不应允许修改对象的状态。示例:字符串、封装类,如 Float、Integer.etc。

E. 抽象方法不能被具体的子类覆盖。

答:不正确

根据定义,抽象方法是仅声明但不包含主体或实现的方法。由于我们无法实例化抽象类,因此由子类为这些已定义的抽象方法提供实现。Hence abstract methods are not optional but mandatorily be overridden by a inheriting subclass.

于 2018-02-02T04:56:17.030 回答