renjc

 java与c++的区别

提起java就不得不提起jvm,jvm是java得以实现“一次编写,到处运行”的基础,也是java相比c++简单的一大重要原因(GC)这里就有几点不同:

跨平台:

  在c++中64位系统下是可以运行32位程序的,但是反过来的话是比较麻烦的。因为32位指针大小为4 byte,而64位的指针大小为8 byte,虽然说本质原因是因为32位系统和64位系统的指针寻址范围本身就不同。(size_t大法好)

  java就不一样了,jvm到处都能安,能安就能跑java,虚拟机自己帮忙解决一堆问题,应用极其广泛。

GC:

  成长在jvm自动GC的环境下的java程序员难以想象c++程序员对内存的疯狂程度,即使是智能指针的应用也难以磨灭。java对象全部创建在堆上,由jvm负责空间的回收与管理,总的来说是尽可能的分配,不够了就回头去找空间可以回收的,用户完全不用考虑空间回收的问题。c++的对象可以创建在堆上也可以创建在栈上,不加new直创建就是在栈上的,栈快但是空间有限。用new会创建在堆上,C++每一个分配在堆上的空间都必须手动释放,不然可能会出现内存泄漏等问题。

 

就语言构成来说,java一直被戏称c++--,在c++中删除了不少特性,比如:

头文件:

#include <math.h> => import java.lang.Math;

  在c++中,最终的可执行代码不包含任何符号信息,因此在使用时(调用库)需要一个文件来描述代码使用规则,这就是头文件。

  而java库的jar包里面的内容可以直接读取,一个 .class 本身兼具了“目标代码”和“接口定义”的双重功能,所以不再需要一个单独的头文件。(虽然包含类的完整信息,但是对于开发者“不可读”,因此还需要以文档的方式提供类的声明。)

指针:

  java中不需要程序员对指针进行操作。不过这不代表java没有指针,事实上java的指针操作都被底层代码封装了,避免了大量代码错误(c++经典Segmentation fault)。

结构体:

  这个到没什么好说的,毕竟c++中struct能实现的class也能实现,就是默认权限不同而已,算精简语法吧。(不过没了不使用typedef配合struct来写结构体而是用class来写总感觉怪怪的)

运算符重载:

  c++各种重载总能写出特别魔幻的代码,同时也是bug之源,java不整这么花里胡哨的。

union:

  在c++中union主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。可以看得出来c++对内存利用的精细程度,字节级的空间分配,java开发就不用考虑这么细了。

多重继承:

  多重继承可以调用多个基类的不同方法,使代码更加灵活,同时也变得复杂,而且可能出现菱形继承的风险。c++一般使用::设定作用域的方式来解决多重继承中的函数二义性问题。java不支持多重继承但可以用接口实现,因为接口中的方法,是抽象的,就算一个类实现了多个接口,且这些接口中存在某个同名方法,但是我们要清楚的知道,这个同名方法最终需要由这个类自己来实现,所以并不会出现二义性的问题。

宏:

  java使用final实现类似功能,虽然不像c++中直接字符替换这么快且应用丰富,但也安全多了。

默认函数参数:

  默认函数参数会影响多态的实现(但可以通过重载实现),c++ 支持默认函数参数,但同时很多编码规范也禁止在虚方法中使用默认参数。

流:

  java的Stream对象(除了PrintStream)功能较单一,只能按字节读写,需要Reader或者Writer的辅助。C++的任何流都可以按字节、字符串、整形的方式读或者写。另外,Java是少数几种不能用"=="比较字符串的语言((ΩДΩ)???)。

 

另外,Java为纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类(第一次见到封装类的概念都要吐了好吧)。此外,Java语言中不存在全局变量或全局函数,而C++兼具面向对象和面向过程变成的特点,可以定义全局变量和全局函数。就应用方面,java重点面向网络,c++总的来说还是面向性能。

从根本上来说,Java为解释性语言,程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C/C++慢(即使JIT的引入的确让Java速度有了数量级的提高)。

相关文章: