我们都知道,在java当中类只可以单继承,而接口可以多实现.
总结:
(在不重写方法的情况下)接口是可以多继承的,在多继承的过程中子接口并不能对该抽象方法进行修改,到最后,B,C两个method方法在D中合二为一了。
先看一下下面的例子,再来看看这句话哦
我们现在通过菱形继承的例子来验证一下
1.接口的菱形继承(多继承)(抽象方法)
interface A
{
void method();
}
interface B extends A
{
}
interface C extends A
{
}
interface D extends B,C
{
void method(); //方法合二为一
}
我们可以看到,因为抽象方法没有方法体,所以子接口的继承并不会影响该方法。
那,如果换成默认方法呢?
注意:如果接口中的抽象方法被换成默认方法了,且子接口不要脸的重写了默认方法(虽然默认方法是可以不被重写的),那菱形继承就会发生错误。
interface A
{
public default void method()
{
}
}
interface B extends A
{
@Override
public default void method()
{
System.out.println("B不要脸的重写了A的默认方法");
}
}
interface C extends A
{
@Override
public default void method()
{
System.out.println("C不要脸的重写了A的默认方法");
}
}
interface D extends B,C
{
//编译报错 不能合二为一了
}
你看,子接口继承默认方法并重写了,影响了method方法,所以菱形继承发生错误了。
2.类只能单继承的,
**总结:**因为类在继承的过程中可以重写该方法,B C方法虽然都是method,但是,由于B,C中的method是有方法体的,可以重写内容,所以不一样了。随后,到了D中,这两个方法同名,但又不是重载形式,故矛盾了。
先看看下面的例子,再返回来看上面这段话。
class A
{
public void method()
{
}
}
class B extends A
{
@Override
public void method()
{
System.out.println("bbb");
}
}
class C extends A
{
@Override
public void method()
{
System.out.println("ccc");
}
}
class D extends B,C
{
//类编译错误
}
于是,我们又发现,子类继承父类,重写了这个方法,也影响了该方法,所以菱形继承发生错误了。
本人水平有限,如果有什么不对的地方,欢迎各位大佬指正。