java为什么搞单继承,多继承有什么坏处
2010-06-17 16:48
204 查看
多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。例如:
类ClassA:
子类ClassC:(假设允许类与类之间多继承)
上面程序的运行结果会是什么呢?输出0还是1?
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。例如:
类ClassA:
上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?
正因为有以上的致命缺点,所以java中禁止一个类继承多个父类;
在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jay198746/archive/2010/05/28/5630276.aspx
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。例如:
类ClassA:
public class ClassA { protected int varSame = 0; } 类ClassB: public class ClassB { protected int varSame = 1; }[/code]
子类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(); } }[/code]
上面程序的运行结果会是什么呢?输出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中禁止一个类继承多个父类;
在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jay198746/archive/2010/05/28/5630276.aspx
相关文章推荐
- 多继承有什么坏处,为什么java搞单继承,接口为什么可以摈弃这些坏处
- 2018/01/08JAVA 基础 / 接口与继承/Object类——[思考?question:Object类的方法有什么用?为什么不直接在类中设计方法?
- Java为什么不使用多继承
- java为什么抛弃多类继承?
- struts2中的action为什么要继承ActionSupport类,不继承也可以,有什么好处?
- java下Class.forName的作用是什么,为什么要使用它
- java中接口可不可以继承一般类,为什么?
- 为什么需要多重继承?它的优缺点是什么?
- 关于为什么在有继承关系的类结构中,析构函数destructor要是virtual以及如果不是会发生什么
- Java 面向对象之继承从哪来,为什么用,怎么用?
- Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
- 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项
- 为什么Java中继承多数是有害的
- java的ArrayList中,数组为什么被transient修饰,这是因为什么原因而设计出来的?
- 为什么Java中继承多数是有害的
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
- 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项
- 什么是JAVA语言为什么要学习JAVA
- java中类继承,到底继承了什么?
- java下Class.forName的作用是什么,为什么要使用它