Java面试知识点(三)Java中的单继承和多继承
多继承的优缺点
优点:对象可以调用多个父类中的方法
缺点:如果派生类所继承的多个父类有相同的父类(也就是一个菱形继承结构),而派生类对象需要调用这个祖先类的方法,就会容易出现二义性。
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 还是两个都写,都是错误的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!