浅析JAVA与C++的区别

时间:2022-09-09 04:03:02

摘要:c++支持类的多继承,java采用类的单继承;C++中引入构造函数的同时也引入了析构函数,而java却没有析构函数,它自动进行无用内存回收操作,不需要程序员进行删除,而c十十中必须由程序释放内存资源。本文将从一些常见的技术角度入手,对这两种程序设计语言进行阐述。

关键词:继承;多继承;构造函数;OOP;类封装;

中图分类号:O244 文献标识码:A文章编号:1007-9599 (2010) 01-0000-02

一、概述

OOP关键特性

面向对象程序设计(OOP)并不是一种新的程序设计技术。它最早可以上溯到Simula-67,虽然它的第一个真正完整的实现是Simula-80。如今OOP已经非常流行,并且出现了许多支持OOP的语言,比如C++,Objective-C(另一种C语言扩展),CLOS,Eiffel,Ada以及最近的Java。

OOP的关键特性如下:

•类,在类中封装了表现和操作的抽象数据类型。在OOP语言中,类是模块、封装和数据抽象的基础。

•继承,从已存在的类型中继承元素,改变或扩展旧类型的方法。

•多态性,它允许使用类似的方法操作不同类型的对象。它使得类的可用性进一步提高,程序也因此更容易维护和扩展。

二、区别

(一)数据类型

无论是哪一种语言,数据类型都是比较重要的,而在Java和c++中也是如此。C++有许多种基本类型,还有struct,union,enum,数组和指针,C++指针可以指向对象,也可以不指向对象,在java程序中的变量只有两种,一种是基本数据类型(boolean,char,byte,short,int,long,float,double),另一种是对对象的引用,没有枚举、联合类型,将可有可无的语言元素去掉是Java对C/C++做出的一大改变,因此,普遍认为Java较C++更轻便,更精简。

Java采用Unicode字符集,C++通常用ASCII字符集。Java中的boolean类型不能转换成其他类型,反之亦然。C++最近引进了bool类型,代表布尔类型,整型也可作为逻辑判断,Java中包括了一个字符串的对象,并且是个常量。字符串不像字符数组一样,虽然可以简单的从一个字符数组构造一个字符串。

(二)构造函数

在C++以及Java中,构造函数和类具有相同的名字。如果没有定义构造函数,编译器会自动为类添加一个默认构造函数。在这两种语言中,类可以具有多个构造函数,这就是所谓的“方法重载”。

在Java中,虽然构造函数也被称为初始化函数,但与C++的构造函数在使用上没有什么区别。需要注意的是,Java虚拟机负责创建对象,而构造函数只对创建的对象进行初始化。

C++的析构函数在对象超出作用域时,或者删除动态创建对象时自动被调用。每个类只能由一个析构函数。而Java没有析构函数,没有引用的对象将被碎片回收程序在后台销毁。在销毁对象之前,碎片回收程序调用finalize()方法。但是,并没有什么保证这个函数真正被调用。因此,如果需要释放资源,就要定义一个方法,并保证它被调用。

(三)类封装

这两种语言提供了相同的三种访问限定符来提供不同级别的类封装:public,protected和private。public意味着对于任何类都是可见的,protected意味着对于派生类可见,private意味着没有外部可见性。但是两种语言的实现细节并不相同。

在C++中,可以使用friend关键字跳出类封装。由class关键字声明的类默认可见性是private,由struct关键字声明的类默认可见性是public;在Java中,一个语法上的区别是每一个类成员都要用访问限定符声明,另一个实质上的区别是Java中类成员默认访问限定符是friendly,因此对同一个包中的所有类都是可见的。同样,protected关键字表示类成员对派生类可见,同时也对同一个包中的其它类可见,而private protected才对应于C++中的protected。

(四)自动内存管理

Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:

Read r=new Read();

r.work();

语句Readr=newRead();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c十十中必须由程序释放内存资源,增加了程序设计者的负担。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。

在垃圾回收的语言中,运行时环境一直监测哪些内存不被使用。当一块内存不用的时候,系统自动的回收内存。比如说,一个对象在一个方法中生成,但是没有被调用着返回或者没有储存为全局变量,不能在方法外部使用。系统自己会知道哪些变量是用不到的,哪些是可以用到的。因此,不必再为破坏对象回收内存而担心。在C++中,很多的调试时间都被使用到检查内存漏洞中。Java的这种方法很大程度上降低了这种错误的可能。但是依然不能处理逻辑混乱的程序,它们不能够被回收。许多C++的类中的析构函数是用来释放对象引用的内存的。Java使垃圾回收的事实说明在Java中不是必需写析构函数了。但是并不意味着可以不为类写析构函数。比如,一个对象打开了网络连接就必须被恰当的清理来关闭这个连接。在Java中,析构函数被称作"finalization"方法。

(五)异常

异常是Java的重要特性,JAVA中的异常机制用于捕获例外事件,增强系统容错能力。异常处理构想的出发点是简化程序的错误处理代码,提供标准内建机制,从而使程序更加健壮。异常处理的内容很多,这里只是简述一些关键的要素和区别。

C++使用throw关键字来产生一个异常,用try关键字标志被保护的程序块,用catch关键字标志异常处理程序代码。异常是一些特殊类的对象,在这三种语言中都构成了各自的继承链。C++会对所有栈中的对象进行栈展开和销毁。

Java使用和C++相同的关键字,但是其行为却更接近于Object Pascal,包括使用finally关键字。所有采用对象引用模型的语言基本都是如此。碎片回收程序的存在限制了finally关键字对类的应用,这些类占用了内存资源。Java认为所有能产生异常的函数都具有一个正确的异常子句,这个子句告诉Java哪些异常可能会被产生。这个假设十分严格,并由编译器进行检查。这是一个非常有用的技术,即使这意味着程序员要做更多的工作。Java中的异常类必须派生自Throwable类。

在C++中,异常和异常处理是十分深奥的事情,许多C++程序员从没有处理过它们甚至不知道它们是何物。异常是在正常的过程中出现的未预料的错误,因此,它们不会从方法中返回,或者作为参数传入;但是,它们不能被忽略。

在Java中,异常已经成为语言中非常成熟的部分。方法的说明中就包含了异常的信息,程序处理器也强制检验如果使用了一个能够产生异常的方法,就必须检查异常是否发生。几乎所有的Java程序员都会遇到异常的情况,因为许多非常有用的库中的类都会抛出异常。

(六)运行

Java在虚拟机上运行,首先编译形成class文件(字节码),然后再由虚拟机来解释执行;Java源代码被编译成字节码(.class文件),字节码是一种只有JVM才能识别的二进制低级代码,它与具体的处理器无关,要由安装在OS之上的JVM解释执行,转换成相应平台的机器码,因此Java是体系结构中立和跨平台的;C++首先编译成目标文件obj,然后再链接(link)变成可执行文件.exe,C++直接被编译成底层平台的二进制机器码,由CPU执行,是与平台相关的。

三、结束语

对于C++程序设计语言和JAVA程序设计语言中的不同之处,还有很多,在此就不一一列举了。弄清楚它们之间的区别,对于初学者来说是一件很重要的事情。虽然在本文中尽力做到只比较语言的语法语义特性,但在适当的环境中考察它们是很重要的。这些语言为不同的目标开发出来,是为了以不同的途径解决不同的问题的,并在不同的开发环境中被应用。虽然语言和它们的开发环境体现了彼此的一些特性,但它们是为了满足不同的需要而建立的,就像我们在对比这些特性时看到的那样。C++的目标是强大的功能和控制能力,代价是复杂性提高;Java的目标是兼容性和分布式应用,为此不惜牺牲一些运行速度。程序员们喜欢用最新的程序设计语言,并希望第一个掌握它。因此可以说“Java并不是最新的OOP语言”,在未来的几年里,一些人会开发出更新的语言!

参考文献:

[1]孟威主编.C++程序设计教程第3版,机械工业出版社

[2]朱红主编.C++程序设计教程(21世纪高等计算机教育实用规划教材),清华大学出版社

[3]孙淑霞主编.C/C++程序设计教程,电子工业出版社

[4]张克军主编.Java程序设计教程,人民邮电出版社

[5]郎波主编.Java语言程序设计,清华大学出版社

上一篇:高斯带通滤波器的设计及其在管道超声检测中的... 下一篇:审批系统中工作日管理的设计与实现