一谈到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可进行自动垃圾清除。