Java中类的单继承,接口的多继承

结论:

Java类(class)是只能单继承;(classB Extends classA)

Java接口(interface)是可以多继承(Interface3 Extends Interface0, Interface1, interface2...)

(PS:Java理论上是只支持单继承,但是可以使用上面两种方式实现另一种意义上的多继承)

继承的表现形式:

  1. 单继承:一个类只能继承一个类
  2. 多继承:一个接口可以继承多个类;一个类可以实现(implements)多个接口

继承的分类:

声明多继承”:Java接口的多继承形式(JDK<1.8),为了实现在接口中的方法声明

  1. Specific类 implements interface1,interface2(实体类实现多个接口类)
  2. Interface3 Extends Interface0, Interface1, interface2(接口类继承多个接口类)

(在JDK1.8之前,接口的方法是没有默认实现(default,static),所以接口中只有方法的声明,上面两种方式实现的多继承形式,也只是实现了继承方法的声明;JDk1.8以后的情况下面具体阐述)

实现多继承”:类的继承,为了重写(override)父类中的方法,以满足自身功能的实现

  1. Son类 extends Father类(子类继承父类)
(PS:Java不支持实现多继承,只能如上书写完成"实现单继承";这里的"实现多继承"即是我们常说的"多继承","实现单继承即是我们常说的"单继承")

Java只支持单继承的原因:

        不允许类多重继承的主要原因是:如果类A同时继承类B和类C,而类B和类C同时有一个D方法,类A如何决定该继承那一个呢?

这里就会出现菱形继承的问题!即两个父类继承自同一个基类,则子类中会包含两份祖父类的内容(方法函数),不合并重复内容会引起一些歧义,而合并重复内容又会导致类成员的内存布局不能简单复制地从父类复制。

(PS:定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。当宠物(子类)多继承了狗和猫,那么当我们调用宠物的“叫”这个方法时,它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。)

但接口不存在这样的问题,接口全都是抽象方法,没有具体的方法体实现,继承谁都无所谓,所以接口可以继承多个接口。

>= JDK1.8后的多继承:

在JDK1.8后,接口的方法可以有默认实现(default,static), 因而实质上Java 8的接口多继承形式其实也会涉及到实现多继承,并且语言层面有专门规定去解决实现多继承时选择哪个版本的问题——哪个都不选择,而是在发现会继承多个默认方法实现并且没有override时报错,逼使用户显式override可能冲突的方法。
这使得Java 8开始接口可以当作traits来使用 (本人未实验,只是道听途说,还需观众自行实现) ,达到实现多继承的目的

友情提醒:
  1. 重写方法时记得写上@Override注解
  2. 方法名不要在乎名字多长,但是一定要做到见名知意
  3. 不要滥用继承,也可以多考虑关联和依赖(is-a,has-a,use-a)
  4. 一个类如果实现了一个接口,则要实现该接口的所有方法;这样操作很麻烦时就用接口的默认实现(初学者慎用)
  5. 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值