C++ 和 Java 对类继承的差异
#include <iostream>
using namespace std; class Base
{
public:
int i; Base()
{
i = ;
fun();
} virtual void fun()
{
cout<<"Base.fun()"<<endl;
} }; class Derived : public Base
{
public:
int i; Derived() {
i = -;
} 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 中的。
C++ 和 Java 对类继承的差异的更多相关文章
- java一个类 继承HttpServlet 和实现Servlet区别
java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...
- Java的类继承
知识点1.继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足is a的逻辑关系,才能使用继承.如:苹果 is a水果语法:使用extends 连接子类 ...
- java的类继承(与c++对比)
1. interface的引入 使用interface来定义某一类通用操作,而又不强制规定其实现,对于Java的流行真是太重要了. 以JDBC举例.在Java之前,C++与数据库建立连接,常用的一个技 ...
- 【JAVA】类继承对父类静态变量的操作
对静态变量的操作存在继承时还是有一些模糊,做了个简单的测试: class Test { private String mName; public Test(String name) { setName ...
- java基础 类 & 继承
类 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在 ...
- Java: 类继承中 super关键字
super 关键字的作用有两个: 1)在子类中调用超类的构造器,完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现, 2)在子类中调用超类的方法,如: ...
- (转)Java:类与继承
原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...
- Java:类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
随机推荐
- go 语言字典遍历
package main import "fmt" func main() { var countryCapitalMap map[string]string /*创建集合 */ ...
- Java 面向对象之接口、多态
01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...
- Spring AMQP 源码分析 08 - XML 配置
### 准备 ## 目标 通过 XML 配置文件使用 Spring AMQP ## 前置知识 <Spring AMQP 源码分析 07 - MessageListenerAdapter> ...
- windows7 桌面突然卡住了,点击右键点不了,点击桌面软件点不了,怎么办?
关闭并重启explorer.exe进程命令操作 :1. cmd 2. taskkill /f /im explorer.exe && start explorer.exe
- Codeforces 916B - Jamie and Binary Sequence (changed after round)
思路: 先取出二进制的每一位,判断总个数是不是小于等于k,如果大于k则不能构成. 通过观察可以发现,每一位的一个可以转换成下一位的两个,因为要使最大位尽可能小,所以如果最大位的所有的个数都可以转换成下 ...
- Linux上安装Oracle的教程-centos7
一.安装Oracle前准备 1.创建运行oracle数据库的系统用户和用户组 [humf@localhost ~]$ su root #切换到root Password: [root@lo ...
- yii 第一步
第一步:index.php // include Yii bootstrap filerequire_once(dirname(__FILE__).'/../../framework/yii.php' ...
- initctl 创建自己的JOB
我们的项目需要一个启动一个外部的Jetty server.发现每次kill了这个jetty的进程后,系统会自动启动一个jetty.追查下去发现,原来是在/etc/init.d/jetty 脚本的sta ...
- WPF中为窗体设置背景图片
在WPF应用程式中,我们往往想为一个窗体设置一个中意的背景图,而不是单独的为这个Background设置成某种颜色或渐变颜色的背景. 在WPF 利用Expression Blend工具如何达到这种效果 ...
- LeetCode--110--平衡二叉树
问题描述: 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,n ...