java不支持多继承的原因
来源:互联网 发布:js脚本 调用 c dll 编辑:程序博客网 时间:2024/05/17 09:12
A:
多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。例如:
类ClassA:
public class ClassA {
protected int varSame = 0;
}
类ClassB:
public class ClassB {
protected int varSame = 1;
}
子类ClassC:(假设允许类与类之间多继承)
public class ClassC extends ClassA, ClassB {
public void printOut() {
System.out.println(super.varSame);
}
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut();
}
}
上面程序的运行结果会是什么呢?输出0还是1?
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。例如:
类ClassA:
public class ClassA {
public void printOut() {
System.out.println(0);
}
}
类ClassB:
public class ClassB {
public void printOut() {
System.out.println(1);
}
}
子类ClassC:(假设允许类与类之间多继承)
public class ClassC extends ClassA, ClassB {
public static void main(String[] args) {
ClassA classA = new ClassC();
classA.printOut(); // ------------------------- A行
ClassB classB = new ClassC();
classB.printOut(); // ------------------------- B行
ClassC classC = new ClassC();
classC.printOut(); //------------------------- C行
}
}
上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?
正因为有以上的致命缺点,所以java中禁止一个类继承多个父类;
在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
B:
所谓继承,就是重新使用接口。
使用继承时,相当于创建了一个新类。这个新类不仅包含了现有类型的所有成员(尽管private成员被隐藏起来,且不能访问),但更重要的是,它复制了基础类的接口。也就是说,可向基础类的对象发送的所有消息亦可原样发给衍生类的对象。
继承的结局:继承最终会以创建一系列类收场,所有类都建立在统一的接口基础上。
所有类最终是否都应从单独一个基础类继承,Java的回答是肯定的。单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型。
为什么C++没有采用单根结构呢?事实上,这是早期在效率与控制上权衡的一种结果。单根结构会带来程序设计上的一些限制。而且更重要的是,它加大了新程序与原有C代码兼容的难度。尽管这些限制仅在特定的场合会真的造成问题,但为了获得最大的灵活程度,C++最终决定放弃采用单根结构这一做法。
--参见《Think in Java》
- java不支持多继承的原因
- java 中不支持多继承的原因
- Java不支持多继承的原因
- java不支持多继承支持多接口的原因
- Java 不支持多继承
- java不支持多继承思考
- Java不支持多继承,但是。。。
- java为什么不支持多继承
- Java为什么不支持多继承
- 为什么Java不支持多继承
- Java为什么不支持多继承
- java为什么不支持多继承
- 为什么Java不支持多继承?
- java为什么不支持多继承
- Java中Observable不支持多继承的解决方法
- java类单继承,接口多继承设计的原因
- Java 不支持多继承,所以引入接口
- 为何Java 类不支持多继承?
- C51 两种对内存空间地址写数据的方法
- 生产者消费者问题--多线程
- 最小优先级队列(数组表示)
- 用术语写的情诗
- 病毒式营销推广方案(重做)
- java不支持多继承的原因
- c# 发送电子邮件代码
- TCPIP协议图
- 通过反射来构造内部类的三种情况
- 0到1024端口的作用
- C#序列化的最简单办法
- Java SourceCode Parsing(Java源代码分析器)
- 学习CSLA.net的一些感受
- 内联函数学习笔记