【java扫盲】Java中的单继承和多继承

本文探讨了Java与C++在多继承方面的差异。Java采用单继承并支持接口多实现,以避免多继承带来的复杂性和二义性问题。C++则允许类的多继承,可能导致菱形继承的二义性。接口在Java中可以继承多个接口,因为它们只包含抽象方法,不增加复杂性。Java选择单继承是为了简化类的结构,但通过接口实现了类似多继承的功能。文章还通过示例解释了多继承中方法重名导致的编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多继承的优缺点

优点:对象可以调用多个父类中的方法

缺点:如果派生类所继承的多个父类有相同的父类(也就是一个菱形继承结构),而派生类对象需要调用这个祖先类的方法,就会容易出现二义性。

菱形继承结构


1、java 与 C++ 的不同点在于多继承。

Java:不能多继承,只能单继承,但可以实现多个接口

C++:可以实现多继承。

例如: class A extends B implements C,D,E {}


2、如若写成 interface A extends B,C,D 可以编译通过,这样是不是违背了 JAVA 的单继承特性呢?

(1)接口可以继承多个接口是因为接口里面的定义的方法都是未实现的,不会增加复杂性。

(2)接口不是类,而是对类的一组需求的描述。接口绝不能含有实例域,也不能在接口中实现方法。接口可以实现多继承不会增加代码的复杂性。

(3)多继承是发生在执行期间的,而不是在编译期间,所以可以编译通过,并且不违背 Java 是单继承的。


3、为什么接口可以继承多个接口?

因为接口定义的都是抽象的方法,而且不能在接口中实现方法。所以,接口继承多个接口,并不会使接口的结构变得很复杂。相反,这样做,还能给一个团队在开发的过程中,提供很多便利。

单继承指的是 class,而不是 interface. interface 是可以多继承的。

接口可以多继承可以被多实现,因为接口中的方法都是抽象的,这些方法都被实现的类所实现,即使多个父接口中有同名的方法,在调用这些方法时调用的是子类的中被实现的方法,不存在歧义;同时,接口的中只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。 对于一个接口继承多个父接口的情况也一样不存在这些缺点。所以接口可以多继承。


4、为什么 JAVA 改成只能单继承?

因为在 C++ 中一个类是可以继承自多个类,但这样的机制会使类的结构变的很复杂,所以 JAVA 将 C++ 这一机制通过接口得以改善。
JAVA 中不允许类多重继承,只能单一继承,但有些情况单一继承并不能表达出现实世界中的某些逻辑关系,所以就提出了通过接口来实现多重继承。


5、多继承中 父类方法重复

public interface interfaceA {
    public void fun1();
    public void fun2();
    public void fun3();
}

public interface interfaceB {
    public void fun1();
    public void fun2(String str);
    public String fun3();
}

public interface interfaceC  extends interfaceA,interfaceB {

}

public class Test implements interfaceC {
    @Override
    public void fun1(){
    }

    @Override
    public void fun2(){
    }

    @Override
    public void fun2(String str){
    }

    @Override
    public void fun3(){// 报错
    }
    
}

总结:
多继承的fun1 和fun2 分别是同一个函数和重载的两个函数(参数不同) ,但是fun3只是返回值不同,不符合java重载的规范,编译器无法区分,所以不论写void fun3 还是String fun3 还是两个都写,都是错误的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值