为何Java 类不支持多继承?

来源:互联网 发布:python 循环定时器 编辑:程序博客网 时间:2024/06/05 03:10

1.问题由来

本文部分内容引自此处,感兴趣者可以直接查看原链接。

Java语言特性之一是, 确切的说,其类对于多继承是不支持的(接口可以多继承),但是这是为什么呢?记得Thinking in Java中对于该问题有所阐述,单继承时,JVM的GC机制很好实现,有没有其他更深层次的原因呢?

2.问题解释

     A foo()       / \      /   \  B foo()   C foo()      \   /       \ /      D foo()

1). 首先是上图所示的‘钻石问题’。如果我们这时要调用的是foo()方法,编译器并不知道调用的是哪一个类的方法,这就会很尴尬了。

class A{    public void foo(){    }}class B extends A{    public void foo(){    }}class C extends A{    public void foo(){    }}//Not allowed here.public class D extends B, C{    public void foo(){    }}

但我们知道,其实C++中是支持多继承这个特性的,那么为什么Java不支持呢?下面会给出该问题的解答,其实这并不是一个技术上的问题,而是设计风格的问题,Java语言设计之初将其可维护性和设计的简洁性放在了很重要的地位,因而采取了单继承的策略。
2). 第二个原因是:多继承使得系统设计很繁杂,而且在类型转换、链式构造函数等问题上代价很大;而且考虑到没有很多地方用到多继承,所以取消多继承的决定是为了语言的简洁性考虑的。

3.进一步讨论

Java中interface可以extends多个interface;
Java中class可以implements多个interface
Java中的class只能extends 一个class。
Q: 为何Java可以支持实现多个接口?
A: 因为接口只有方法的声明部分,并没有提供方法实现,因而特定的方法只有一种实现,故而不会产生二义性。
Java实现多继承的方式

interface A{    void test();}interface B{    void test();}class C implements A,B{    @Override    public void test(){    }}