单继承和多继承
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 还是两个都写,都是错误的
上一篇: 数据类型的转换
下一篇: 接口的多实现和多继承