首先,思考这么一种场景,如果当初 A 类继承了 B 类和 C 类,并且 B 类和 C 类中,都存在 test()办法,那么当 A 类对象调用 test()办法时,该调用 B 类的 test()呢?还是 C 类的 test()呢?是没有答案的,所以 Java 中不容许多继承。
然而,Java 中接口是能够多继承的,比方:
public interface A {
void test();
}
public interface B {
void test();
}
public interface C extends A, B{
}
复制代码
为什么接口能够?
因为都是 A、B、C 都是接口,就算 A、B 两个接口中都定义了 test 办法,因为接口中只是申明了办法,并没有真正实现办法,所以对于 C 接口而言并不会照成困扰,对于 C 接口而言它只是继承了同一个 test()办法的申明而已,在应用时须要 C 接口的实现类来实现这个 test()办法就能够了。
public class C1 implements C{
public void test() {System.out.println("hello Hoeller");
}
}
复制代码
那么接口中不是有 default 办法吗?那不是也能够在接口中来实现办法吗?
咱们间接来测试一下:
public interface A {
default void test() {System.out.println("a");
}
}
public interface B {
default void test() {System.out.println("b");
}
}
public interface C extends A, B{
}
复制代码
此时 C 接口会编译报错,报错信息为:
com.hoeller.C inherits unrelated defaults for test() from types com.hoeller.A and com.hoeller.B
翻不翻译都无所谓了,反正就是报错了,示意 C 接口不能同时继承两个接口中 default 办法 test()。
如果你问,那为什么 C ++ 中能够反对多继承,那得解释菱形继承、虚继承,本文就不剖析了(因为我也不晓得)。