面向对象程序设计:Java 语言描述
作者 : (美)Martin Kalin
译者 : 孙艳春 等
出版日期 : 2002-09-01
ISBN : 7-111-10580-X
定价 : 55.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 477
开本 : 16开
原书名 : Object-Oriented Programming in JAVA
原出版社:
属性分类: 教材
包含CD :
绝版 : 已绝版
图书简介

本书全面地讲解了Java语言,内容从基本概念到高级主题(例如联网、多线程和数据库等)。本书有效地将Java语言与面向对象程序设计相结合,使读者能够较快地掌握面向对象系统的分析设计方法和培养编程实现的能力。书中给出的大量经过调试运行的实例,便于初学者入门,提高解决实际问题的能力。本书可作为高等学校计算机及相关专业程序设计课程的入门教材。

图书特色

孙艳春,女,北京大学计算机科学技术系副教授。1999年在东北大学获得博士学位,同年到北京大学计算机科学技术系工作。现已发表学术论文30余篇,参加国家“九五”重点科技攻关项目、国家“863”高科技发展计划项目、国家自然科学基金项目等国家级项目十余项。主要研究领域为软件工程、软件开发环境、软件复用及软件构件技术、计算机支持的协同工作等。

图书前言

本书可以用作Java语言一个学期或两个学期的教程,也可以用于自学。第9章和第10章包含了大量关于网络编程和分布式系统的详细介绍材料,可作为这方面导论课程的教材。本书假定读者没有Java语言和面向对象编程方面的预备知识,但是假设读者有编程方面的经验。读者应该熟悉一些通用的编程概念,如变量、数据类型和语句;了解程序设计结构,如语句的顺序结构、函数调用、测试和循环;具有编程实践,如设计、编码和测试。本书使用了大量的例子、表格、图形、自学练习、应用举例、通常错误和安全实践的列表以及编程练习。贯穿本书,我的目标是编写清晰的代码,并举例说明合理的编程实践。本书中的所有代码已经在Java 2下编译和运行过。本书也从Java的标准类中提取一些例子以便以一种自然的、渐进的方式来介绍Java包。
Java的特殊挑战
本书是根据我日常的教学课程以及与Richard Johnsonbaugh合著的C与C++教材的经验写成的。Java课程服务于三种不同类型的听众,并且这有助于发展讲授编程语言的教学方法。第一类听众是由主修计算机科学和信息系统专业的大学生组成,他们先前学习过另外一种编程语言—如C++或Visual Basic。第二类听众是由熟悉C/C++或ML语言并有很强编程技巧的研究生组成。第三类听众是由掌握多种编程语言—如汇编语言、C、Perl和COBOL的专业编程人员组成。尽管编程人员有不同的背景,但是他们都下定决心要面对挑战学习Java,因为这些挑战反映出了语言的很多吸引人的特征:
Java是一种通用的语言,具有丰富的各种类别的数据类型、运算符、控制结构和标准包。虽然本书的内容完全覆盖了Java,但这样做并未压倒读者。在讲解复杂的内容之前首先集中于相对简单的知识。举一个简单的程序例子,Java有三种循环结构:for循环、while循环和do while循环。在三种循环结构中,while循环的语法和语义最简单。所以首先介绍while循环,然后参照它介绍其他的循环。举一个更复杂的例子,Java通过抽象窗口工具包(Abstract Window Toolkit,AWT)和Swing组件集来支持图形。Swing组件集更灵活并且功能更强大,而AWT更简单;因此,图形从基本的AWT例子开始介绍,然后介绍Swing组件集例子。
Java是一种面向对象的编程语言。尽管Java具有基本的数据类型,如整型(int)和双精度型(double),但是每个程序至少需要有一个类。所有的函数或作为构造函数或作为方法被封装在类中,而变量是在构造函数和方法中封装的域或局部变量。对于类而言,Java只支持单继承,但该类可以任意实现多个接口;对于接口而言,Java支持多继承。Java也有具体类和抽象类。而且,方法和域可以与类本身相联系(静态的方法和域),也可以与类实例或对象相联系(非静态的方法和域)。面向对象的构造,如多态,被广泛用于Java标准类中。尽管Java是一流的面向对象语言,仍然要提醒那些专门或主要从事过程开发的读者特别注意。本书从两个方面论及面向对象:
—第1章阐述面向对象设计和编程的基本概念、构造和益处。这一章解释了关键术语,例如类、对象、信息隐藏、封装、继承和消息传递。这一章也有关于UML的一节,介绍面向对象设计的现代方法。
—本书的短程序和长应用程序例子讲授面向对象的程序设计作为一种自然而直观的编程方法,目的是说明编程人员能从面向对象方法得到的好处。
Java是一种现代的编程语言,用标准软件包支持图形、联网、安全性、永久性(persistence)、数据库、映射、组件等。Java功能强大并不断增强。标准Java包已经增加了javax包(x代表扩展)和许多优秀的商业软件包。前7章着重介绍核心的语言特征,后3章讲述了这些核心特征如何以不同的方式(例如socket、applet、servlet、远程方法调用(RMI)和对象请求代理)支持联网、数据库、安全性和基于组件的编程。全部10章从Java的标准类中提取了许多常用的例子以给读者接连介绍Java丰富的类库。
各章概述
本书有10章,各章每一节的最后是自学练习。本书给出各节练习中奇数题的答案,并且教学光盘包含了练习中偶数题的答案。除了第1章,每章都有编程练习和通常编程错误与安全实践的列表。本书包含:
带有奇数练习答案的600多个节后练习 。
140多个编程练习。
13个主要应用程序例子以及150多个附加的完整程序。
许多章有Java补充材料用来处理特别的主题,例如整数的补码表示法、volatile修饰符和不赞成的Thread方法。这些章中包含了短程序和长应用程序例子。程序和应用程序例子的所有源代码都可以从本书附带的光盘和Web网站获得。各章介绍如下:
第1章:面向对象程序设计。这一章解释面向对象设计和编程的基本概念以及和自顶向下的设计和面向过程的程序设计相比具有的优点。解释和说明关键概念,如类、对象、继承、多态、抽象数据类型、消息传递、接口和组件等。尽管本章包括简要的Java例子,但总体上还是把重点放在面向对象的程序设计上。本章还有一节概述建模语言UML,并且介绍了各种UML图表的例子。这一节还说明UML如何用模型引导编码。
第2章:入门程序。这一章介绍一系列短小但实用的程序以便读者对Java代码立即获得“外观和效果”。本章各节和节后练习都有修改和扩展程序的方法的建议,以便读者能快速获得Java编程经验。本章从传统的Hello,world!程序开始,然后介绍其他短小的程序以解释基本类型和类类型、变量声明和赋值、控制结构如测试和循环、构造函数和方法调用以及数组,并认真解释如何编写、文档化、编译和运行程序。这一章假设读者使用JDK for Java 2的命令行来编译和执行程序。
有些程序是成对使用的,其中一个程序用于产生随机数,另一个程序从磁盘文件中读数据。这一章的第二个入门程序是称为BigAndSmall的例子。这个程序是从一个数列中选择最大和最小的整数。在版本1中,使用标准的java.util.Random类随机产生整数;在版本2中,从本地磁盘文件中读整数。这两个版本共同为读者提供了早期的、可选的产生输入数据的例子。输出数据采用相似的方法:在一对程序中的一个程序把数据写到标准输出中,而另一个把数据写到本地磁盘文件中。
这一章有一节专门讲解字符串,介绍String和StringBuffer类。在关于String类的一节中也强调测试客户功能的编写如何有助于学习Java语言。
其他3节介绍了程序员定义的类,进一步介绍java.io包的基础,和三个实用程序类:Vector、Hashtable和StringTokenizer。程序例子也是简短的,但却是常见而实用的,如排序。
第3章:程序和包。这一章解释Java虚拟机的任务以及程序类型,如应用程序、applet、servlet和bean之间的关系。这一章回顾并扩展了源程序(java)和编译后的(class)文件的内容。这一章也介绍package语句和CLASSPATH环境变量。同时介绍作为子包的子目录的使用。这一章有一个使用程序员定义包的应用程序例子。为了方便,本章包含许多标准java包和javax包列表的参考图。
第4章:语言基础。这一章介绍语言基础,包括标识符、基本数据类型和类数据类型、控制结构、运算符、数组和异常。这一章有一节回顾构造函数和方法,然后扩展这些关键主题的内容。本章被细致地组织成各节和各小节以便可以用作基本Java语言的一个参考和介绍。我假设读者会反复参照所选的本章小节。例如,读者可能等到程序设计需要时才认真阅读有关switch结构的一节。一些特殊的语言特征,如按位操作,在Java补充材料中介绍而不是在这一章的主体中介绍。这一章有一个应用程序例子。
第5章:类。这一章对类作广泛的和技术方面的介绍。本章考查类和成员范围、信息隐藏、封装、构造函数、方法和域。本章解释如何用类语义的技术方面来达到实际目的。例如,有一个小节介绍选择性构造函数定义如何用于限制对象结构。这一章也说明无参数构造函数的关键作用。
本章有一节介绍关于类库的使用,如Java的标准类库。这一节回顾测试客户的使用以便能熟悉类,并再次强调在一个类中暴露部分和隐藏部分之间的关系。
这一章的第一个应用程序例子有两个类,BasicInput和BasicOutput,它们说明包装类的用处。这两个类用直观的构造函数和方法支持高层输入和输出。例如,可以用标准输入或磁盘文件作为数据源创建BasicInput对象。有些方法相对较简单,如getRecord和getDouble。这个应用程序例子连同第2章中使用java.io包作为二进制和字符输入/输出的入门程序,都是关于编写完成现实的输入和输出操作的有力例证。
第二个应用程序例子含有一个图形组件解释图形如何集成到语言中。图形的早期使用强调甚至在掌握Java的图形包的所有细节之前程序就可以使用图形组件。
第6章:继承、接口和抽象类。本章扩展第5章讲述的内容,解释继承、接口和抽象类。本章介绍多态性的技术方面,并且强调它在一系列关于多态输入和输出的短程序和应用程序例子中的强大功能。接着本章详细介绍面向对象编程中的继承下的构造函数、方法覆盖和接口的使用。
本章解释接口和类之间的区别,强调关于“接口编程”的面向对象的原则,以标准Java接口和程序员定义接口作为例子。本章最后一节介绍抽象类,并与具体类和接口进行对比。这一节强调抽象类是具有特殊用途的真实类。
第7章:图形与事件处理。本章从抽象窗口工具包(AWT)和Swing组件集、事件驱动编程和Java事件模型的概述开始。本章通过着重介绍基本结构,如容器(container)和组件(component),强调AWT和Swing组件集之间的共同特征。本章讨论“重量级”和“轻量级”组件之间的关系,以及这种区别如何涉及AWT和Swing组件集。关于模型视图控制器结构一节介绍一个Swing组件集图形的基本视图。本章的许多程序和两个应用程序例子说明帧窗口、对话框、字体、颜色、布局管理器和控制器(例如按钮、菜单、菜单条、工具条、列表、复选框和滚动条),也包含了基本的绘图和图像。整个重点是图形编程的实践方法。为此,许多短程序集中于一些特别的主题,例如关闭窗口和使用弹出式菜单。
本章强调Swing组件集图形无论在哪里都是可行的,而使用相对简单的AWT来说明一些重要的想法。两个应用程序例子介绍高层Swing组件集组件JTree和JTable。
第8章:三种接口。本章讨论三种重要的接口:Cloneable、Serializable和Runnable。第一节解释对象构造、对象引用复制和研制兼容产品之间的区别,讨论并说明研制对象域包括对象或数组引用的对象兼制产品的危险性。有几小节讨论默认clone方法的覆盖、禁用研制兼容产品和研制数组兼容产品。
本章的第2节介绍系列化和对象的永久性。本节不但涉及基本知识,并且包含一些技术细节,例如那些没有实现Serializable的超类的系列化、连续的版本号、重复地对同一个流系列化相同对象的危险性。阐明系列化与把基本类型编写到二进制流中的区别。通过一系列相关例子检查和激发所定制的系列化,所有这些例子虽然简短,却是很完整的程序。有几小节是关于禁用系列化和实现Externalizable。有一个关于系列时间片的应用程序例子用来复习和巩固材料。第9章关于联网技术进一步讨论系列化和套接字,第10章涉及系列化与bean的关系。
第3节综合介绍多线程。本节从详细考察单线程与多线程之间的区别开始,并使用完整的程序例子来说明多线程的好处与基础。本节内容包含线程的优先级、用户线程与守护线程之间的区别、start与run的关系、终止线程的推荐方法、join方法的使用。本节也介绍线程组。在介绍基本的知识之后,举例说明和讨论线程同步的必要性。本节和一个关于哲学家进餐问题的应用程序例子中也涉及了死锁问题、饥饿问题(starvation)、公平问题。本节也介绍像临界区(critical section)、互斥(mutual exclusion)、锁(lock)等基本概念,然后用Java结构进行说明。第9章关于联网技术对多线程服务器的例子进行进一步讨论。
第9章:网络编程。本章讲述Java语言中的网络编程。本章从联网基本概念概述开始,特别讲述TCP/IP协议组。解释地址、数据包、传输协议、套接字、防火墙、代理服务器和其他基本概念。随后一节是关于套接字的。这一部分通过不同的例子讲述客户Socket、ServerSocket和DatagramSocket,也说明MulticastSocket。本章的例子是完整的程序,这些例子中许多实现了熟悉的实用程序例子,如端口测试程序和finger程序。这一部分强调通过套接字的系列化的作用,并且用一个应用程序例子解释多线程服务器。
本章第3部分详细介绍applet,包括沙盒安全问题。这一部分从一些很容易根据经验做适当修改的基本例子开始。并且介绍一个多媒体applet,并讨论applet和jar文件。这一节讲述了applet如何相互通信,以及不是Web浏览器的程序如何用做applet主机程序。并举出一个Java应用程序的例子,它的功能是下载并在应用程序自身的帧窗口中显示一个applet。这一节也强调Java对URL以及其他网络编程结构的高度支持。尽管可以在独立主机上运行applet,这一节还强调在分布式、客户/服务器系统中applet的用处。应用程序例子说明了一个applet命令格式如何使用一个套接字把信息传送回服务器。
本章第4部分介绍RMI。在激发RMI后,这一部分分步解释如何设置一个RMI服务器和客户。这一部分也解释注册表和激活RMI的作用。最后的小节介绍Jini,阐述它与RMI的关系。关于矩阵代数运算的应用程序的例子回顾并扩展RMI资料。应用程序例子特别提供一个实用的例子讲述RMI如何用于分布式系统。
本章的最后一部分总体上讲述对象请求代理,特别讲述CORBA。与RMI一节类似,这一节分步说明如何设置CORBA服务器和客户。这一部分讲述IDL文件、idltojava实用程序、CORBA模块和接口、语言和本地透明性、命名服务、动态调用接口,以及关于RMI和CORBA技术相结合的IIOP。Java补充材料阐述一个applet如何作为CORBA客户使用。
本章解释如何在一个独立主机上使用localhost IP地址开发和测试分布式应用程序。这一章连同第10章有大量材料可以作为网络编程或分布式系统的入门教材。
第10章:精选主题。这一章讲述了几个特殊主题,分为四节讨论。10.1节着重讲述使用Java bean基于组件的程序设计。这一节强调bean技术,包括Enterprise Java Bean,如何平衡基本Java结构(如系列化)的作用、接口,作为get/set方法对的属性以及事件模型。这一节介绍和阐述用于开发和测试bean的beanbox工具。这一节也解释属性改变事件如何用于bean交互。
10.2节讲述安全性和密码术。要检查的编译器、字节码校验器和安全管理器的安全作用。这一节强调高层安全结构,如存取控制器和策略文件的使用。关于安全性的小节提供几个为实现安全性授权的例子。一些例子(如沙盒的安全性)回顾并扩展前几节的内容。关于密码术的小节首先概述Java库支持,然后着重讲述身份验证。解释消息摘要、公有密钥和私有密钥以及数字签名间的关系。方法是分步进行讨论的,并举例说明数字签名如何用于发送方和接收方。用几个短例子和一个较长的例子说明Java对身份验证的支持。
10.3节是关于映射的内容,也是基于例子进行讲解的。这一节首先概述Java对运行时类信息的支持,然后用几个例子说明。例如,这一节说明如何使用反射技术从一个类文件重构类的基本信息。这一节也扩展bean的讨论,通过展示反射技术如何成为在beanbox工具中的属性单的动态创建的基础。
10.4节介绍servlet和数据库。通过一个关于数据库网上访问的应用程序例子,本节进一步扩展第9章中所涉及的网络编程的材料。在介绍servlet基础知识之后,提供几个读者能扩展知识的短程序例子。后面有一个小节解释JDBC是如何工作的,以及数据库和servlet技术是如何共同集成在一起的。这些例子使用Northwind数据库,此数据库来源于微软的Access关系数据库管理系统。但是,这些例子是完全模块化的,因此它们能直接被其他数据库采用。JDBC所涉及的内容强调其中的核心特征,例如连接、查询、结果集。之后应用程序例子说明servlet与数据库技术的集成。在应用程序例子中,一个servlet介绍HTML中的产品列表。在用户选择一个产品之后,另一个servlet产生一个购买此产品的用户的HTML列表。这两个列表的数据储存在一个数据库中。应用程序再次被设计成易于修改的程序。
章的结构
基本的章组织如下:
内容
概述

节练习

节练习
……
Java补充材料
通常错误和安全实践
编程练习
第3~10章有13个应用程序例子。一个应用程序例子小节包含一个问题的陈述、例子的输入和输出、问题的解决方法,以及问题解决方法的Java实现。这一节以Java实现和程序开发的扩展讨论结束。应用程序例子包括以下部分:
通过一个包装类产生随机数(3.4节)。
基本输入和输出类(5.4节)。
一个用于文件复制的图形工具(5.5节)。
多态输入和输出操作(6.3节)。
图形辅助目录(7.4节)。
图表编辑器(7.6节)。
一个系列化的时间片(8.3节)。
哲学家就餐问题的一个多线程仿真(8.5节)。
一个带有成员关系表格的基于套接字的applet(9.5节)。
使用RMI的矩阵代数运算(9.7节)。
使用servlet的数据库webification(10.5节)。
各个Java补充材料节重点讨论语言的特殊部分,并给出关于语言特征的附加的技术细节。
各个通常错误和安全实践节强调那些易于产生误解的语言部分。
本书包含140多个程序设计练习,这些练习是从大量的应用程序中抽取出来的。程序设计练习从相对简单到复杂有不同的难易程度。
关于这本书
这本书包括:
包含广泛应用程序的例子和练习。
以现实世界的应用程序为出发点。
种类繁多的程序设计练习。本书包含140多个程序设计练习。
各章最后列出了通常错误和安全实践。
在每节的最后安排练习以便读者能检查他们对各章节的掌握情况。本书包含600多个这样的练习。本书最后给出奇数练习的答案,而偶数练习的答案在本书附带的光盘中给出。
有助于学习过程的图表。
例子
本书包含270个例子,它们阐述Java特别的一面。大多数例子是完整的程序或类定义。在每个例子的开始和结束带有一个黑色方块标志。
练习
本书包含600多个节回顾练习,这些练习的答案是简短的代码段,只在几个例子中是完整的程序。这些练习适宜作为家庭作业问题或作为自我测试问题。奇数练习的答案在本书的最后给出。一个配合Web站点包含附加的自学材料。讲授Java的经验使我确信这些练习的重要性。
学生和教师支持材料
本书附带一张光盘,它带有Java的JBuilder集成开发环境,以及所有应用程序例子和主要例子的源代码。http://condor.depaul.edu/~mkalin站点也提供相应的Java源代码。
教学光盘和Web站点为使用本书的课程提供全部的教学支持。教学光盘包括以下内容:
偶数练习的答案。
应用程序例子和主程序例子的源代码。
每章的测试集都包含了多选问题,有160多个多选问题。
教学提纲例子。
Web站点的教学支持包括每章的真/假评审问题,并且每章概要以Power Point幻灯片的形式给出。有100多个这样的问题。在Web站点也提供所有应用程序例子和主程序例子的源代码。


M.K.

图书序言

面向对象编程是以可复用、可扩展和可维护的方式编写软件的方法。过去十年,面向对象编程的旋风席卷了整个软件行业,给编程人员带来生产率、软件复用率和可维护性上的提高。Java是充分面向对象的语言,它支持面向对象程序设计的封装性、继承性和多态性。
Java不仅是面向对象程序设计语言中的佼佼者,而且迎合了因特网发展形势的需要,它所体现的简单、与平台无关、面向对象、分布式、可靠性、安全性、可移植性、动态性和多线程等特性,为因特网的使用提供了一种良好的开发和运行环境,Java已成为网络编程的最优秀的工具。
目前,关于Java编程语言的书籍有很多,但有关Java语言和面向对象程序设计理论与实践相结合方面的书籍还很少见,而这样的书籍又恰恰是广大从事软件开发的人士迫切需要的。本书在Java语言和面向对象程序设计理论与实践上结合得很好,为了使中国的读者能够更好地从中受益,译者受机械工业出版社华章分社委托,翻译了本书。
本书对Java语言进行全面的介绍,内容从基本概念到高级主题(如联网(套接字、RMI、CORBA、servlet)、多线程和数据库)。本书强调对象概念,并按照教学法深入细致地介绍Java,把重点放在Java语言的核心部分,并且给出大量的例子,从这些例子中读者可以很容易地归纳总结Java面向对象编程的特点。大部分例子和所有的实例应用程序都是完整的程序,读者可以对这些程序进行编译、运行和修改。
本书的主要特色:
1) 本书内容新颖。详细介绍Java 2的内容,包括Swing组件集图形、servlet、RMI、CORBA、Java bean和联网主题(如安全性和加密)。
2) 本书从第1章就介绍面向对象的编程,而且后续几章不断强化面向对象编程的概念和思想,并通过大量例子使读者可以清晰掌握Java面向对象编程的思想。
3) 本书通过600多个章节回顾练习大大加强了所讲述内容,并且本书包含了其中所有奇数练习的答案。另外,本书包含500多个例子,其中大约有200个例子有完整的程序。这些例子和练习为读者掌握和熟练Java面向对象程序设计提供了很好的实践机会。
本书在翻译过程中,得到以下同志的大力帮助,他们是黄毅斌、谢海劝、徐国市、解军、麻志毅、赵俊峰、贾宏宇、严伟、薛宏珍、马亮、陆庆达。在此对这些同志表示衷心的感谢。
感谢机械工业出版社华章分社的领导和编辑们,他们为本书的顺利出版,付出了大量的辛勤劳动。
由于译者自身的知识局限,加之时间仓促,译文难免存在着疏漏和错误,诚恳地希望广大读者给予批评与指正。


译 者
2002年1月于北京大学

译者简介

孙艳春 等:暂无简介

图书目录

第1章  面向对象程序设计 1
1.1  面向对象程序设计和过程型程序设计 1
1.1.1  自顶向下设计和过程型程序设计 1
1.1.2  自顶向下设计的问题 2
1.1.3  类和对象 3
1.1.4  域和方法 4
1.1.5  实例与类成员 4
1.1.6  类的设计 5
1.1.7  类与对象的关系 5
1.2  类和抽象数据类型 6
1.2.1  信息隐藏 6
1.2.2  封装 7
1.2.3  抽象数据类型 7
1.3  客户/服务器模型和消息传递 9
1.3.1  客户/服务器模型 9
1.3.2  消息传递和方法调用 10
1.4  继承和多态 11
1.4.1  继承 11
1.4.2  多态 12
1.4.3  多态和递归 13
1.5  接口和组件 15
1.6  面向对象的建模和统一建模语言 18
1.6.1  示例模型 19
1.6.2  从统一建模语言模型到程序代码 21
第2章  入门程序 24
2.1  第一个程序 25
2.2  基本的编程结构 29
2.2.1  求最小整数和最大整数 30
2.2.2  import语句的便利之处 31
2.2.3  产生随机整数 32
2.2.4  while循环 32
2.2.5  if语句 33
2.2.6  编译和运行BigAndSmall程序 33
2.2.7  从一个磁盘文件读取输入 33
2.2.8  填充数组并对其排序 35
2.2.9  确保一个程序被正确地调用 36
2.2.10  构造、填充并排序一个数组 37
2.2.11  填充、打印并排序一个数组 37
2.2.12  把输出写入一个磁盘文件 38
2.2.13  为一个游戏确定最佳策略 40
2.2.14  for循环 43
2.2.15  绝对值和余数 44
2.3  字符串 46
2.3.1  toString方法 46
2.3.2  一个String类的测试客户程序 47
2.3.3  字符串的转换方法 49
2.3.4  包装类和类型转换 50
2.3.5  StringBuffer类 50
2.4  程序员定义的类 52
2.5  输入和输出 55
2.5.1  输入/输出流 55
2.5.2  IOException 56
2.5.3  二进制输入:统计一个文件的字
节数 56
2.5.4  辨别字母和数字 57
2.5.5  把标准输入回送到标准输出 59
2.6  实用程序类 61
2.6.1  StringTokenizer类 62
2.6.2  Vector类 63
2.6.3  Hashtable类 64
2.7  Java补充材料 67
2.8  通常错误和安全实践 67
2.9  编程练习 68
第3章  程序和包 72
3.1  程序类型 72
3.1.1  Java虚拟机 72
3.1.2  应用程序 72
3.1.3  applet 73
3.1.4  servlet 73
3.1.5 bean 74
3.1.6  程序类型小结 74
3.2  回顾源文件和类文件 75
3.3  包 77
3.3.1  import语句 78
3.3.2  import语句的使用 79
3.3.3  包与命名冲突 80
3.3.4  默认包和命名的包 80
3.3.5  package语句 81
3.3.6  环境变量CLASSPATH 82
3.3.7  子目录作为子包 83
3.4  应用举例:产生非负整数 85
3.4.1  问题 85
3.4.2  输出 85
3.4.3  解决方法 86
3.4.4  Java实现 86
3.4.5  讨论 86
3.4.6  回顾构造函数和方法 87
3.4.7  编译并运行例子程序 88
3.5  通常错误和安全实践 89
3.6  编程练习 90
第4章  语言基础 96
4.1  标识符、变量和值 96
4.1.1  变量和值 97
4.1.2  域和默认值 98
4.1.3  对象引用的默认值null 99
4.1.4  局部变量 99
4.1.5  final变量 100
4.2  构造函数和方法 101
4.2.1  构造函数和方法重载 102
4.2.2  方法的语法 103
4.2.3  方法之间的区别 104
4.3  基本数据类型和运算符 105
4.3.1  整数类型 106
4.3.2  浮点类型 107
4.3.3  强制类型转换操作 108
4.3.4  算术运算符 109
4.3.5  移位和位运算符 110
4.3.6  赋值、增量和减量运算符 110
4.3.7  浮点数的算术运算符 111
4.3.8  char类型 111
4.3.9  char类型和整数类型混合使用的
问题 112
4.3.10  对char类型的算术运算 112
4.3.11  字符串文字 113
4.3.12  boolean类型 113
4.3.13  关系运算符 114
4.3.14  关于等于运算符= =的特别注释 115
4.3.15  等于运算符和对象引用 115
4.3.16  逻辑运算符 116
4.3.17  运算符instanceof 117
4.4  数组 119
4.4.1  边界检查 120
4.4.2  数组的数组 120
4.4.3  数组作为返回类型 122
4.5  控制结构 123
4.5.1  程序块 123
4.5.2  同一名字的域、参数和局部变量 125
4.5.3  嵌套程序块 125
4.5.4  if语句 126
4.5.5  switch语句 127
4.5.6  while循环和do while循环 129
4.5.7  for循环 129
4.6  应用举例:产生非重复的整数 132
4.6.1  问题 132
4.6.2  输出 132
4.6.3  解决方法 133
4.6.4  Java实现 133
4.6.5  讨论 134
4.6.6  Set接口和HashSet实现 135
4.7  异常 136
4.7.1  finally语句 137
4.7.2  在程序中故意抛出一个异常 138
4.7.3  throws语句 139
4.7.4  异常和调试 140
4.8  Java补充材料 141
4.8.1  整数的二进制补码表示 141
4.8.2  垃圾回收 142
4.8.3  按位/逻辑运算符 143
4.8.4  条件运算符 143
4.9  通常错误和安全实践 144
4.10  编程练习 146
第5章  类 151
5.1  类和类成员的作用域 151
5.1.1  类作用域 151
5.1.2  成员作用域 153
5.1.3  类和成员作用域小结 156
5.2  构造函数、方法和域 157
5.2.1  构造函数 157
5.2.2  无参数的构造函数 159
5.2.3  通过构造函数限制对象的构造 160
5.2.4  构造函数和非引用对象 161
5.2.5  方法 161
5.2.6  属性和get/set方法 162
5.2.7  方法和各种不同的功能 163
5.2.8  从构造函数中调用方法 163
5.2.9  从带返回类型的方法中返回值 163
5.2.10  通过构造方法构造对象 164
5.2.11  域 164
5.2.12  实例域和对象的状态 165
5.2.13  域的初始化 166
5.2.14  static方法和域 167
5.2.15  访问static成员的一种工作方法 168
5.2.16  static成员的使用 169
5.2.17  遭反对的特性 170
5.3  学习类库 172
5.4  应用举例:基本的输入/输出类 177
5.4.1  问题 177
5.4.2  输入/输出 177
5.4.3  解决方法 179
5.4.4  Java实现 179
5.4.5  讨论 181
5.5  应用举例:一个用于文件复制的实用
工具类 186
5.5.1  问题 186
5.5.2  输出举例 187
5.5.3  解决方法 187
5.5.4  Java实现 188
5.5.5  讨论 189
5.6  Java补充材料 192
5.7  通常错误和安全实践 193
5.8  编程练习 196
第6章  继承、接口和抽象类 201
6.1  继承的基本概念 201
6.1.1  类Object 203
6.1.2  一些重要的Object方法 203
6.1.3  作用域和继承 205
6.1.4  作用域和继承的相互作用 206
6.1.5  改变一个继承成员的作用域 207
6.1.6  在继承下的构造函数 208
6.1.7  名字隐藏 212
6.1.8  用修饰符final禁用继承 213
6.1.9  强制类型转换和类型安全 214
6.1.10  向下强制类型转换的危险 215
6.2  多态 216
6.2.1  覆盖toString方法 219
6.2.2  覆盖和名字隐藏 220
6.2.3  方法覆盖调用超类方法 221
6.2.4  用修饰符final禁用覆盖 222
6.2.5  覆盖与重载 222
6.3  应用举例:多态的输入和输出 224
6.3.1  问题 224
6.3.2  输入/输出举例 224
6.3.3  解决方法 225
6.3.4  Java实现 225
6.3.5  讨论 232
6.4  接口 233
6.4.1  接口和继承 235
6.4.2  接口作为引用数据类型 236
6.4.3  嵌套的接口 237
6.4.4  应用程序接口 238
6.5  抽象类 238
6.5.1  创建一个抽象类的三种方法 239
6.5.2  具体类、抽象类和接口的小结 240
6.6  Java补充材料 241
6.7  通常错误和安全实践 242
6.8  编程练习 244
第7章  图形与事件处理 247
7.1  AWT和Swing组件集概述 247
7.1.1  模型视图控制器结构 248
7.1.2  AWT和Swing组件集的共同特性 249
7.2  事件驱动的程序设计 250
7.2.1  事件委托模型 251
7.2.2  Action接口 255
7.3  组件和容器 256
7.3.1  JFrame窗口 257
7.3.2  通过关闭顶层窗口结束应用程序 261
7.3.3  Action接口和AbstractAction类 263
7.3.4  菜单、弹出式菜单和子菜单 265
7.3.5  键盘快捷键 265
7.3.6  弹出式菜单 268
7.3.7  工具条 270
7.3.8  对话框窗口 271
7.4  应用举例:辅助目录 274
7.4.1  问题 274
7.4.2  输出举例 274
7.4.3  解决方法 275
7.4.4  Java实现 275
7.4.5  讨论 277
7.4.6  创建树结构 278
7.4.7  事件处理 279
7.5  模型视图控制器结构 280
7.5.1  一个组件视图和控制器的集成 283
7.5.2  组件的外观和效果 283
7.5.3  画图和重画 286
7.5.4  合法和无效 289
7.6  应用举例:一个图形表格编辑器 291
7.6.1  问题 291
7.6.2  输入举例 291
7.6.3  解决方法 291
7.6.4  Java实现 291
7.6.5  讨论 293
7.6.6  编辑雇员记录 294
7.7  通常错误和安全实践 294
7.8  编程练习 295
第8章  三种接口:可复制的、可系列化的
和可运行的接口 299
8.1  复制对象 299
8.1.1  clone方法的默认实现 299
8.1.2  默认clone方法的问题 300
8.1.3  复制数组 303
8.1.4  禁用复制 303
8.2  系列化 304
8.2.1  系列化的基本概念 305
8.2.2  系列化的规则 305
8.2.3  系列化与对象图形 305
8.2.4  带有可系列化子类的不可系列化
超类 306
8.2.5  对象的输入流和输出流 306
8.2.6  系列化、数组和基本类型 307
8.2.7  基本类型与对象流 308
8.2.8  系列化和String 308
8.2.9  系列化和static域与transient
域 309
8.2.10  定制系列化 310
8.2.11  关于系列化的特别注释 313
8.2.12  系列版本号 314
8.2.13  Externalizable接口 314
8.2.14  禁用系列化 315
8.3  应用举例:一个可系列化的时间片 316
8.3.1  问题 316
8.3.2  输出举例 316
8.3.3  解决方法 316
8.3.4  Java实现 316
8.3.5  讨论 318
8.4  多线程程序 319
8.4.1  从单线程执行到多线程执行 320
8.4.2  交叉的线程执行 321
8.4.3  线程执行的小结 321
8.4.4  多线程的优点 322
8.4.5  使程序成为多线程的两种方法 328
8.4.6  多线程和程序终止 328
8.4.7  用户线程和守护线程 329
8.4.8  线程优先级 330
8.4.9  线程状态 332
8.4.10  线程组 332
8.4.11  线程同步 334
8.4.12  join方法 335
8.4.13  线程同步的需要 336
8.4.14  临界区和互斥 336
8.4.15  同步线程间的通信 338
8.4.16  wait方法和通知 339
8.4.17  notify和notifyAll方法 340
8.4.18  死锁 340
8.4.19  不遭反对的Thread构造函数和方
法小结 342
8.5  应用举例:哲学家进餐问题 344
8.5.1  问题 344
8.5.2  输出举例 345
8.5.3  解决方法 346
8.5.4  Java实现 346
8.5.5  讨论 348
8.5.6  对临界区问题的解决方法 349
8.6  Java补充材料 351
8.6.1  遭反对的线程方法 351
8.6.2  线程、编译器优化和Volatile
修饰符 351
8.7  通常错误和安全实践 351
8.8  编程练习 354
第9章  网络编程 357
9.1  基本概念 357
9.1.1  IP地址 358
9.1.2  包结构 358
9.1.3  端口号 359
9.1.4  套接字 359
9.1.5  可靠传输和最佳试验传输 360
9.1.6  防火墙和代理服务器 360
9.2  套接字 361
9.2.1  客户套接字 361
9.2.2  服务器套接字 364
9.2.3  数据报套接字 366
9.2.4  系列化与套接字 369
9.2.5  组播套接字 371
9.2.6  Java安全套接字扩充 371
9.2.7  在一台独立运行的机器上测试分布
式应用程序 372
9.3  应用举例:一个多线程的俗语服务器 372
9.3.1  问题 372
9.3.2  输入/输出举例 373
9.3.3  解决方法 374
9.3.4  Java实现 374
9.3.5  讨论 375
9.3.6  客户 375
9.4  applet 376
9.4.1  Applet和JApplet类 376
9.4.2  初始化、开始和结束一个applet 380
9.4.3  appletviewer实用程序 383
9.4.4  通信applet 383
9.4.5  JAR文件 384
9.4.6  applet的安全性和沙盒机制 385
9.4.7  Java应用程序作为applet的主机程序 385
9.5  应用举例:MACE作为带套接字的
applet 389
9.5.1  问题 389
9.5.2  输入/输出举例 389
9.5.3  解决方法 390
9.5.4  Java实现 390
9.5.5  讨论 392
9.6  远程方法调用 393
9.6.1  RMI服务器和客户举例 393
9.6.2  RMI客户 394
9.6.3  安全许可 395
9.6.4  RMI服务器 395
9.6.5  RMI的激活 396
9.6.6  RMI和Jini 396
9.7  应用举例:矩阵的代数运算 397
9.7.1  问题 397
9.7.2  输入/输出举例 397
9.7.3  解决方法 399
9.7.4  Java实现 399
9.7.5  讨论 400
9.7.6  矩阵加法和乘法的时间复杂性 401
9.8  对象请求代理程序和CORBA 401
9.8.1  CORBA应用程序举例 402
9.8.2  IDL文件 402
9.8.3  服务器程序 404
9.8.4  CORBA命名服务 404
9.8.5  客户程序 405
9.8.6  运行应用程序 406
9.8.7  动态调用接口 407
9.8.8  联网技术小结 407
9.9  Java补充材料 408
9.9.1  jar实用程序 408
9.9.2  applet作为CORBA客户程序的
安全问题 408
9.10  通常错误和安全实践 409
9.11  编程练习 409
第10章  精选主题 413
10.1  bean 413
10.1.1  组件属性的动态编辑 413
10.1.2  属性改变事件 418
10.1.3  bean box 421
10.1.4  Enterprise Java Bean 423
10.2  安全和密码技术 424
10.2.1  基本安全结构 424
10.2.2  安全管理器 425
10.2.3  访问控制器 427
10.2.4  权限 427
10.2.5  安全策略文件 431
10.2.6  密码技术 432
10.2.7  消息摘要和数字签名 433
10.2.8  私人密钥系统和公共密钥系统 434
10.2.9  产生与验证数字签名 435
10.2.10  Java密码技术的扩展 439
10.3  反射 440
10.3.1  系列化检测 440
10.3.2  获取运行时的类信息 441
10.3.3  反射和bean 444
10.4  servlet和数据库 444
10.4.1  servlet的基本概念 445
10.4.2  动作标签 446
10.4.3  doGet和doPost回调 446
10.4.4  JDBC的基本概念 448
10.5  应用举例:数据库网上访问 451
10.5.1  问题 451
10.5.2  输入/输出举例 451
10.5.3  解决方法 452
10.5.4  Java实现 453
10.5.5  讨论 455
10.5.6  servlet Products 455
10.5.7  SalesServlet 456
10.6  Java补充材料 457
10.6.1  bean box工具 457
10.6.2  Java Servlet开发工具包 458
10.6.3  为访问数据库Northwind, 建立从
JDBC到ODBC的桥 458
10.7  通常错误和安全实践 458
10.8  编程练习 459
附录A  奇数练习题的提示及解答 462

教学资源推荐
作者: [加拿大] 马丁·P.罗毕拉德(Martin P. Robillard) 著
作者: 刘振安 刘燕君 唐军 编著
作者: (美)Maurice Herlihy 布朗大学 Nir Shavit 麻省理工学院 著
参考读物推荐
作者: [美]艾德里安·奥斯特洛夫斯基(Adrian Ostrowski),[波]彼得亚雷·加奇科夫斯基(Piotr Gaczkowski) 著
作者: (美)David Mark James Bucanek 著