语言特征
Java编程语言风格十分接近C、C++语言。Java是一个纯粹面向对象的程序设计语言,它继承了C++语言面向对象技术核心。Java舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据内存空间,使得程序员不用再为内存管理而担忧。在Java1.5版本中,Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java不同于一般的编译执行计算机语言和解释执行计算机语言。首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译,到处执行”跨平台特性。不过,每次执行编译后字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序运行效率。
编辑Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本(Notepad)、EditPlus等程序,在Linux平台上可使用VI工具等。
主要特性
语言简单
Java语言的语法与C语言和C++语言很接近,使得大多程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用、很难理解、令人迷惑的那些特性,如操作符重载、多继承、自动强制类型转换。特别地Java语言不使用指针,而是引用。并提供了自动的废料收集,使程序员不必为内存管理而担忧。
语言面向对象
Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间单继承,但支持接口之间多继承,并支持类与接口之间实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯面向对象程序设计语言。
语言分不式
Java语言支持Internet应用开发,基本Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程类库,包括Socket、URL、URLConnection、ServerSocket等。JavaRMI(远程方法激活)机制也是开发分布式应用重要手段。
语言健壮
Java强类型机制、异常处理、垃圾自动收集等是Java程序健壮性的重要保证。对指针丢弃是Java明智选择。Java安全检查机制使Java更具健壮性。
语言安全
Java通常被用在网络环境中,为此Java提供了一个安全机制以防恶意代码攻击。除了Java语言具有许多安全特性以外,Java对通过网络下载类具有一个安全防范机制(类ClassLoader),如分配不同名字空间以防替代本地同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
语言体系结构中立
Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
语言可移植
这种可移植性来源于体系结构中立性,另外Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现,Java运行环境是用ANSI C实现。
语言解释型
如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
高性能
与那些解释型的高级脚本语言相比,Java的确是高性能。事实上,Java运行速度随着JIT(Just-In-Time)编译器技术发展越来越接近于C++。
语言多线程
Java语言中,线程是一种特殊对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)构造子将一个实现了Runnable接口对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程活动由一组方法来控制。Java语言支持多个线程同时执行,并提供多线程之间同步机制(关键字为synchronized)。
语言动态
Java语言设计目标之一是适应于动态变化环境。Java程序需要类能够动态地被载入到运行环境,也可通过网络来载入所需要的。这也有利于软件升级。另外,Java类有一个运行时刻表示,能进行运行时刻的类型检查。
Java语言优良特性使Java应用具有无比健壮性和可靠性, 这也减少了应用系统维护费用。Java对对象技术全面支持和Java平台内嵌的API能缩短应用系统开发时间并降低成本。Java编译一次,到处可运行的特性使它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
差异
熟悉C语言和C++语言读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成份,甚至将Java看成是类C语言发展和衍生的产物。如Java语言变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完全相同。尽管如此,Java和C语言,C++语言又有许多差别,如下几个方面:
1、Java中对内存分配是动态的,它采用面向对象机制,采用运算符new为每个对象分配内存空间,而且实际内存还会随程序运行情况而改变。程序运行中Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使系统资源得到更充分地利用。按照这种机制,程序员不必关注内存管理问题,使Java程序编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过malloc和free这两个库函数来分别实现分配内存和释放内存空间,C++语言则通过运算符new和delete来分配和释放内存。在C和C++这种机制中,程序员必须非常仔细地处理内存的使用问题。一方面,如果对己释放内存再作释放或对未曾分配内存作释放,都会造成死机;而另一方面,如果对长期不用或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。
2、Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量功能。
3、Java不用goto语句,而是用trycatchfinally异常处理语句来代替goto语句处理出错功能。
4、Java不支持头文件,而C和C++语言中都用头文件来定义类原型,全局变量,库函数等,这种采用头文件结构使系统运行维护相当繁杂。
5、Java不支持宏定义,而是使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义,这不利于程序的可读性。
6、Java对每种数据类型都分配固定长度。如在Java中int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位。这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。
7、类型转换不同。在C和C++中可通过指针进行任意类型转换,常带来不安全性,而在Java中,运行时系统对对象处理要进行类型相容性检查,以防止不安全转换。
8、结构和联合处理。在C和C++中,结构和联合所有成员均为公有,这就带来了安全性问题,而在Java中根本就不包含结构和联合,所有内容都封装在类里面。
9、Java不再使用指针。指针是C和C++中最灵活,也最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性。而Java对指针进行完全地控制,程序员不能直接进行任何指针操作。
10、避免平台依赖。Java语言编写类库可以在其它平台Java应用程序中使用,而不像C++语言必须依赖于Windows平台。