1、类继承会导致派生类如果不需要覆盖基类的方法时,基类被继承过来的方法仍可能有实现的细节即方法体,那么菱形继承问题是多继承下的产物:B,C继承A,D继承B,C,在不考虑B,C为抽象类且方法不存在被实现的方法时,D会继承B,C的所有方法,那么D的方法继承的是B,C哪个类的方法呢?或许已经存在解决办法,但是明显存在不安全因素。(这个地方我也没去试,因为这个问题C++早就给出了解决方案,所以试也试不出来)
2、但是接口为什么又是多继承呢?因为在第一点中提到,继承过来的方法可能有方法体,在接口中方法都是public的抽象方法,或许有默认实现,但是不会被继承过去。那么多继承存在的菱形继承就不攻自破了,是的,关键就是继承后这个方法仍然没有被实现那么就可以使用多继承。也就是说Java的抽象类应该可以进行多继承操作,前提是派生类也是抽象类。(这里我没有去进行操作了,各位看客可以试试)
为什么默认实现不会被继承呢?
如下图,当我想调用D.point()方法时,由于没有被实现,和E同样的操作,但是编译器却给了一个没有实现的提示,这就说明规定默认实现本质是独立于接口继承的,可能细节性的地方没去探究了,但是已经能证明接口可以有安全的多继承了。
public interface A {
public default void point(){
System.out.println("A");
}
}
interface B extends A{
public default void point(){
System.out.println("B");
}
}
interface C extends A{
public default void point(){
System.out.println("C");
}
}
interface D extends B,C{
public void point();
}
interface E extends B,C{
public default void point(){
System.out.println("E");
}
}
本人是Android开发的,偶尔会看看Java的书,正巧看到接口多继承这里意识到还不知道为什么,于是就有了这篇文章。