结论:
Java类(class)是只能单继承;(classB Extends classA)
Java接口(interface)是可以多继承(Interface3 Extends Interface0, Interface1, interface2...)
(PS:Java理论上是只支持单继承,但是可以使用上面两种方式实现另一种意义上的多继承)
继承的表现形式:
- 单继承:一个类只能继承一个类
- 多继承:一个接口可以继承多个类;一个类可以实现(implements)多个接口
继承的分类:
“声明多继承”:Java接口的多继承形式(JDK<1.8),为了实现在接口中的方法声明
- Specific类 implements interface1,interface2(实体类实现多个接口类)
- Interface3 Extends Interface0, Interface1, interface2(接口类继承多个接口类)
(在JDK1.8之前,接口的方法是没有默认实现(default,static),所以接口中只有方法的声明,上面两种方式实现的多继承形式,也只是实现了继承方法的声明;JDk1.8以后的情况下面具体阐述)
“实现多继承”:类的继承,为了重写(override)父类中的方法,以满足自身功能的实现
- Son类 extends Father类(子类继承父类)
Java只支持单继承的原因:
不允许类多重继承的主要原因是:如果类A同时继承类B和类C,而类B和类C同时有一个D方法,类A如何决定该继承那一个呢?
这里就会出现菱形继承的问题!即两个父类继承自同一个基类,则子类中会包含两份祖父类的内容(方法函数),不合并重复内容会引起一些歧义,而合并重复内容又会导致类成员的内存布局不能简单复制地从父类复制。
(PS:定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。当宠物(子类)多继承了狗和猫,那么当我们调用宠物的“叫”这个方法时,它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。)
但接口不存在这样的问题,接口全都是抽象方法,没有具体的方法体实现,继承谁都无所谓,所以接口可以继承多个接口。
>= JDK1.8后的多继承:
- 重写方法时记得写上@Override注解
- 方法名不要在乎名字多长,但是一定要做到见名知意
- 不要滥用继承,也可以多考虑关联和依赖(is-a,has-a,use-a)
- 一个类如果实现了一个接口,则要实现该接口的所有方法;这样操作很麻烦时就用接口的默认实现(初学者慎用)
- 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。