大众号:Hoeller

首要,思考这么一种场景,假如现在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++中可以支撑多承继,那得解说菱形承继、虚承继,本文就不剖析了(由于我也不知道)。

你听说过大众号:Hoeller吗?

Java为什么不支持多继承