类的概念
- Java中的所有函数都属于某个类的方法,故main方法必须有一个外壳类,且必须是静态的。类似C++中的静态成员函数,这些函数定义在类的内部,并且不对对象进行操作。
- C++中不需要将所有函数封装在类中。
数据类型
Java
- Java中的整型范围与运行Java代码的机器无关,解决了软件从一个平台移植到另一个平台,或者同一平台的不同操作系统之间进行移植带来的问题;
- Java没有无符号数;
- 整型值和布尔值之间不能进行互相转换;
C++
- C和C++需要针对不同的处理器选择最为高效的整型,防止在不同处理器上使用同一程序产生整数溢出的问题。
- C++中包含有符号数和无符号数;
- C++中数值甚至指针可以替代布尔值;
变量与常量
Java
- Java中,不区分变量的声明与定义;
- Java中,用final指示常量,const为Java保留的关键字,但目前不使用;
C++
C++中区分变量的声明与定义:
- 声明:告诉编译器“该变量或函数可以在文件中被找到”;
- 定义:告诉编译器“在这里创建变量或函数,并分配内存空间”;12int i = 0; //定义extern int i; //声明
C++中使用const指示常量;
字符串
Java字符串不可修改,而是利用substring与替换字符串进行拼接,相比于C++,Java字符串类似于char*指针,当采用另一个字符串替换时,Java代码的在C++下的大致过程如下:
Java将原始字符串放置在堆中,Java将自动进行垃圾回收,避免内存遗漏。在Java中,==运算符检测两个字符串是否放在同一位置上。只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。
C++string对象也自动进行内存的分配和回收,内存管理器通过构造器、赋值操作和析构函数显式执行,然而C++字符串可以修改。在C++string中,==运算符比较两个字符串是否相等。
控制流程
Java的控制流程和C与C++的控制流程结构一样。但是Java中不允许在嵌套的块中重定义一个变量,而C++允许这种重定义使内层定义的变量覆盖外层定义的变量。
数组
Java数组与C++数组在堆栈上很大不同,但是基本上与分配在堆(heap)上的数组指针一样。下面两种情况相同:
引用
在Java中,对象变量可以设为null,表明这个对象变量目前没有引用任何对象;在C++中没有空引用,并且引用不能被赋值。可以将Java的对象变量看做C++的对象指针。
所有Java对象都存储在堆中,Java中没有C++的错误指针或内存溢出问题,若使用一个未初始化的指针,运行系统将产生运行时错误;同时垃圾收集器将处理内存管理问题。
##类
类的定义方法
在Java中,所有方法都必须在类的内部定义,但并不表示是内联方法,是否将某个方法设置为内联方法是Java虚拟机的任务,即时编译器会监视调用那些简洁、经常被调用、没有被重载以及可优化的方法。
C++中,通常在类的外面定义方法,在类的内部定义方法,则该方法自动成为内联方法。
构造器
在Java中,可以在类的定义中,直接将一个值赋给任何域;在C++中,不能直接初始化类的实例域,所有域必须在构造器中设置,可利用初始化列表进行设置。
在Java中,如果构造器的第一个语句形如this(…),这个构造器将调用同一类的另一个构造器;在C++中,一个构造器不能调用另一个构造器,必须将抽取出的公共初始化代码编写成一个独立的方法。
析构器
在C++中有显式的析构器方法,当对象不再使用时执行清理代码,回收分配给对象的存储空间;在Java中有自动的垃圾回收器,不需要人工回收内存,故Java不支持析构器,但可以为类添加finalize方法,在垃圾回收器清楚对象之前调用。
类的导入
在C++中,由于编译器除了正在编译的文件以及在头文件中明确包含的文件,无法查看任何文件的内部,因此必须使用#include将外部特性的声明加载进来。Java编译器可以查看其他文件的内部,只要给出位置指示。
C++的namespace和using指令和Java的package与import语句类似。
继承
Java用关键字extends代替C++中的冒号,在Java中,所有的继承都是公有继承,而没有C++中的私有继承和保护继承。在Java中使用关键字super调用超类的方法,而在C++中采用超类名加上::操作符的形式。
在Java中,不需要将方法声明为虚拟方法,动态绑定是默认的处理方法。如果不希望让一个方法具有虚拟特征,可以将它标记为final。
类型转换
在Java中需要将instanceof运算符和类型转换组合起来使用;在C++中,可以在dynamic_cast操作中完成类型测试和转换。