1.1 Java简介

Java由于其与生俱来的诸多优点,目前已经在各行各业得到了广泛应用。到处都在讨论Java,但是Java究竟是什么呢?概括说来,它和一般编程语言的不同之处在于:Java不仅是一种面向对象的高级编程语言,它还是一个平台(Platform);使用Java更易于开发出高效、安全、稳定以及跨平台的应用程序。目前Java还处于快速发展阶段,新的特性和应用仍在不断涌现。本节对Java的发展历史以及特点进行简要介绍。

1.1.1 发展简史

随着Java技术的飞速发展,越来越多的人加入到学习Java编程语言的热潮中。虽然现在Java无处不在,但是其发展历史并不是很长。20世纪90年代初,Sun公司为了适应消费类家电项目的需求而设计了一种小型的计算机语言,要求占用内存小、适应多种处理芯片。为此,设计人员设计出了一种面向对象的“可移植”的语言。在执行前,生成一个“中间代码”,在任何一种机器上只要安装了特定的解释器,就可以运行这个“中间代码”。这样的“中间代码”非常小,解释器也不大,这就是Java的雏形。遗憾的是,当时这门语言并未被Sun公司和消费类家电公司所接受。Sun公司一度也曾探求Java在其他方面的应用,却均以失败告终。

1995年,随着Internet网络的兴起,人们迫切需要一个好的浏览器以方便阅读网上的Web页面,Sun公司为此使用Java语言及时开发出了一个浏览器——HotJava,并获得了极大的成功。HotJava中首次引入了传程序的思想,即HotJava可以将服务器上的程序(Applet,称为小应用程序)下载到浏览器中执行,这就为原本只能静态显示的页面增添了活力。HotJava在1995年SunWorld大会上的出现引发了世界范围内的Java热,至今未衰。

早期版本Java 1.0其实并不适合应用程序的开发,它甚至不支持打印功能。直到1998年Java 1.2版本的出现,Java才从真正意义上成为现代开发工具中的利器。

Java现在的体系结构已经变得相当庞大,从大的框架上可以分为三大块:JavaSE(Java Platform Standard Edition,以前叫J2SE)、JavaEE(Java Platform Enterprise Edition,以前叫J2EE)和JavaME(Java Platform Micro Edition,以前叫J2ME)。JavaEE主要用于开发服务端应用程序;JavaME则应用于嵌入式设备,如移动电话;JavaSE是标准的开发工具包,其中包含了基本Java的核心应用编程接口(Application Programming Interface, API)。实际上JavaEE和JavaME中都可能使用到JavaSE中的API。本书将重点放在JavaSE上,主要帮助读者掌握必要的Java基础知识以及一定的项目开发经验。此外要说明的是,本书主要关注如何使用Java开发应用程序,小应用程序(Applet)的内容未被更多涉及。

就JavaSE来讲,也已经提供了大量的API供开发者直接使用,其中的类和接口大约有3000多个,提供的方法和变量更是数以万计,这些内容如果全部由本书来讲解,显然是不合适的。为此,本书中将重点讲解那些基础的且必须掌握的部分,未曾涉及的内容希望读者在日后的实际开发过程中,通过查阅Java API文档逐步掌握。

1.1.2 Java的特点

学过C/C++语言的读者都知道,编写完C/C++源代码后需要编译成机器码才能在机器上运行,因此C/C++是编译型的语言。还有一些语言完全是解释型的(如Basic),不需要任何编译工作,是边解释边执行的。与这些语言不同的是,Java既是编译型的又是解释型的。我们在编写完Java源代码后,首先需要将其编译为一种中间状态的字节码(bytecode),然后再由Java虚拟机(Java VM)上的解释器来解释执行。实际上我们可以将字节码看作是虚拟机的机器码。这样,任何一个系统,只要上面具备了Java虚拟机,那么它总是可以运行编译好的字节码。正是这种将源代码编译到中间字节码的机制,使得Java能够实现“一次编程,到处运行”的目标。

Java的特点可以概括为:简单、面向对象、分布式、解释型语言、健壮性、安全性、结构中立、可移植性、高性能、多线程和动态。

这里我们选择性地讲几个初学者感兴趣的特点。更多具体内容可参考甲骨文公司关于Java的白皮书(http://www.oracle.com/technetwork/cn/java/javase/documentation/whitepapersjsp-139357-zhs.html)。

1. 简单

对于有过C++编程经验的读者来说,学习Java语言不会存在太多困难。因为Java语法要比C++的语法简单得多。Java剔除了C++中那些复杂而且不常使用的语法特性,例如操作符重载、多重继承等。熟悉C++的读者在学习Java时,很多时候需要做的就是设法“忘记”C++中的一些语法规则。

但是对于没有编程经验的读者来说,将会发现学习Java还是具有相当难度的。一方面Java有一些奇怪的语法(如匿名内部类),另一方面需要自己编写大量的代码(习惯“拖”控件编程的读者就不适应了)。这也是为什么本书后面建议初学者使用文本编辑工具自己手工编写代码的原因。通过这种方式,读者可以尽快熟悉Java语法并强化记忆。

2. 面向对象

面向对象是现代编程语言的重要特性之一。历史的经验已经表明,面向对象技术极大地提高了人们的软件开发能力。现在很难想象还使用纯粹的面向过程的语言去开发大型、复杂的项目。Java语言是一种纯粹的面向对象的语言,在面向对象一些问题的处理上要优于C++(如多重继承)。习惯于传统面向过程的读者在刚理解面向对象的概念时,会存在一定的困难。但是考虑到面向对象的优越性,在这方面花点精力是值得的。

3. 健壮性

每个程序设计人员都希望自己编写的程序更加可靠。在编写程序时,考虑周到一点固然能降低出错的可能性,但是如果语言本身就能提供一系列的机制防患于未然,必能进一步提高程序的健壮性。Java语言的设计目标之一,就是帮助程序员编写出高可靠性的程序,为此,Java语言提供了很多技术用以提高程序的可靠性,如数组越界检查、运行时类型检查、取消指针操作以及无用单元自动回收等。

学过C/C++的读者都知道,指针具有强大的功能和较好的灵活性。也正是这个原因,指针成为程序不稳定的最大隐患之一。由于C/C++存在指针运算(如p++、p为指针),指针可以在内存中自由移动,因而可能修改其他程序所使用的内存或是系统内存中的内容,从而造成系统的崩溃。而有些语言,例如Basic,没有显式的指针,这又会使得在实现某些功能(如实现自己定制的数据结构)时变得困难。Java语言同时考虑到这两方面的问题,提出了一个很好的解决方法:可以有指针,但是取消了指针的运算。这样上面的两个问题便迎刃而解了。

注意:Java中并不是没有指针了,Java中的引用其实就是指针,只是取消了指针运算。取消指针运算就防止了内存泄漏的可能性。

4. 可移植性

Java作为一种高级编程语言,最让人津津乐道的优点就是所谓的跨平台特性了,也就是在不同的操作系统上源代码不做修改就能得到相同的运行结果。

先来看一下为什么会存在可移植性的问题。我们都知道,同一数据类型在不同平台上的大小是不一样的。例如有的平台上整型(int)用16位二进制数来表示,而有的平台上却是用32位二进制数来表示。这样一个在用32位二进制数来表示整数的平台上开发的程序拿到用16位二进制数表示整数的平台上去运行,很可能就会产生溢出问题。Java中使用固定大小的数据类型解决了这个问题,例如整型始终用32位来表示,而底层平台的转换由Java虚拟机来完成。

可移植性问题不仅仅存在于数据类型大小不一致,其他方面如图形界面的显示、多线程等都存在可移植性问题。确实,Java在可移植性上已经取得了极大的成功,但还不够完善。然而,这并不能掩盖Java在这方面所做的贡献以及其他诸多优点。

5. 多线程

具有多线程处理能力可以使得应用程序能够具有更好的交互性、实时性。Java在多线程处理方面性能超群,同时也非常简单。有过C++多线程编程经验的读者,一定会对Java的多线程编程之简单感到惊叹。Java中多线程的实现是由操作系统或是线程库来完成的,编程人员在不同平台上使用多线程的Java代码是完全相同的。正是由于Java中使用多线程的简单性,使得它成为服务器端应用程序开发的利器。

从另一个角度来讲,Java不仅仅是一种编程语言,它还是一个平台(Platform)。所谓平台,是指应用程序运行的软硬件环境,通常是操作系统和硬件的总称。例如Windows 10、Linux、Solaris等都是不同的平台。Java平台是运行在这些平台之上的纯粹的软平台,由两大部分组成:Java虚拟机和Java应用程序接口(Java API)。图1.1显示了Java平台,从图中可以看出,Java应用程序是和底层的操作系统(基于硬件的平台)相隔离的,它们之间是通过Java平台来进行通信的。

图1.1 Java平台

在这里,我们要给大家提一下本地代码(native code),所谓本地代码,是指已经编译好的、可以在特定硬件平台上直接运行的代码,如已经编译好的C代码。因此,运行Java程序要比本地代码慢一点。然而在现代的网络时代,程序运行速度的瓶颈主要在于网络的速度;另一方面,已经出现了很多技术(JIT等),用以提高Java程序的运行速度,所以在编写大部分应用程序时,这一点是不用担心的。