
1.3 Java核心技术体系结构
Java核心技术体系结构如图1-1所示。

图1-1 Java核心技术体系结构
1.3.1 Java核心技术基础部分
学习Java开发的第一步是搭建Java开发环境,包括熟悉Java开发环境的配置和JDK开发工具;之后了解Java的核心特性,包括Java虚拟机、垃圾回收器、Java代码安全检查等;在此基础上掌握Java应用程序开发的基本结构,以及学习如何编辑、编译和运行Java应用程序。
任何程序设计语言,都是由语言规范和一系列开发库组成的。我们需要掌握Java语言的基础语法。首先介绍标识符(Identifier)、关键字(Keyword)、变量和常量这些基本元素,以及Java的数据类型,包括基本类型和引用类型;之后继续介绍Java基础语法:Java运算符、表达式运算(包括运算符的优先次序和数据类型转换)和流程控制(包括顺序流程、分支流程和循环流程)。
数组也是Java语言中的一个重要组成部分。我们需要了解数组的声明、生成和初始化,数组的使用,以及多维数组的基本原理。
在此基础之上,进行Java最重要的面向对象的概念的学习。在这里我们要熟悉面向对象核心语法,包括封装:Java中的类、方法和变量,以及构造方法、方法重载;继承:继承概念和方法重写(覆盖);多态:多态概念和多态实现。
接着介绍面向对象的一些高级特性,包括静态(Static)变量、方法和初始化程序块,最终(Final)类、变量、方法,访问规则(Access Control),抽象类和方法(Abstract Classes and Methods),接口(Interface),基本类型包装器(Wrappers),集合,内部类,以及反射机制等。
了解完面向对象的基础知识后,我们将在此基础上介绍Java核心技术的应用部分或者高级部分,包括图形用户界面(Graphic User Interface)、多线程(Thread)、输入/输出(Input/Output)和网络编程等。
1.3.2 Java核心技术应用部分
1.图形用户界面(Graphic User Interface)
好的应用系统需要做到用户友好(User Friendly),也就是提供好的图形用户界面(Graphic User Interface,GUI)。下面将介绍两项主要的构建图形用户界面的技术:AWT和Swing。
(1)AWT(Abstract Windowing Toolkit)
在JDK的第一个发布版中包含了AWT这个库。AWT的缺省实现使用了“对等”机制,即每一个Java GUI窗口部件都在底层的窗口系统中有一个对应的组件。例如,每一个java.awt.Button对象都将在底层窗口系统中创建一个唯一对应的Button。当用户单击这个按钮时,事件将从本地实现库传送到Java虚拟机里,并且最终传送到与java.awt.Button对象相关联的逻辑中。对等系统的实现,以及Java组件与对等组件之间交流的实现都隐藏在底层JVM实现中,Java语言级的代码仍然跨平台。
尽管如此,为了保持“Write once, run anywhere”的许诺,Java不得不进行折中。特别要说明的是,Java采用了“最小公分母”的方法,即AWT仅提供所有本地窗口系统都提供的特性。这就需要开发人员为更多高级特性开发自己的高级窗口部件,然后提供给不同的用户去使用和体验。
所以,用AWT开发的应用程序既缺少流行GUI程序的许多特性,又不能达到在显示和行为上像用本地窗口构建库开发程序一样的目标。应该有一个更好的库让Java GUI取得成功,Swing就是这样一个方案。
(2)Swing
在1997年JavaOne大会上提出并在1998年5月发布的JFC(Java Foundation Classes)包含了一个新的Java窗口开发包。这个新的GUI组件叫做Swing,它是对AWT的升级,并且看起来对Java的进一步发展有很大帮助。
Swing架构特征如下:
AWT依赖对等架构,用Java代码包装本地窗口部件,Swing却根本不使用本地代码和本地窗口部件。
AWT把绘制屏幕交给本地窗口部件,Swing自己的组件绘制自己。
因为Swing不依赖本地窗口部件,它可以抛弃AWT的“最小公分母”方法,并在每个平台下实现每个窗口部件,从而创建一个比AWT更强大的开发工具包。
Swing在默认情况下采用本地平台的显示外观。然而,它并不局限于此,还可以采用插件式的显示外观。因此,Swing应用程序看起来像Windows应用程序、Motif应用程序、Mac应用程序,甚至它自己的显示外观:“金属”。所以,Swing应用程序可以完全忽略它运行时所在的操作系统环境,并且仅仅看起来像自己。
Swing组件超越了简单的窗口部件,它体现了正不断出现的设计模式以及一些最佳实践。采用Swing,不仅可以得到GUI窗口部件的引用和它所包含的数据,还可以定义一个模型去保存数据,定义一个视图去显示数据,定义一个控制器去响应用户输入。事实上,大部分Swing组件的构建是基于MVC(Model-View-Controller)模式的,MVC使应用程序开发变得更清晰、更易维护和管理。
(3)Java Applet介绍
在Swing基础之上,我们可以开发一种特殊的图形界面程序——Applet。Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以直接嵌入到网页中,并能够产生特殊的效果。当用户访问这样的网页时,Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络浏览器。由于Applet是在用户的计算机上执行的,因此它的执行速度不受网络带宽或者Modem存取速度的限制,用户可以更好地欣赏网页上Applet产生的多媒体效果。在Java Applet中,可以实现图形绘制,字体和颜色控制,动画和声音的插入,人机交互及网络交流等功能。
介绍完GUI开发后,接下来介绍Java的另一项高级核心技术——多线程。
2.多线程(Thread)
在计算机编程中,一个基本的问题就是同时对多个任务加以控制。有时我们要求将问题划分成独立运行的程序片段,使整个程序能更迅速地响应用户的请求。在程序中,这些独立运行的片段叫做“线程”(Thread),利用它编程的概念就叫做“多线程处理”。多线程处理的一个常见的例子就是用户界面。利用线程,用户单击一个按钮,程序就会立即做出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
Java提供的多线程功能使得在一个程序里可同时执行多个小任务。线程(有时也称为小进程)是一个大进程里分出来的小的独立的进程。多线程带来的更大的好处是更好的交互性能和实时控制性能。尽管多线程是强大而灵巧的编程工具,但要用好却不容易。我们必须注意一个问题:共享资源。如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到这个问题。举例来说,两个进程不能将信息同时发送给一台打印机。为了解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以,一个线程可以将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。
Java的多线程机制已内建到语言中,这使一个可能较复杂的问题变得简单起来。对多线程处理的支持是在对象这一级别上支持的,所以一个线程可表达为一个对象。Java也提供了资源锁定方案,它能锁定任何对象占用的内存(内存实际上是多种共享资源的一种),所以同一时间只能有一个线程使用特定的内存空间。为达到这个目的,需要使用synchronized关键字。其他类型的资源必须由程序员明确锁定,这通常要求程序员创建一个对象,用它代表一把锁,所有线程在访问这个资源时都必须检查这把锁。
3.输入/输出(Input/Output)
在项目开发中,文件输入/输出是必不可少的。输入或者输出都是针对内存而言的,从磁盘或者网络载入内存,我们称为输入(I),否则称为输出(O)。对语言设计人员来说,创建好的输入/输出系统是一项困难的任务,Java库的设计者通过创建大量类来攻克这个难题。
Java的核心库java.io提供了全面的IO接口,包括文件读写、标准设备输出等。Java中IO是以流(Stream)为基础进行输入/输出的,所有数据被串行化写入输出流,或者从输入流读入。此外,Java也对块传输提供支持。Java IO模型设计非常优秀,它使用装饰(Decorator)模式,按功能划分Stream,你可以动态装配这些Stream,以便获得需要的功能。例如,需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。Java的IO体系分为Input/Output和Reader/Writer两类,区别在于Reader/Writer在读写文本时能自动转换内码。基本上,所有的I/O类都是配对的,即有xxxInput就有一个对应的xxxOutput。
4.Java网络编程
最后我们介绍Java的网络编程原理。
对网络编程简单的理解就是两台计算机相互通信,网络编程的基本模型就是客户机到服务器(Client/Server)模型。简单地说,就是两个进程之间相互通信,其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并建立两者之间的联系,然后完成数据的通信就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常称为客户端。
在开始学习网络编程之前,简单了解一下网络基础知识,特别是网络传输层协议TCP和UDP。它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议(包括HTTP,SMTP,SNMP,FTP和Telnet)提供网络服务。TCP提供的是面向连接的、可靠的数据流传输,类似于生活中的打电话;而UDP提供的是非面向连接的、不可靠的数据流传输,类似于生活中的收发信。
对于程序员而言,掌握一种编程接口并使用一种编程模型就相对简单多了,Java提供的一些相对简单的应用开发接口(API)可用来完成这些工作。对于Java而言,这些API存在于java.net这个包里面,因此只要导入这个包就可以开始网络编程了。
Java所提供的网络功能大致分为3大类。
URL和URLConnection是3大类功能中最高级的一种。通过URL的网络资源表达方式,很容易确定网络上数据的位置。利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或者把自己的数据传送到网络的另一端。
Socket:所谓Socket,可以想象成两个不同的程序通过网络的通道,这是传统网络程序中最常用的方法。一般在TCP/IP网络协议下的客户/服务器软件采用Socket作为交互的方式。
Datagram是这些功能中最低级的一种。一般在UDP/IP网络协议下的客户/服务器开发中采用这种模式。其他网络数据传送方式,都假设在程序执行时建立一条安全稳定的通道。但是以Datagram方式传送数据时,只是把数据的目的地记录在数据包中,然后就直接放在网络上进行传输,系统不保证数据一定能够安全送到,也不能确定什么时候可以送到。
本书将深入细致地展开对上述核心技术的讲解。我们讲解的方式是Project-driven training,也就是用项目实践来带动理论的学习。因此,我们在下一章会首先介绍一下SuperVCD Store项目。