
1.4 Java核心技术体系
Java核心技术体系结构包括两部分:Java核心技术基础部分和Java核心技术应用部分,如图1-2所示。
1.4.1 Java核心技术基础部分
学习Java开发的第一步是搭建Java开发环境,包括熟悉Java开发环境的配置和JDK开发工具;然后了解Java的核心特性,包括Java虚拟机、垃圾回收器、Java代码安全检查等;在此基础上掌握Java应用程序开发的基本结构,以及学习如何编辑、编译和运行Java应用程序。

图1-2 Java核心技术体系结构
任何程序设计语言都是由语言规范和一系列开发库组成的,我们需要掌握Java语言的基础语法。首先介绍标识符、关键字、变量和常量这些基本元素,以及Java的数据类型,包括基本类型和引用类型;之后继续介绍Java基础语法:Java运算符、表达式(包括运算符的优先次序和数据类型转换)和流程控制(包括顺序流程、选择流程和循环控制流程)。
数组也是Java语言中的一个重要组成部分。需要了解数组的声明、生成和初始化,数组的使用,以及多维数组的基本原理。
在此基础之上进行Java最重要的面向对象的基本概念的学习。这里要熟悉面向对象的核心语法,封装:Java中的类、方法和变量,以及构造方法、方法重载;继承:继承概念和方法重写(覆盖);多态:多态概念和多态实现。
接着介绍面向对象的一些高级特性,包括:静态变量、方法和初始化程序块,最终类、变量、方法,访问规则,抽象类和方法,接口,基本类型包装器,集合,内部类,枚举、注解以及Lambda表达式等。
最后介绍异常的处理。
了解上述Java核心技术基础部分后,将在此基础上介绍Java核心技术的应用部分,包括图形用户界面、输入输出流、多线程和网络编程等。
1.4.2 Java核心技术应用部分
1. 图形用户界面
好的应用系统需要做到用户友好,也就是提供好的图形用户界面(Graphic User Interface,GUI)。下面介绍两个主要的构建图形用户界面技术:AWT和Swing。
1)AWT
在JDK的第一个发布版中包含了AWT(Abstract Windowing Toolkit)这个库。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的进一步发展有很大帮助。
与AWT相比较,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中,可以实现图形绘制、字体和颜色控制、动画和声音的插入、人机交互以及网络交流等功能。
2. 多线程
在计算机编程中,一个基本的问题就是同时对多个任务加以控制。有时要求将问题划分成独立运行的程序片段,使整个程序能更迅速地响应用户的请求。在一个程序中,这些独立运行的片段称为线程(thread),利用它编程就称为多线程处理。多线程处理的一个常见的例子就是用户界面。利用线程,用户单击一个按钮,程序就会立即做出响应,而不是让用户等待程序完成当前任务以后才开始响应。
Java提供的多线程功能使得在一个程序里可同时执行多个小任务。线程(有时也称为小进程)是一个大进程里分出来的小的独立的进程。多线程带来的更大的好处是具有更好的交互性能和实时控制性能。尽管多线程是强大而灵巧的编程工具,但要用好却不容易。必须注意一个问题:共享资源。如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到这个问题。举例来说,两个进程不能将信息同时发送给同一台打印机。为解决这个问题,对那些可共享的资源(如打印机)来说,它们在使用期间必须进入锁定状态。所以,一个线程可以将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。
Java的多线程机制已内建到语言中,这使得一个可能比较复杂的问题变得简单起来。对多线程处理的支持是在对象这一级别支持的,所以一个线程可以表达为一个对象。Java也提供了资源锁定方案,它能锁定任何对象占用的内存(内存实际是多种共享资源的一种),所以同一时间只能有一个线程使用特定的内存空间。为达到这个目的,需要使用关键字synchronized。其他类型的资源必须由程序员明确锁定,这通常要求程序员创建一个对象,用它代表一把锁,所有线程在访问这个资源时都必须检查这把锁。
3. 输入输出
在项目开发中,文件输入输出是必不可少的。输入或者输出都是针对内存而言,从磁盘或者网络载入内存称为输入(Input,I),反之称为输出(Output,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类都是配对的,即有×××Input就有一个对应的×××Output。
4. Java网络编程
对网络编程简单的理解就是两台计算机相互通信,网络编程的基本模型是客户机/服务器(Client/Server)模型。简单地说,就是两个进程之间相互通信,其中一个进程必须提供一个固定的位置,而另一个进程则只需要知道这个固定的位置,并建立两者之间的联系,然后完成数据的通信。这里提供固定位置的计算机通常称为服务器,而建立联系的计算机通常称为客户机(端)。
在开始学习网络编程之前,先简单了解网络的基础知识,特别是网络传输层协议TCP和UDP。它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议(包括HTTP、SMTP、SNMP、FTP和Telnet)提供网络服务。TCP提供的是面向连接的、可靠的数据流传输,类似于生活中的打电话;而UDP提供的是非面向连接的、不可靠的数据流传输,类似于生活中的发短信。
对于程序员而言,掌握一种编程接口并使用一种编程模型就相对简单多了,Java提供一些相对简单的应用开发接口(API)来完成这些工作。对于Java而言,这些API存在java.net这个包里面,因此只要导入这个包就可以准备网络编程了。
Java所提供的网络功能分为以下3类:
(1)URL和URLConnection是3类功能中最高级的一种。通过URL的网络资源表达方式,很容易确定网络上数据的位置。利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或者把自己的数据传送到网络的另一端。
(2)Socket。Socket可以想象成是两个不同的程序通过网络的通道,这是传统网络程序中最常用的方法。一般在TCP/IP网络协议下的客户机/服务器软件采用Socket作为交互的方式。
(3)Datagram是这些功能中最低级的一种。一般在UDP/IP网络协议下的客户机/服务器开发中采用这种模式。其他网络数据传送方式,都假设在程序执行时建立一条安全稳定的通道。但是,以Datagram方式传送数据时,只是把数据的目的地记录在数据包中,然后就直接放在网络上进行传输,系统不保证数据一定能够安全送到,也不能确定什么时候可以送到。
本书将深入细致地讲解上述核心技术。采用的方式是Project-Driven Training,也就是用项目实践来带动理论的学习。因此,第2章首先介绍AscentSys项目。