“你好,阿米戈!昨天你学习了抽象类。现在巩固下这个知识点吧。我想教你如何正确使用抽象类。”

现在一时想不起来抽象类的现实类比。类通常是某个实体的模型。抽象类主要包含尚未实现的方法,但也可以包含已实现的方法。这是什么意思呢?我们能不能找一个抽象类的类比?现实生活中有没有这样的例子?

事实上还真有。想象一下传送带上一辆接近成品的汽车的底盘。我可以安装加强型发动机,也可以安装高效发动机。可以装皮革内饰,也可以装织物内饰。汽车具体的实现尚未决定。此外,底盘也可用来产生几种特定的实现。但是当前形式的汽车是没人要的。这是一个经典的抽象类:创建它的实例没有任何意义,因此你无法创建它们;该类之所以有意义,是因为在此基础上创建了许多完整的继承人。

“这很简单!”

不过可能还有更抽象的类比。更像包含一些已实现方法的接口。例如,一个专业的口译员。在不指定源语言和目标语言的情况下,他就是“抽象翻译员”。或者说保镖。我们可能知道他精通武功,可以保护他的客户。但他身怀哪些绝技,又如何保护客户,这些都是这个保镖的“实现细节”。

让我们看这样一个例子:

Java 语言代码 说明
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot(Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot(attacker);
  else
     applyMartialArts(attacker);
 }
}
BodyGuard 类决定如何应对攻击:开枪或用武功。

不过,何种路数的武功并未指定,尽管我们确定该技能存在。

我们可以通过继承这个类的方式创建几个不同的保镖。所有保镖都能够保护客户并射杀攻击者。

3
任务
Java 核心,  第 3 级课程 3
已锁定
Code entry
Your attention, please! Now recruiting code entry personnel for CodeGym. Turn up your focus, let your fingers relax, read the code, and then... type it into the appropriate box. Code entry is far from a useless exercise, though it might seem so at first glance: it allows a beginner to get used to and remember syntax (modern IDEs seldom make this possible).

“你说的对!它更像是一个包含已实现方法的接口。”

“是的,这种类型的抽象类在标准的 Java SE 类中很常见。”