CodeGym /课程 /Java 核心 /继承多个接口

继承多个接口

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

“你好,阿米戈!终于要说一些有趣的内容了。今天我要说一说多重继承。多重继承非常有趣,而且又很强大。如果不是因为几个问题,Java 完全可以支持类的多重继承。但现实就是如此,不过它支持类实现多个接口,我们也就心满意足了。可别小看了这个功能。”

继承多个接口 - 1

假设你在写一个计算机游戏。它的角色(你的对象)的行为方式非常复杂:在地图上行走,收集物品,执行目标,与其他角色对话,杀死某人,拯救他人。假设你已经将所有对象划分为 20 个类别。这就意味着,如果你够幸运的话,你就只需要 20 个类来定义对象。但有个问题:这些对象有多少种不同形式的交互。每种类型的对象都可以与其他 20 种对象进行互动(我们还计算出相同类型对象的互动)。换句话说,你要编写 20 x 20 = 400 次交互的代码!如果这种唯一类型对象的数量不是 20,而是 100,那么交互的数量可能是 10000!

“哇!”现在我知道为什么编程这么难了。”

“现在简单了。我们可以用抽象,当然,还有接口的多重继承。”

如果角色和/或能力交互而不是对象本身交互,我们通常可以简化对象交互。而且,我们也已经知道,在类实现某些接口时,能力可轻松添加到类中。

编写大程序时,开发人员通常从一开始就这么做:

1)确定所有能力/角色。

2)定义这些角色之间的交互。

3)然后只要将角色分配给所有类。

“可以举个例子吗?”

“当然。还让我们看看动画片《汤姆和杰瑞》里的角色”。

Java 语言代码 说明
interface Moveable
{}
— 角色/移动能力。
interface Eatable
{}
— 角色/被吃的能力。
interface Eat
{}
— 角色/吃别人的能力。
class Tom extends Cat implements Moveable, Eatable, Eat
{}
汤姆是一只具有三个角色的猫:
1) 他可以移动
2) 他可以吃别人
3) 他可以被别人(狗)吃掉
class Jerry extends Mouse implements Moveable, Eatable
{}
杰里是具有两个角色的老鼠:
1) 他可以移动
2) 他可以被别人吃掉
class Killer extends Dog implements Moveable, Eat
{}
Killer(杀手)是一条具有两个角色的狗:1) 他可以移动 2) 他可以吃别人

只要了解这三个角色(接口),你就可以编写程序并描述这些角色之间的正确交互。例如,一个对象会追逐(通过 Moveable 接口)“你可以吃的人”,并远离“一个可以吃掉你的人”的对象。所有这些都不需要了解特定对象。如果你要在程序中添加更多对象(类)并保留这些角色,它仍可以很好地运行,从而控制对象的行为。

评论 (11)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Qin-1999 级别 22
10 一月 2024
我的对象?我对象怎么了
KAI 级别 22,Wenzhou,China
16 五月 2023
假设你在写一个计算机游戏。它的角色(你的对象)的行为方式非常复杂:在地图上行走,收集物品,执行目标,与其他角色对话,杀死某人,拯救他人。假设你已经将所有对象划分为 20 个类别。这就意味着,如果你够幸运的话,你就只需要 20 个类来定义对象。但有个问题:这些对象有多少种不同形式的交互。每种类型的对象都可以与其他 20 种对象进行互动(我们还计算出相同类型对象的互动)。换句话说,你要编写 20 x 20 = 400 次交互的代码!如果这种唯一类型对象的数量不是 20,而是 100,那么交互的数量可能是 10000! 这句话没读懂!
Qin-1999 级别 22
10 一月 2024
意思是每个交互都要再写一遍代码,人会累死,但我们直接调用就只需要秃头就行
Super Ego 级别 14,Wu Han,China
13 三月 2023
可惜还是没讲明白我想听的,为啥不直接实现Java的多重继承,那几个问题到底是啥
元. 级别 26,Taipei,Taiwan, Province of China
28 三月 2023
這堂課下面有解釋 https://codegym.cc/groups/posts/103-specific-examples-of-abstract-classes-in-java
Qin-1999 级别 22
10 一月 2024
Java不允许单个类直接继承多个类的主要原因是为了避免多重继承可能引发的一些复杂性和歧义性的问题。多重继承指的是一个类同时直接继承自多个父类。 Diamond继承问题: 当一个类继承自两个具有共同父类的类时,如果这两个父类有相同的方法或属性,那么在子类中调用这个方法或属性时会引发二义性,导致不确定性。 代码复杂性: 多重继承可能会导致代码复杂性的增加,因为在处理不同父类之间的交互时,程序员可能需要更复杂的设计和调试。 冲突解决: 如果多个父类中存在相同的方法,Java必须提供一种机制来解决调用这些方法时的冲突。这可能需要引入额外的语法或规则,增加语言的复杂性。
Qin-1999 级别 22
10 一月 2024
简单来说,不允许的主要原因是不希望语言太复杂,让人能更简单的使用,但类似C++一类的语言是可以继承的,但它们的语言复杂程度和维护难度会比Java要高太多了
拔萝卜滴🐰 级别 22,chengdu,China Expert
11 二月 2023
茅塞顿开
Hulkchan 级别 14
11 四月 2021
属性用抽象类继承,能力用接口?
Archie 级别 15,China
5 十一月 2021
接口是一个纯工具, 只能够提供抽象方法, 没有属性. 而抽象类里面是存在属性的, 所以一般在抽象类定义属性, 在接口定义方法, 然后用抽象类, 或者实体类去实现接口, 以简化抽象类继承带来的属性冗余, 有解决了单继承的缺点.
老杨 级别 41,China,China
24 二月 2022
抽象就是讲类似的部分抽取出来归总的现象,抽象类也是如此,因此,抽象类就是一个模板。接口作为功能,标准,能力的抽取。接口中定义的只有抽象方法,从java9(不确定是不是该版本)开始提供了static和default的方法。但是一个类有可能同时需要实现多个接口,但是多个接口中很有可能并不是所有的方法都是这个类所需要的,此时就可以通过抽象类作为类的父类模板,同时该抽象父类作为适配器去实现子类所需要的多个接口,同时在抽象父类中对接口的方法进行统一假实现,而真正的接口方法的实现通过子类来最终完成。