c++改Java代码的体悟

对于匿名对象的使用
c++的匿名对象创建非常简单,只需要类名+参数就可以,但Java则需要严格按照new的方式,去new一个匿名对象创建。

set(Data(1,1,1))//c++
set(new Data(1,1,1))//java

final和const关键字
final和const在修饰变量时用法基本相同,都表示不可修改的。但是两者在修饰方法时却有很大差别。c++中const修饰一个方法的含义是方法中的量不可以被修改,而Java中final修饰一个方法则是使一个方法在继承时不可被修改。

sizeof方法
c++中可以使用sizeof()来获取一个数据类型(包括类和结构体)的数据大小,c++中一个很经典的获取数组长度的方法就是sizeof(数组)/sizeof(数据)
而java中由于JVM的特性,所有基本数据类型的长度都是确定的,因此所有长度都是确定的,所以Java中没有sizeof方法,求数组长度只需要使用length属性即可。

继承时的重写和隐藏
继承时对于Java和c++共同的点就是数据的隐藏,在继承时,子类和父类的同名数据是分开存放的,子类对象中也可以调用父类的同名数据成员,这是数据的隐藏。但在方法上Java和c++就是不同的机制。c++的函数同样也是隐藏,也就是子类中可以调用父类的同名方法,但Java就是方法的覆盖,子类的同名方法会覆盖父类方法,也就是父类同名方法无法被调用。

虚函数和抽象方法
C++中的有虚函数的概念,用virtual 关键字来表示。每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可 能是父类型),指针当前指向的是哪种类型的对象,就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。
C++的函数多态就是通过虚函数来实现的。C++中,如果函数不是虚函数,则调用某个函数,是根据当前指针类型来判断的,并不是根据指针所指向对象的类型。所以虚函数可以实现动态绑定,析构函数一般会是虚函数。
java中没有虚函数的概念,但是有抽象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类,那么该子类不需要实现其父类的抽象函数。
这样来看,Java的抽象函数和c++中的虚函数并不对应,而应该和c++的纯虚函数对应,两者有很多相似之处,而c++中的虚基类,则和java中接口更加相像。

传参默认参数
我们知道c++是可以允许默认参数的存在,但是Java并不允许。c++中的默认参数使用起来非常方便,但Java也有自己独特的机制来实现,那就是函数的重载,通过函数的重载实现多种参数情况下的多态,再通过重载的函数之间互相的调用来简化代码,实现类似默认参数的功能。

模板类
在代码翻译过程中很大的问题就是模板类,Java提供了类似于c++的模板类机制,但是很重要的一点就是Java的泛型问题。Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。

如在代码中定义List和List等类型,在编译后都会变成List,JVM看到的只是List,而由泛型附加的类型信息对JVM是看不到的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型与C++模板机制实现方式之间的重要区别。
而Java本身提供了一个泛型数组arraylist,用这个来操作泛型就会更加方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章