C++与Java语言及其开发工具(一)

2014-11-23 22:22:07 · 作者: · 浏览: 2

一谈到Java,人们马上会想起一种类似于C和C++的、适用于分布环境的面向对象编程语言,想到这种语言的简单、稳定、安全、与体系结构无关、可移植、可解释、高性能、多线索和动态性等特征。这些都是Java作为一种程序设计语言的主要特征。但是,如果希望更好地理解Java语言,最好的方法是把这种语言与其同类型的语言相比较。既然Java类似于C++ ,把它同C++进行一番比较则是顺理成章的事情。

一、Java语言

Java是由Sun公司的一个技术小组研制出来的。在实现Java语言的过程中,小组的技术人员很快就意识到:C++无法成为一种完全面向对象的、网络化的开发语言。C++是通过给原先的C语言增加面向对象功能而开发出来的,因此,它存在着先天不足。这主要体现在C++种类繁多,功能大量冗余,同时又没有任何一种C++编译器能够支持它的全部功能。鉴于这种情况,Sun公司的技术人员决定不扩充C++,而开发一种全新的计算机语言(Java的前身Oak)。但是,C++已经成了大多数编程人员所熟练掌握的语言,Java的设计显然不能无视这个现实。如果Java和C++之间的差别
过大,那么程序员们在学会这种语言的过程中无疑要花费大量的时间和精力。因此,Java保留了尽可能多的C++风格。

Java是完全面向对象的,这和C++不尽相同。尽管C++被认为是一种面向对象的语言,但它仍然支持过程式程序设计风格。Java则不然,它要求程序员采用完全面向对象的编程技术 ,从而消除了由于混用两种相同的编程风格而导致的种种问题。另一方面,Java的"外观"和 "感觉"和C++又有着很多相似之处。Java消除了C和C++中的冗余以及所有过程式的编程风格 ,并且不再支持指针数据类型,同时增加了数组的自动边界检查和自动内存垃圾搜集,并且把数组封装到类结构内,从而有助于开发分布计算环境下的应用程序。

不过,Java之所以能够成为一种理想的编程语言,最重要的原因还在于其"内嵌"的内存管理和多线索功能。C++语言支持程序员编写一些非常低级的程序,从而能够访问机器硬件 ,并操纵实际内存地址。但这些是以牺牲可移植性为代价的,因为这时每个程序都是针对某种具体硬件环境的。而Java却是通过提供各种边界检查和内存管理来确保代码的可移植性 ,同时,还提供了内嵌的多线索功能,使类似于内存垃圾搜集一类的操作可以在后台进行,从而保证了较高的执行效率。

Java语言能够具有这些优点,主要是因为它是作为一种全新的语言而设计的。如果仅仅是扩充C++,Java将无法避免C++中遗留的大量过程式特性,其解释器的规模将急剧增长,从而降低了系统的总体性能,代码的可移植性和稳定性的实现即使是可能的,也将非常困难。总之,Java的这些特性,为其成为下一代编程语言奠定了良好的基础。

1.Java 的面向对象特征

面向对象技术的关键在于封装、继承和动态联编,下面就谈谈Java是如何支持这些关键特性的。

面向对象技术的基本单位是对象,对象在Java中称为类(Class)。一个类实际上就是一段用于实现对象行为的代码,它是提供封装性的根本所在。也就是说,对象及其相关的所有操作均被封装到一个类中。

所有的对象都有一个状态。类也有状态,以"实例变量"表示。实例变量由相应的类进行控制,除某些特殊情况外其它任何类都无法访问这些变量。实例变量通过方法(method)进行访问。方法相当于过程式语言中的函数,它是一个可多次调用的代码段。程序员必须通过调用方法来实现对类的控制,即改变类的状态,而且只能实现类的方法所允许的操作。这就是面向对象技术的工作原理。

当然,在个别情况下(对某些面向对象的语言而言),编程人员也可以直接访问实例变量 ,但这并不是一个值得推荐的做法,因为它违背了面向对象的初衷。

面向对象编程的优点主要在于代码的可重用性。当需要进行某些重复性操作时,编程人员不必反复地重写相同的代码段,而只需创建对象的多个实例即可。因为编程人员既不需要了解对象是如何创建的,也不用知道对象内部的工作机理,需要知道的只是对象方法的调用机制,其余的工作将由对象所属的类进行处理。在Java中,程序员可以编写完成各种功能的类,发布编译之后的代码,并且只需要告诉用户如何控制这些类即可。

Java通过类来实现对象,并且提供了类的多种用法。类可以作为各对象实例的一个模板。为创建类的新实例,可以调用其构造函数,它是每当创建类的一份新的拷贝时都必须调用的一个特殊方法。当一个类的所有程序都已经结束运行,或者Java觉得不再需要调用该类时 (比方说应用程序已经结束),必须调用这个类的终结函数(finalize),以进行一些必要的清除工作。当然,Java的终结函数和C++中的析构函数会有所差别,因为Java可进行自动垃圾清除。


在Java中,对变量和方法的访问控制是通过访问修饰符来实现的。Java定义了4种
访问级别:公共(public)、受保护(protected)、私有(private)和友好(friendly)。
公共类型的方法及变量可从任意类进行访问;受保护类型的方法及变量只能从当前
类及其子类访问;私有类型的方法及变量则只能从当前类访问。如果未给出这三种
类型中任意一种的显式说明 ,表明相应的方法或变量属于"友好"类型,从而可由属
于同一"包"(package)内的所有类进行访问。在Java内,"包"是一个单独的编译单
位,它是具有某种共性的类所组成的集合。通过定义包这个单位,可实现相关对象
之间的相互访问,同时把这些对象与包之外的其它对象隔离。


面向对象的编程机制是Java的一个极为重要的方面。在Java内,如果不创建新类,
就无法创建应用程序。Java定义了一个特殊的超类Object,用户创建的类都是Object
的子类。J ava程序既可在解释器内也可在浏览器内运行,但无论采用哪种方式,都
必须先创建一个类实例,然后才能提交运行。此外,利用继承机制,用户还可充分利
用各种超类提供的功能。

2. 与C++的差别

尽管C++程序员可以相对容易地掌握Java编程,但他们仍然必须克服从C++带来的一
些旧习惯。Java取消了C++中的如下特性或功能:

结构或指针 #define语句

指针 多重继承

独立的函数 GOTO语句

操作符重载 自动类型转换

Java不支持结构和指针,而且取消了C++中的#define或#typedef语句和头文件。

事实上,constant和typedef这两条语句包含了#define语句的作用。现在,结构和
联合已经被Java的类所代替。删除这些特性的原因是:由于其希望维持与C语言
向后兼容性,C ++的语言规范包含了大量冗余。比如,类实际上就已经包括了结构
和联合的作用,因此这两种数据结构完全可以取消。关于#define语句,Java语言规
范的制订者认为:尽管该语句的出发点是为了增强程序的可读性,但实际效果却恰
恰相反,它常常导致难读的代码,故应该予以取消。Java不再支持独立函数,因此任
何函数都必须封装到某个类中。由于人们普遍认为, C++所用的超类是非常不稳定
的,因此Java抛弃了C++中的多继承并代之以接口。Java的接口指的是,在别的类看
来一个类所能实现的方法。它所显示的只是一个类的方法或常量和变量 ,而不是
这个类的全部结构。

最后,Jav