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(){
}
}