C++ 和 Java 对类继承的差异
2023-09-11 14:19:20 时间
#include <iostream> using namespace std; class Base { public: int i; Base() { i = 9999; fun(); } virtual void fun() { cout<<"Base.fun()"<<endl; } }; class Derived : public Base { public: int i; Derived() { i = -1; } virtual void fun() { cout<<"Derived.fun()"<<endl; } }; int main(int argc, char *argv[]) { Base *b = new Derived(); cout<<(b->i)<<endl; b->fun(); }
java 代码:
class Base { int i = 9999; public void fun() { System.out.println("Base.fun()"); } Base() { fun(); } } class Derived extends Base { int i = -1; Derived(){} public void fun() { System.out.println("Derived.fun()"); } } public class dev { public static void main(String argv[]) { Base b = new Derived(); System.out.println(b.i); b.fun(); } }
差异体现在第一行输出;
这行是在Derived的构造函数中输出的,Derived本身没有构造函数,它只调用父类的构造函数,即Base的Base(), 并执行其中的 fun() 函数;
对于C++代码,执行的是Base::fun();
对于Java代码,执行的是Derived::fun();
为什么呢,在C++中调用基类的fun时,此时子类还没有准备好,故执行的是基类的fun。
分析:区别原因在于编译器,及其运行原理
C++ 代码 经过编译后 Base构造函数中的代码为静态,其中调用的其他函数地址也已经在编译时 就已经确定, 故执行的是 Base::fun() 。(除了虚函数是动态联编其他的都是静态代码)
Java 代码,为动态联编, 各个函数在编译时已经形成虚拟机机器指令代码, 但是具体的函数调用却是动态的, 因为是派生类调用父类的构造函数,所以这里的 fun() 函数被认为是 派生类 derived 中的。
相关文章
- 【JAVA】JSP操作数据库简单实例和mysql-connector-java-5.0.3-bin.jar项目配置方法
- 设计模式java——访问者模式
- Java - CentOS下JDK的安装教程(及JAVA_HOME配置、以jdk1.8为例)
- Java面试集合(七)
- 使用c++filt命令还原C++编译后的函数名
- Java自定义一个字典类(Dictionary)
- java.lang.OutOfMemoryError: Java heap space
- 【华为OD机试真题 java、python、c++、jsNode】查找充电设备组合(100%通过+复盘思路)
- 【华为OD机试真题 java、python、c++】荒地电站建设【2022 Q4 100分】(100%通过+复盘思路)
- Java使用RabbitMQ之订阅分发(Topic)
- 『Java练习生的自我修养』java-se进阶⁵ • 常用IO流
- 《青花瓷》JAVA版:周杰伦告诉你怎么学Java
- java nb
- Java 割圆术球π
- How to improve Java's I/O performance( 提升 java i/o 性能)
- java.lang.OutOfMemoryError: Java heap space错误及处理办法(收集整理、转)
- 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果