Java的继承与实现

一、Java的继承与实现

继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。这种派生方式体现了传递性

在Java中,除继承,还有一种体现传递性的方式叫实现。那么,这两者方式有何区别?

继承和实现区别如下:

继承(Inheritance):如果多个类的某部分功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们继承这个父类。

实现(Implement):如果多个类处理的目标一样,但是处理的方法方式不同,那就定义一个接口,也就是一个标准,让他们的实现这个接口,各自实现自己具体的处理方法来处理那个目标

继承指的是一个类(称为子类、子接口)继承另一个类(称为父类、父接口)功能,并可以增加它自己新功能的能力。

所以,继承的根本原因是因为要复用,而实现的根本原因是需要定义一个标准

Java中,继承用extends关键字实现,实现用implements关键字实现。

例如,同样是一台汽车,既可以是电动车,也可以是汽油车,也可以是油电混合,只要实现不同的标准就行,但一台车只能属于一个品牌,一个厂商。

class Car extends Benz implements GasolineCar, ElectroCar{}

以上,定义了一辆汽车,他实现了电动车和汽油车两个标准,但是它属于奔驰这个品牌。像上面这样定义,可以最大程度遵守标准,且复用奔驰车所有已有的一些功能组件。

另外,在接口中只能定义全局常量(static final)和无实现的方法(Java 8以后可以有default方法);而在继承中可以定义属性方法,变量,常量等。

特别需要注意的是,Java中支持一个类同时实现多个接口,但不支持同时继承多个类。 但是这个问题在Java 8之后也不绝对。


二、Java为什么不支持多继承

多继承

一个类,只有一个父类,叫单继承。同时有多个父类,叫多继承。

在Java中,一个类,只能通过extends关键字继承一个类,不允许多继承。但多继承在其他的面向对象语言中是有可能支持的。

像C++支持多继承,主要是因为编程的过程是对现实世界的一种抽象,而现实世界中,确实存在着需要多继承的情况。

例如,可以创造一个“哺乳类动物”类别,拥有进食、繁殖等的功能;然后定义一个子类型“猫”,它可以从父类继承上述功能。

但是,"猫"还可以作为"宠物"的子类,拥有一些宠物独有的能力。

所以有些面向对象语言支持多重继承。

但是,多重继承一直是敏感的话题,反对者指它增加了程序复杂性与含糊性。


菱形继承问题

假设有类B和类C,它们都继承了相同的类A。另外还有类D,类D通过多重继承机制继承类B和类C。

这时因为D同时继承B和C,且B和C又同时继承A,那么,D中就会因为多重继承,继承到两份来自A中的属性和方法。

这时在用D的时候,如果调用一个定义在A中的方法时,就会出现歧义。

而C++为解决菱形继承问题,引入了虚继承

因为支持多继承,引入了菱形继承问题,又因为要解决菱形继承问题,引入了虚继承。而经过分析,人们发现其实真正要用多继承的情况并不多。

所以,在 Java 中,不允许“实现多继承”,即一个类不允许继承多个父类。但 Java 允许“声明多继承”,即一个类可实现多个接口,一个接口也可继承多个父接口。由于接口只允许有方法声明而不允许有方法实现(Java 8前),这避免了 C++ 中多继承的歧义问题。

但Java不支持多继承,在Java 8中支持了默认函数(default method )之后就不那么绝对。

虽然我们还是没办法用extends同时继承多个类,但是因为有了默认函数,可能通过implements从多个接口中继承到多个默认函数,那么,又如何解决这种情况带来的菱形继承问题呢?

未完待续......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王雀跃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值