Java这门编程语言因为具有跨平台的特性,而且安全性、并发性较好,于是在企业级开发领域几乎已经占领了全部的市场,但也会市场有人提出这样的疑问:Java还有那些地方是不能取代C++的?可以说,大部分领域,Java已经取代了C++,不仅是Java,其他语言例如C#,至少在Windows平台已经将C++取代。其实C++可以理解为是C的扩展语言,因为C是面向过程的,而C++和很多当前的热门语言一样是面向对象的。
上文中已经提到过,无论是Java还是C++都是面向对象的编程语言,同样写一个“hello world”程序,可以看到两者的语法结构几乎没有什么太大的区别。面向对象的程序设计思想在这两种语言当中也有充分的体现。有人曾经提到过,Java本身就是在C++的基础上衍生出来的语言,只是在某些方面对C++进行了改进。但是C++和Java之间依然存在一些明显的不同。其实Java从总体上而言是非常优秀的编程语言,在很大程度上方便了开发者,但在某些开发的需求上,C++所具有的特点还是让很多开发者放不下。
要说Java在哪些地方不及C++,那么首先就体现在其运行速度上:Java需要在虚拟机上解释运行,在运行效率上要比C和C++低很多。当然,Java的编译器也在不断地改进,从而达到实时编译的效果,在一定程度上加快了Java的运行速度。尚学堂·百战程序员提示,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,因为如果没有这些编译器,Java的运行速度回大受限制。虽然两者有语法结构上的相似,但与C++相比,Java数组采用的结构是不同的。有一个只读的length成员,通过它可知道数组有多大。而且一旦超过数组边界,运行期检查会自动丢弃一个异常。所有数组都是在内存“堆”里创建的,我们可将一个数组分配给另一个(只是简单地复制数组句柄)。在Java中数组具有标示,属于一级对象,其相应的方法对其他的对象也是适用的。
当对那些不属于主类型的对象,均可以通过new命令创建。与C++不同的是,Java不需要在堆栈上创建不属于主类型的对象。Java可以不使用new命令在堆和栈上创建主题类型,其主要的类也都封装,所以能够通过new创建等价的、以内存“堆”为基础的对象。Java没有预处理机。如果需要使用另一个库里的类,可以用import命令,指定好相应的库名即可。在Java中,包取代了命名空间。Java采用了封装的机制,可以将很多的内容都置于一个类,可针对类名对命名空间分解的操作,所以节省了对命名的操作。数据包也会在单独一个库名下收集库的组件。通过“import”导入包,其余操作由编译器自动完成。
与Java相比,C++还有哪些优势?笔者认为在当前并没有太大的优势。除了以上的不同之外,步入C++没有像Java那样的GC回收机制,在C++中指针的概念在Java中已经变成了引用,优化了对内存的管理。