c++继承与java继承的区别
来源:互联网 发布:js仿今日头条导航栏 编辑:程序博客网 时间:2024/06/10 14:44
C++支持多继承,java不支持多继承,但是java可以通过接口来间接的实现多继承的效果。
先来看看多继承会带来的问题,继承容易导致钻石危机(也称棱形问题),一幅图来说说明:
假设 类A 中有一个public方法 fun(),然后 类B 和 类C 同时继承了 类A,在 类B 或 类C 中各自对方法 fun()进行了覆盖,这时 类D 通过多继承同时继承了 类B 和 类C,这样便导致钻石危机了,程序在运行的时候对于方法 fun()该如何判断?
总结如下,主要有两个方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。对于一个接口继承多个父接口的情况也一样不存在这些缺点。
但是java中可以用接口和内部类的方式来间接达到多继承的效果:
//这是通过接口来间接实现多继承的
interface HowEat{
public abstract String howeat();
}
class Chenken implements HowEat{
public String howeat(){
return "chicken: fry it ";
}
}
class Orange implements HowEat{
public String howeat(){
return "orangr: make it juice";
}
}
//这是通过内部类来实现的
class Father{
public void output(){
System.out.println("father");
}
}
class Mother{
public void output(){
System.out.println("mather");
}
}
class son{
class Father_son extends Father{
}
class Mother_son extends Mother{
}
public void father(){
(new Father_son()).output();
}
public void mather(){
(new Mother_son()).output();
}
}
- c++继承与java继承的区别
- Spring bean 的继承与Java 中继承的区别
- Spring bean 的继承与Java 继承的区别
- Spring里的Bean继承与Java继承的区别
- 7.8.3: Bean继承与Java继承的区别
- Java 继承与组合的区别
- Java 继承与组合的区别
- java中继承与接口的区别
- [Java] 组合与继承的区别
- Scala继承与Java的区别
- java中组合与继承的区别
- c++与java中继承的区别
- [Java] 组合与继承的区别
- Java:继承与组合的区别
- 继承成员与继承方法的区别
- c++虚继承与继承的区别
- java继承和c++继承的区别
- 继承与category的区别
- sqoop访问MySql被拒绝
- SQL Select语句完整执行顺序
- Leetcode刷题系列(四)Binary Tree相关
- 自定义viewpager,他可以嵌套到大viewPage中使用
- poj 2749
- c++继承与java继承的区别
- Redis基础(2)
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- SQLite语句
- sqoop实现mysql与hdfs数据迁移
- Cmake--aux_source_directory
- 机器学习之K-近邻算法
- 有声读物制作,Mark一下,方便自己
- redis中key相关命令