`
isiqi
  • 浏览: 16028313 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java与c,c++的区别

阅读更多

javacc++的区别:Java=C++-“复杂性和奇异性”+“安全性和可移植性”

1.全局变量

java中不能在所有类之外定义全局变量,只能通过在一个类中定义公共、静态的变量来实现一个全局变量。

java对全局变量进行了更好的封装,而在cc++中,依赖于不加封装的全局变量,常常造成系统的崩溃。

2.指针

cc++中的指针最灵活,但也是最容易产生错误的数据类型,由指针所进行的内存地址操作常常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个c++中的私有成员,从而破坏了安全性,造成系统的崩溃。而java对指针进行了完全控制,java没有显式的指针类型,所有引用的对象(包括变量赋值、传递参数给方法以及数组元素)都是通过使用隐式引用,而不是通过指针来完成的。

java中,引用还使用户容易创建诸如链接表之类的结构,而不需要显式指针,仅用指向下一个和前一个结点的变量创建一个链表结构,然后,在表中插入项目,把这些变量赋给其他结点对象。

3.数组

java中,数组是第一个特殊的类对象,而引用数组和它们的内容是通过显式引用而不是使用指针运算来完成的。数组的边界是要求严格检查的,一旦越界,将会产生编译或运行错误。如同其他对象一样,把数组传递给方法,就会传递原先的引用(地址)给该数组。因而,该数组引用的内容改变,更新原先数组对象。对象数组是引用数组,其初始化时并不包含实际的对象。

java并不像cc++那样支持多维数组,在java中,用户可以创建包含其他数组的数组来支持多维数组。

4.字符串

cc++中,字符串是以一个空字符(\0)结尾的字符数组。为了操作和管理字符串,必须把它们当作其他数组来处理。

java中,字符串是个封装的对象,而在字符串上操作的所有方法可把字符串作为一个完全的对象来处理。字符串即使可以用一个空字符结尾,也不能超越字符串终结的范围(如同数组的情况一样,字符串的边界检查是严格执行的)。

cc++可以通过指针直接对字符串所在的内存地址进行操作,并不对越界情况进行检查,而java只能通过类StringStringBuffer所提供的接口对字符串进行操作,并且还要对越界情况进行检测并报告,大大增加了安全性。由于类StringStringBuffer的接口都经过明确说明,所以我们可以预知java中字符串处理的功能,而在cc++中,只能通过库函数或者自定义函数才能对字符串进行处理。

5.内存管理

c中,程序员是通过库函数malloc()free()来分配和释放内存的。C++则是通过运算符newdelete来分配和释放内存的。如果再次释放已释放过的内存块或未被分配的内存块,会造成系统崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。

java中,所有对象均通过运算符new为它们分配内存空间。通过new获得对象的处理权,而实际分配给对象的内存可能随程序运行而改变,java对此自动地进行管理,而当对象不再使用时,运行时间的垃圾收集器(Garbage CollectorGC)就释放该内存。为了“强迫”释放一个对象,移去该对象的所有引用(指定所有变量和数组元素,保持为空),下次java垃圾收集器运行时,回收该对象。如此,有效地防止由于程序员的误操作而导致的错误,并且更好地利用了系统资源。

6.数据类型

cc++中,对于不同的平台,编译器对基本的数据类型(charintfloat等)分配不同长度的字节数,如intIBM PC中卫16位,在VAX-11中为32位,这导致了代码的不可移植性,而在java中所有的java的基本数据类型具有交叉平台和操作系统的一致长度和行为,总是分配固定长度的位数,如对int总是占32位,这就保证了java的平台无关性。Java没有CC++那样无符号数据类型。布尔类型的值不是一个整数,是具有truefalse两个值,虽然在java中可以强迫转换01到布尔类型,但是不能把它当作1来处理。

java中,组合(或称引用)数据类型(类,接口和数组)仅通过使用类定义来完成,像C++中支持类的structuniontypedef关键字均已去掉。

java中,数据类型之间的强制类型转换有许多控制,只有在不丢失信息时,才发生自动的强制类型转换,所有其他的强制类型转换必须是显式的,基本数据类型(intfloatlongcharboolean等)不能强制转换到对象,反之亦然;方法特殊的“包装”类,可以在对象和基本类型之间转换值。

7.运算符

运算度优先级和结合率作用与C中一样,然而new关键字结合性比点符号(·)高,其表现与c++不同。

java中没有C++中那样的重载运算符,此运算符以被删去,但可以使用“+”运算符来连接字符串。

8.控制流

java中,虽然ifwhilefordo在语法上和cc++一样,差别在于,每个控制流结构的测试表达式,必须返回一个实际的布尔值(truefalse),而在cc++中表达式可以返回一个整数。

java中,不支持CC++中的goto语句,而是通过例外处理(exception handling)语句try catchfinaly等代替cc++中用goto来处理遇到错误时跳转的情况,使程序更可读更结构化。

9.头文件

cc++中,用头文件来声明类的原型以及全局变量,库函数等。在大型系统中,维护这些头文件是很困难的。而java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员进行操作。同时javaimport语句来与其他类进行通信,以便使用它们的方法。

10.参数

Java不像cC++那样支持函数的变长参数表的机制,所有方法的定义必须具有特定的参数个数,此外,在空参数表中不能使用void

java中,命令行参数表现与在cC++中不同。在cc++中,参数的第一个元素(args[0])是程序的名字,在java中,args[0]对应cc++中的args[1],它没有办法获得保存java程序名称。

11.其他差别

(1)java中没有预处理程序,不支持宏和#define,当说明类和实例变量时,通过final关键字来声明一个常量。在cC++中用宏定义来实现的代码给程序的可读性带来了困难。

(2)java没有C++那样的模板类。

(3)java不包含cconst关键字,或者显式地按const引用传递的能力。

(4)java的所有函数必须是方法,而且必须依赖类。

(5)java通过接口(interface)提供单一与间接多重继承。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics