为什么类只能单继承,而接口可以多继承?

本文探讨了Java中接口与类的继承特性,指出接口可以多继承,但默认方法的重写会导致菱形继承冲突,而类只能单继承。在菱形继承时,接口的抽象方法不会造成问题,但默认方法的冲突会引发编译错误。总结了类和接口继承的区别,并通过实例进行了详细解释。
摘要由CSDN通过智能技术生成

我们都知道,在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
{
    //类编译错误
}


于是,我们又发现,子类继承父类,重写了这个方法,也影响了该方法,所以菱形继承发生错误了。

本人水平有限,如果有什么不对的地方,欢迎各位大佬指正。

抽象接口是面向对象编程中的两个重要概念,它们在实现上有一些区别,导致抽象可以实现接口,而接口不能继承抽象。下面我来详细解释一下原因: 1. 抽象的特点: 抽象是一种不能被实例化的,它只能作为其他的基来使用。抽象可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,需要子去实现。非抽象方法则有具体的实现,子可以直接继承和使用。由于抽象可以包含非抽象方法,所以它可以提供一些默认的实现,子可以选择性地覆盖这些方法。 2. 接口的特点: 接口是一种纯粹的规范,它定义了一组方法的签名,但没有具体的实现。接口中的所有方法都是抽象方法,子必须实现接口中定义的所有方法。接口可以被多个同时实现,一个可以实现多个接口。 由于抽象可以包含非抽象方法的具体实现,所以它可以实现接口中定义的方法。这样做的好处是,当一个同时需要提供一些默认的实现和遵循某个接口时,可以使用抽象来实现接口中的方法,并在抽象中提供默认的实现。子可以选择性地覆盖这些方法,或者直接继承使用。 而接口不能继承抽象的原因是,接口是一种纯粹的规范,它只定义了方法的签名,没有具体的实现。接口的目的是为了实现提供一种规范,要求实现必须实现接口中定义的所有方法。如果接口可以继承抽象,那么就会导致接口中包含了具体的实现,违背了接口的设计初衷。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值