Java 的特点,
分享于 点击 18031 次 点评:218
Java 的特点,
Java的特点 Sun公司在“Java白皮书”中对Java的定义是:“Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture-neutral, portable, high-performance, multi-threaded, and dynamic language.”。按照这个定义,Java是一种具有“简单、面向对象的、分布式、解释型、健壮、安全、与体系结构无关、可移植、高性能、多线程和动态执行”等特性的语言。下面我们简要叙述Java的这些特性。 1. 简单性 Java语言简单而高效,基本Java系统(编译器和解释器)所占空间不到250 KB。当然,这与Java的起源有很大关系。前已述及,Java最初是为了对家用电器进行集成控制而设计的一种语言,因此它必须具有简单明了的特性。 我们注意到,Gosling等人在设计Java之初,是从改写C++编译器入手的,这就使Java具有类似于C++的风格,保留了C++语言的优点;摈弃了C++中不安全且容易引发程序错误的指针;消除了C++中可能给软件开发、实现和维护带来麻烦的地方,包括其冗余、二义性和存在安全隐患之处,如操作符重载、多重继承和数据类型自动转换等;简化了内存管理和文件管理——Java提供了C++中不具备的自动内存垃圾回收机制,从而减轻了编程人员进行内存管理的负担,有助于减少软件错误。从这些方面看,Java是C++的简化和改进,因而C++程序员可以很快掌握Java编程技术。 Java的简单性是以增加运行时系统的复杂性为代价的。以内存管理为例,自动内存垃圾处理减轻了面向对象编程的负担,但Java运行时系统却必须内嵌一个内存管理模块。但无论如何,对编程人员而言,Java的简单性只会是一个优点,它可以使我们的学习曲线更趋合理化,加快我们的开发进度,减少程序出错的可能性。 2. 面向对象 Java语言是纯面向对象的,它不像C++那样既支持面向对象的技术,又支持面向过程的程序设计技术。这里只从一个侧面说明面向对象的编程语言与面向过程的编程语言之间的区别。 传统面向过程的编程语言把程序概括为 程序=数据结构+算法 而面向对象的编程语言可把程序概括为 程序=对象+消息 在面向对象的技术中,把现实世界中的任何实体,都可以看作是对象。对象其实就是现实世界模型的一个自然延伸。现实世界中的对象均具有属性和行为,映射到计算机程序上,属性用数据表示,行为用程序代码实现。可见,对象实际上就是数据和算法(程序代码)的封装体,它用一个自主式框架把代码和数据联编在一起,形成一个对象。面向对象的程序设计技术较传统的面向过程的程序设计技术更能真实地模拟现实世界。 3.可移植性(平台无关性) 程序的可移植性指的是程序不经修改而在不同硬件或软件平台上运行的特性。可移植性在一定程度上决定了程序的可应用性。可移植性分为两个层次:源代码级可移植性和二进制代码级可移植性。C和C++只具有一定程度的源代码级可移植性,其源程序要想在不同平台上运行,必须重新编译。而Java不仅源代码级是可移植的,甚至源代码经过编译之后形成的二进制代码——字节码,也同样是可移植的。 Java采用了多种机制来保证可移植性,其中最主要的有两条: 第一,Java既是编译型又是解释型的。Java程序的最终执行需经过两个步骤:编译和解释。Java将源程序编译成字节码——二进制代码,这种字节码通过Java解释器来解释执行。任何一台机器,只要配备了Java解释器,就可以运行Java字节码,而不管这种字节码是在何种平台上生成的。因此,Java编程人员在进行软件开发时,不必考虑软件的运行平台。此外,Java通过预先把源程序编译成字节码,避免了传统解释型语言的执行效率低的性能瓶颈。 由Java源程序编译生成的字节码不是直接在操作系统平台上运行,而是在一个称为Java虚拟机(JVM)的平台上运行。利用JVM把Java字节码跟具体的软硬件平台分隔开,就能保证在任何机器上编译的Java字节码文件都能在该机上运行。 第二,Java采用的是基于国际标准——IEEE标准的数据类型。Java的数据类型在任何机器上都是一致的,它不支持特定于具体的硬件环境的数据类型,它还规定同一种数据类型在所有实现中必须占据相同的空间大小(C++的数据类型在不同的硬件环境或操作系统下占据的内存空间是不同的)。通过在数据类型的空间大小方面采用统一标准,Java成功地保证了其程序的平台独立性。 此外,Java的可移植性还体现在Java的运行环境上。Java编译器是用Java语言本身编写的,而其他编程语言运行的环境则是用ANSI C编写的,Java的整个运行环境体现了一个定义良好的可移植性接口。Java语言规范还遵循POSIX标准,这也是使Java具有良好可移植性的重要原因。 4.稳定性和安全性 网络分布式计算环境要求软件具有高度的稳定性和安全性。C++程序在安全性和稳定性方面的最大问题在于其指针的使用,不进行数组下标越界检查,缺乏自动的内存管理等。使用指针的一个危险是它能够访问任意内存空间,如果病毒利用指针进入操作系统的内存空间,并在其中执行特权指令,它就能随心所欲地进行破坏。为此,Java首先摒弃了指针数据类型,这样,程序员便不再能够凭借指针在任意内存空间中“遨游”;其次,Java提供了数组下标越界检查机制,从而使网络“黑客”们无法构造出类似C和C++语言所支持的那种指针;第三,Java提供了自动内存管理机制,它可以利用系统的空闲时间来执行诸如必要的垃圾清除等操作。此外,Java的运行环境还提供了下述的安全保障机制: ● 字节码校验器(Byte Code Verifier)。当Java字节码进入解释器时,首先必须经过字节码校验器的检查。即使Java编译器生成的是完全正确的字节码,解释器也必须再次对其进行检查。因为在从Java程序的编译直到解释执行这段时间内,字节码可能被有意无意地改动过。 ● 运行时内存布局和类装载器(Class Loader)。Java解释器将决定程序中类的内存布局,这意味着“黑客”们将无法预先得知一个类的内存布局结构,从而也就无法利用该信息来“刺探”或破坏系统。随后,类装载器负责把来自网络的类装载到其单独的内存区域,避免应用程序之间的相互干扰或破坏。 ● 文件访问限制。客户机一端管理员还可以限制网络上装载的类只能访问某些允许的文件系统。 上述机制综合在一起,使得Java成了最安全的编程语言和环境之一,并且保证了Java代码无法成为类似特洛伊木马、病毒和蠕虫等具有潜在破坏作用的东西。 5. 高性能 一般情况下,可移植性、稳定性和安全性几乎总是以牺牲性能为代价的,解释型语言的执行效率一般也要低于直接执行源码的速度。但Java所采用的措施却很好地弥补了这些性能差距。这些措施包括: ● 高效的字节码。Java字节码格式的设计充分考虑了性能因素,其字节码的格式非常简单,这使得经由Java解释器解释执行后可产生高效的机器码。Java编译器生成的字节码和机器码的执行效率相差无几。据统计,Java字节码的执行效率非常接近于由C和C++生成的机器码的执行效率。 ● 多线程。线程是现代操作系统提出的一个新概念,是比传统的进程更小的一种可并发执行的执行单位。线程的概念提高了程序执行的并发度,从而可提高系统效率。C和C++采用的是单线程的体系结构,均未提供对线程的语言级支持。与此相反,Java却提供了完全意义的多线程支持。 Java的多线程支持体现在两个方面:首先,Java环境本身就是多线程的,它可以利用系统的空闲时间来执行诸如必要的垃圾清除和一般性的系统维护等操作;其次,Java还提供了对多线程的语言级支持,利用Java的多线程编程接口,编程人员可以很方便地编写出支持多线程的应用程序,提高程序的执行效率。必须注意的是,Java的多线程支持在一定程度上可能会受其运行时支撑平台的限制,并且依赖于其他一些与平台相关的特性。比方说,如果操作系统本身不支持多线程,Java的多线程就可能只是“受限”的或不完全的多线程。 ● 及时编译和嵌入C代码。Java的运行环境还提供了另外两种可选的性能提高措施:及时编译和嵌入C代码。及时编译是指在运行时把字节码编译成机器码,这意味着代码仍然是可移植的,但在开始时会有一个编译字节码的延迟过程。嵌入C代码在运行速度方面效果当然是最理想的,但会给编程人员带来额外的负担,同时将降低代码的可移植性。 6.动态特性 在面向对象的程序设计中,经常会用到各种类库,很多时候还需要一些从第三方厂商处购买的类库。销售应用程序时,类库有时是单独出售的。对于C++应用程序,这就会导致一个问题:类库一旦升级,用这些类库编写的应用程序就必须重新编译,并且重新发送到用户手中,否则就无法利用升级后类库的新增功能。Java采用“滞后联编”机制避免了这个问题。Java程序的基本组成单元为类,这些类是在运行过程中动态装载的。因此,Java可以在分布式环境中动态地维护应用程序及其支持类库之间的一致性。这样,对于Java而言,其支持类库升级之后,相应的应用程序不必重新编译,也一样可以利用升级后类库的新增功能。“滞后联编”机制使得Java完全利用了面向对象编程模式的优点,使Java程序能够适应不断变化的执行环境。此外,Java的动态性还体现在对动态数据类型和动态协议的支持上。利用一种特殊的Applet,即内容句柄,编程人员可很方便地使HotJava支持新的数据类型。类似地,通过编写协议句柄,可以使HotJava支持新的、自定义的传输协议。 简言之,Java的动态性使用户能够真正拥有“即插即用”(p1ug-and-play)的软件模块功能。 7.分布式 分布的概念包括数据分布和操作分布两个方面。数据分布是指数据可以分散存放于网络上不同的主机中,以解决海量数据的存储问题;操作分布则指把计算分散到不同的主机上进行处理,这就如同由许多人协作共同完成一项大而复杂的工作一样。 Java支持WWW客户机/服务器计算模式。对于数据分布,Java提供了一个URL对象,利用此对象我们可以打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。对于操作分布,Java的客户机/服务器模式可以把计算从服务器分散到客户端,从而提高整个系统的执行效率,避免瓶颈制约,增加动态可扩充性。 注:本文的出处一直没找着,希望原版的作者谅解
相关文章
- 暂无相关文章
用户点评