CodeGym /课程 /Java 核心 /如何使用抽象类

如何使用抽象类

Java 核心
第 3 级, 课程 3
可用

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

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

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

“这很简单!”

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

让我们看这样一个例子:

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 类中很常见。”

评论 (4)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
paul lee 级别 1
14 八月 2022
不太明白这个知识点
Super Ego 级别 14,Wu Han,China
13 三月 2023
这就是在讲为啥要允许抽象类里头有普通方法。文中的例子就是说“保镖”抽象类有两种方法:“用武功”和“开枪”,其中“用武功”是抽象方法,因为各家各派的武功不同;而“开枪”是普通方法,因为无论哪家哪派都是掏枪射击,他意思是说明白即便是抽象类也必须有共有的和具体的实现。
dty 级别 18,Changsha,China
3 七月 2024
感谢!
Grateful 级别 16,China,China
16 五月 2022
暗物质告急