【知识储备】
1.1 Java语言的发展和特点
1.1.1 Java语言的发展
Java语言诞生于1991年,它是Sun公司(后被Oracle公司收购)为一些消费性电子产品所设计的,目的是开发一个新的语言,可以对电冰箱、电视机、电子游戏机等家用电器进行编程控制,和设备进行信息交流。鉴于这些电子产品有一个共同的特点:计算处理能力和内存都非常有限,因此要求:①该语言必须非常小且能生成非常紧凑的代码,这样才能在上述环境中执行。②由于不同的厂商选择不同的CPU,所以要求该语言不能和特定的体系结构绑在一起,要求语言本身是中立的,也就是跨平台的。因此,James Gosling领导的Green项目小组创建了新的程序设计语言——Oak语言(Java语言的前身),保留了大部分与C++相似的语法,改进了C++中过于复杂或具有危险性的特性。Oak是一种可移植性语言,也就是一种与平台不相关的语言,能够在各种芯片上运行,这样各家厂商就可以降低研发成本,直接把应用程序应用在自家的产品上。
1994年,Oak的技术日趋成熟,Internet正在蓬勃发展。用户迫切希望能够在网络上创建一类无须考虑软、硬件平台就可以执行的应用程序,并且这些程序还要有极大的安全保障,正是由于这种需求给Oak带来了前所未有的施展舞台。1995年5月23日,Oak语言改名为Java(Oak商标已被注册),并且在Sun World大会上正式发布了Java和HotJava浏览器。由于Java只是一种编程语言,如果想要开发复杂的应用程序,需要有一个强大的开发库支持,因此,Sun公司在1996年1月23日发布了JDK 1.0版本。Java语言第一次提出了“Write Once,Run Anywhere”的口号,JDK被发布后立即引起极大的下载量,Java成为网络编程的主流语言之一。Java语言的发展历史如下:
1996年1月,Sun发布了JDK 1.0;
1997年2月,Sun发布了JDK 1.1;
1998年12月,Sun发布了JDK 1.2(Java2平台);
1999年6月,Sun重新定义Java技术架构,并将Java2平台分为3个版本:标准版(J2SE)、企业版(J2EE)和微缩版(J2ME);
2000年5月,Sun分别发布了JDK 1.3和1.4;
2004年9月,JDK 1.5发布,成为Java语言发展史上又一里程碑。为了表示该版本的重要性,JDK 1.5更名为JDK 5;此时,Java的各种版本已经更名,取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME;
2006年12月,Sun公司发布JDK 6.0;
2010年9月,发布JDK 7.0,增加了简单闭包功能;
2014年3月,发布JDK 8.0,增加了Lambda表达式等新特性;
2017年9月,发布JDK 9.0,增加了模块化源代码等新特性。
1.1.2 Java语言的特点
Java语言是一种高级的、通用的、面向对象的程序设计语言。其语法与C或C++类似,但在组织结构上截然不同。它是一种完全面向对象的程序语言,程序的基本处理单位是类。由于当初在设计Java的时候,倾向于把它设计成一种具有生产力的语言,而不仅只是研究性的语言,因此在学习运用Java语言的时候,能很快感受到它的便利与强大功能。Java语言有如下特点。
1.简单的特性
Java语言的语法与C和C++很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换等。Java语言不使用指针,并提供了自动的垃圾收集,使得程序员不必为内存管理而担忧。
2.面向对象的特性
面向对象是Java语言最重要的特性。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制。Java全面支持动态绑定,而C++只对虚函数使用动态绑定。总之,Java是一个纯粹的面向对象程序设计语言。
3.分布式处理的特性
Java支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口,它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java应用程序可通过一个特定的URL来打开并访问对象,就像访问本地文件系统一样简单方便。
4.健壮特性
Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
5.结构中立的特性
Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),只要安装了Java运行时系统,Java程序就可以在任意的处理器上运行。
6.安全特性
Java的安全性可从4个方面得到保证。
1)Java语言自身提供的安全。在Java语言里,指针、释放内存等C++中的功能被删除,避免了非法内存操作。
2)编译器提供的安全。当Java用来创建浏览器时,语言功能和一些浏览器本身提供的功能结合起来,使它更安全。Java代码在机器上执行前,要经过很多次的测试。它需要通过代码校验、检测指针操作、检测是否正改变一个对象的类型等测试。
3)字节码校验。如果字节代码通过代码检验没有返回错误,可以确定代码没有堆栈上溢出和下溢出,所有操作代码参数类型都是正确的,并且没有发生非法数据转换。
4)类装载。类装载通过本机类与网络资源类的名称分开,来保持安全性,通过分配不同的命名空间以防替代本地的同名类,以避免特洛伊木马病毒的出现。
7.可移植的特性
这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,解释器是用标准C实现的。
8.解释的特性
Java编译器将Java源文件生成类文件,扩展名为.class,类文件可通过java命令加载、解释、执行,将Java代码转换为机器可执行代码。Java解释器能直接运行目标代码指令。
9.高性能的特性
与那些解释型的高级脚本语言相比,Java是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
10.多线程的特性
Java语言内置支持多线程功能,使得在一个程序里可同时执行多个小任务。多线程带来的更大的好处是更好的交互性能和实时控制性能。
11.动态的特性
Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。
1.1.3 Java与C++的比较
Java提供了一个功能强大语言的所有功能,并且几乎没有一点含混特征。C++安全性不高,但C和C++有着大量的用户,因此Java设计成与C++相似的形式,让大家容易学习。Java去掉了C++语言的许多功能,让Java语言很精炼,并增加了一些很有用的功能,因此Java和C++之间存在着一些显著的差异。事实上,这些差异正是技术进步的表现,因此读者需要特别关注这些差异。Java和C++之间的差异可见表1-1。
表1-1 Java语言与C++语言的比较
1.1.4 Java程序的工作机制
Java语言的核心设计理念是跨平台和安全性,为此,Java发展了Java虚拟机、Java字节码和垃圾回收机制三大核心技术。
图1-1 Java程序运行过程
1.Java虚拟机
前文已经提到过,平台无关性是Java最重要的特性,而实现这一特性的基础就是Java虚拟机(Java Virtual Machine,JVM)。从底层看,Java虚拟机是以Java字节码为指令组的软CPU。图1-1显示了Java程序运行过程。从图中可以看出,在服务器端,首先由开发人员编写Java源程序并存储为.java文件;其次,Java编译器将.java文件编译成字节码并保存为.class文件;最后将.class文件存放在Web服务器上。在客户端,用户访问服务器端的主页,下载Java程序,再依赖本地Java虚拟机对.class文件解释执行。
Java虚拟机包含类加载器、字节码校验器和JIT实时编译器。类加载器用来取得从网络获取的或存于本地机器上的类文件字节码。下一步由字节码校验器检查这些类文件是否有正确的格式,以确认在运行时不会有破坏内存的行为。Java解释器将字节码解释翻译成机器码,而JIT编译器也可将字节码转为本地机器码,但它可使原本是解释执行方式的虚拟机提高到编译式的运行效率。
2.Java字节码
Java源程序通过Java编译器编译后的产品是字节码文件(.class),与机器码不同,它不是真实CPU可执行的机器代码,故又称伪代码。字节码文件需要由JVM在执行期间编译成能被本地机器识别的机器码,然后再交给操作系统执行(见图1-1)。因此,Java的跨平台性不仅是源代码级的跨平台,而且可执行文件也是跨平台的,只要目标操作系统安装了JVM,就可以执行任意的字节码文件,从而实现“Write Once,Run Anywhere”(一次编写,到处运行)。
3.垃圾回收机制
Java语言一个显著的特点就是引入了自动垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存空间的释放问题,这一切工作由Java的自动垃圾回收机制完成。垃圾回收可以有效地防止内存泄露,有效地使用空闲的内存。所谓内存泄露是指该内存空间使用完毕后未回收,即内存中某个对象的生命周期超出了程序需要它的时间长度。