C++和JAVA两种面向对象语言的比较.doc

上传人:夏** 文档编号:559381587 上传时间:2022-10-21 格式:DOC 页数:17 大小:70KB
返回 下载 相关 举报
C++和JAVA两种面向对象语言的比较.doc_第1页
第1页 / 共17页
C++和JAVA两种面向对象语言的比较.doc_第2页
第2页 / 共17页
C++和JAVA两种面向对象语言的比较.doc_第3页
第3页 / 共17页
C++和JAVA两种面向对象语言的比较.doc_第4页
第4页 / 共17页
C++和JAVA两种面向对象语言的比较.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《C++和JAVA两种面向对象语言的比较.doc》由会员分享,可在线阅读,更多相关《C++和JAVA两种面向对象语言的比较.doc(17页珍藏版)》请在金锄头文库上搜索。

1、两种面向对象语言的比较,C+和Java1概述面向对象编程的基本思想是把软件(尤其是大型软件)看成是一个由对象所组成的社会。对象拥有足够的智能,能够理解从其它对象接收到的信息,并且以适当的行为对此做出反应;对象能够从上一层对象继承属性和行为,并允许下一层对象从自己继承属性和行为等。拥有相同属性,展示相同行为对象被分为一组,我们就得到了一个类。实际中,我们首先定义一个类,然后通过对类进行实例化来创建这个类的若干对象。目前,C+和Java 是两种被广泛使用的面向对象程序设计语言。C+是从C 语言发展而来的。贝尔实验室的Dennis Ritchie 于1972 年在一台DEC PDP-11上实现了C

2、语言。最初,C 语言是作为UNIX 系统的开发语言而被人们广泛了解。在过去的20 年中,大多数计算机上都实现了对C 语言的支持。作为C 语言的扩展,C+是贝尔实验室的Bjarne Stroustrup 于20 世纪80 年代开发出来的。C+提供了大量完善的C 语言的特性,但更重要的是它提供了面向对象的编程功能。今天,基本上所有的操作系统都是用C 或C+编写的。Java 是由美国Sun Microsystems 公司开发的一种能在Internet 上具有“硬件/软件独立性”和交互能力的新型面向对象的程序设计语言。Java 不同于Pascal 这样的个人开发的语言,也不同于一个小组为了自己的使用目

3、的而开发出来的C 或C+,它纯粹是为了商业目的而开发。Java 的一个突出的特性是它的平台无关性,Java 程序可以一次编写而到处使用。值得指出的是,C+与Java 这两种面向对象语言具有许多的相似之处,将这两种语言放在一起比较是一件有趣的事。然而,将它们的所有特征都拿出来相比是十分困难的。限于篇幅,本文主要就基本语言特征、面向对象机制及相关方面对它们做一个比较。2. 基本语言特征2.1 字符集、标识符字符集是指允许出现在一个语言的程序里的字符的全体。C+采用7 位的ASCII 字符集。我们知道,ASCII 码把每个字符与一个二进制代码相关联,它的范围是0000000 至1111111 之间,

4、也就是十进制的0 至127 之间。与C+不同的是,Java 采用的是16 位的Unicode 字符集,包含65536 个字符。其中,前127 个字符与7 位的ASCII 字符集相同。其它的字符可用于注释、标识符、字符和字符串字面量。当然,用于标识符可能并不好。与C+相比,Java 采用了更大的Unicode 字符集。这样做的优点是明显的,一个大的字符集其表达能力会很强。例如,字符的16 位表示形式允许Java 标识符包括世界上许多不同地理区域的字母和数字。另一方面,这样也会带来一些问题。比如说,标识符的处理效率低,可读性差等等。标识符是指用作语言里的关键字以及程序对象的命名的字符序列。对于C+

5、和Java,标识符中的字符必需是字母、数字或者下划线。需要说明的是,这两种语言的标识符都是大小写区别对待的。例如,apple 和AppLE 和APPLE 是3 个不同的标识符。对于标识符的第一个字符,C+和Java 的规定有一点不同。C+要求起始字符必须是字母或下划线,而Java 既允许起始字符是字母或下划线,也允许是美元符号“$”。2.2 基本类型C+和Java 的基本类型包括:布尔类型、字符类型、整数类型、浮点类型。2.2.1 布尔类型C+中的bool,Java 中的boolean 为布尔类型。一个布尔类型的值只可以是true 或false 二者之一。布尔值用来表示逻辑运算的结果。在C+中

6、,整数和指针都可以隐式地转换为布尔值:非零整数或非空指针转换为true,0 或空指针转换为false。布尔值也可以隐式地转为整数:true 转为1,false 转为0。然而,Java 既不允许将一个布尔类型的数据转为其他类型的数据,也不允许将其它类型的数据转为布尔类型的数据。2.2.2 字符类型C+允许我们使用三种不同的字符类型:char、unsigned char 和signed char。一个字符类型的变量占用一个字节的存储,它可以容纳256 个值之一。每个字符常量都对应一个整数值。对于unsigned char,其十进制值的范围是-128 至127;对于signed char,其范围则是

7、0 至255。然而,对于普通的char,其十进制值的范围到底是-128 至127 还是0 至255 呢?这取决于具体的编译器。不管在哪种情况下,差异只出现在那些超出127 的值,而最常用的字符都在127 之内。在Java 中,基本的字符类型只有一个,那就是char。一个char 变量代表一个16位的Unicode 字符,占用两个字节的存储。Java 的char 变量是无符号的,这表示它相应的整数值的范围是0 至65535。2.2.3 整数类型C+和Java 都支持这三种整数类型:short、int 和long。除此之外,C+还支持无符号整数(unsigned)和有符号整数(signed)类型,

8、Java 还支持一种额外的整数类型byte。在C+中,与char 不同的是,普通的int 总是有符号的,因此有符号整数类型只不过是其对应的普通int 类型的一个同义词罢了。C+提供了这么多个整数类型,是为了支持系统程序设计中的细致选择。C+标准要求一个short 类型的变量占用的空间不小于char 类型,一个int 类型的变量占用的空间不小于short 类型,一个long 类型的变量占用的空间不小于int 类型。但是它并没有准确规定各种类型的整数应分别占用多少个字节,把这些问题留给了实现。具体实现可以选择运行平台上最合适的编码形式,以提高实现效率,得到适应各种新环境的能力和需要。当然,这样做的

9、缺点是会损害程序的可移植性。在这一点上,Java 与C+形成了鲜明的对比。Java 明确规定了一个byte、short、int、long 类型的整数分别占用1、2、4、8 个字节。此外,这四种类型都是有符号的。2.2.4 浮点类型C+和Java 都支持这两种浮点类型:float 和double。此外,C+还支持long double 类型,用于对浮点数的精度进行扩展。在C+中,float、double 和long double 的确切意义是由实现决定的。比如说,一个双精度浮点数到底占几个字节可能因编译器而异。反之,Java 浮点数的格式由IEEE 754 严格定义。该标准明确规定一个float

10、 类型的变量占4 个字节,一个double 类型的变量占8 个字节。通过比较可以看出,无论对于是整数类型还是浮点类型,C+标准都没有规定其确切意义,而Java 则把一切都规定清楚了。Java 做出这样严格的规定,优点是有利于程序在不同平台之间的移植,这于Java 的平台无关性需求是相一致的。当然,这样做也会带来一定的缺点,那就是某些机器上可能难以有效实现这些类型。2.3 声明、定义、初始化、作用域2.3.1 声明是否定义无论是在C+还是Java 中,我们在使用一个标识符之前必须对它进行声明。在某些情况下,一个声明同时也是一个定义,然而声明和定义并不等同。在声明中,除非我们为一个标识符分配了足量

11、的内存,否则这个标识符便没有被定义。一个声明是否同时也是一个定义?这个问题在C+和Java 中的答案并不相同。在C+中,绝大多数的声明同时也是定义,不管变量是全局的、局部的还是一个类的对象的数据成员。但是,也有一些C+声明不是定义,这里有几个例子:extern int num;变量的extern 存储类型能够使几个不同的源文件共享同一个变量。上面的extern 声明通知编译器num 是一个int 变量,但不必为这个变量分配内存;class Student;这条声明是Student 类的不完整定义。编译器将期望在别的地方看到一个完整的定义。int f(double);这个声明是一个函数原型。它表

12、示f 是一个函数,接收一个double 类型的参数并返回一个int类型的值。编译器将在其它地方寻找它的定义。在Java中,一个变量声明是否同时也是定义取决于这个标识符是一个方法的局部变量还是一个类的数据成员(注意在Java 中不允许有全局变量)。下面这一声明:int num;如果位于一个方法内部,那么它就不是一个定义。这个声明不会为num 分配任何内存。这一点与C+是不同的。如果希望在声明一个局部变量时同时对它进行定义,就必须给它一个初始值,如下所示。int num = 0;反之,如果一个变量是一个Java类对象的数据成员,那么它的声明也同时是它的定义。2.3.2 是否默认初始化假如我们定义了

13、一个变量,但没有为这个变量提供初始值,那么编译器会不会给这个变量提供一个初始值?同样地,这个问题的答案在C+和Java 中也是不相同的。在C+中,对于基本类型的变量,有下述两种情形:(1)对于全局变量,用全0的二进制序列进行默认初始化。例如,数值变量被初始化为0,指针变量被初始化为空指针。(2)对于局部变量,不提供默认初始化。这样做是为了保证执行效率。缺点在于,如果未赋值就使用这些变量,后果是无法预料的。对于一个类类型的对象,如果这个类有一个无参构造函数,那么不管该对象是全局的还是局部的,它都会根据这个无参构造函数进行默认的初始化。如果这个类没有提供无参构造函数,我们又要考虑两种不同的情况:(

14、1)如果这个类没有提供任何构造函数,那么系统会为这个类提供一个默认的无参构造函数。然而,这个无参构造函数到底做什么,这是因编译器而异的。有可能只进行内存分配而不进行初始化。(2)如果这个类提供了其它的构造函数,只是没有一个无参的构造函数,那么无参构造函数就不存在。如果我们对某对象只进行定义而不进行显式的初始化,就会导致一个编译错误。在Java 中,一个基本规则是,当一个变量被定义时(而不是只声明),它总是被默认的初始化为适当的“0”。例如,boolean 被初始化为false,double 被初始化为0.0,对象引用被初始化为空引用null。Java 要求在每个变量使用前,都必须给它“定义性”

15、赋值(初始化)。即在到达变量的每个使用点的每条控制路径上,必须出现对这个变量的赋值这种规定是为了防止出现使用未初始化的变量的值的情况。这个规定是静态的要求,是充分条件,可能并不必要。2.3.3 作用域标识符与被定义对象之间的约束由定义建立,在续存期间固定不变。这一约束在源程序里的作用范围(在该范围里,这个名字指称这个对象)称为这一约束的作用域。作用域单位是指一种语言所规定的可以作为作用域的结构。C+常见的作用域单位有:全局的外部作用域、子程序定义的局部作用域(不允许局部嵌套定义的子程序)、子程序里任意嵌套的复合语句(块)作用域、类定义形成的作用域、方法的作用域嵌套在类作用域里、名字空间(nam

16、espace)定义的模块作用域。Java 常见的作用域单位有:全局作用域(只能定义类)、类定义形成的作用域、方法作用域嵌套在类作用域里、包(package)形成的模块作用域。关于作用域,Java 与C+有两点明显的不同之处。一是Java 的全局作用域里只能定义类,不能定义全局变量或是全局子程序。此外,Java 中如果一个标识符已经在一个外层代码块中进行了声明,那么它不允许在内层代码块中重新声明。例如,下列代码段在Java 中是非法的,而在C+中没有问题。int i = 1;int i = 2;/.i.2.4 表达式我们主要讨论一下运算对象的计算顺序以及表达式的副作用。在这两个方面,C+与Java有着明显的差异。2.4.1 运算对象的计算顺序运算对象的计算顺序是一个有趣的问题。例如,对于表达式(a -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号