雍俊海编著的《Java程序设计(第2版)》是“十二五”普通高等教育本科国家级规划教材《Java程序设计教程(第3版)》的简版,讲解Java程序设计的基本知识及其基本编程方法,包括Java语言的基础语法、结构化程序设计、面向对象程序设计、数组、向量、字符串、哈希表、泛型、枚举、异常处理、文件与数据流、图形用户界面程序设计、小应用程序和编程规范等。本书内容的安排和取舍以人们的学习与认知过程为基础,与社会的实际需求相匹配,每章都附有习题,而且在附录中包含图、表、例程以及类和接口的页码索引,在正文中采用特殊字体突出中心词,使读者轻松且愉悦地了解和掌握Java程序设计的知识和方法,并应用到实践中去。本书内容丰富、语言简练,而且提供了丰富的例程,既可以作为计算机专业和非计算机专业的基础教材以及Sun公司的SCJP(Java程序员认证)考试的辅导教材,也可以作为需要使用Java语言的工程人员和科技工作者的自学参考书。
现代科学技术正在迅猛地发展,计算机信息技术在其中发挥着巨大的作用。现在,计算机技术已经渗透到各行各业,并推动着这些行业迅速发展,如何尽快地掌握计算机知识,学好一门计算机语言,已经成为人们面临的比较普遍的基本问题,本书就是在这种背景下编写的。
首先,Java语言本身是一种可以满足这种需求的计算机语言。它比C++计算机语言简单,去掉了C++语言中一些不易理解或容易出错的概念和语法。此外,因为Java是一种较新的计算机语言,所以它在面向对象和多线程特性上比其他现有的计算机语言显得更纯粹一些。同时,Java语言在网络、平台无关性和安全性方面的优点也比大部分计算机语言(如C++语言)更为突出。这样,学习Java程序设计,应用Java语言实现算法也比较容易,从而节省了编程时间。同时,编写出来的Java代码比较容易得到复用和移植。
最初的Java程序设计教材是应选修我主讲的“Java程序设计”课程的同学的要求而编写的。在2003至2004年期间,共有三百多名清华大学本科生选修该课程,其中很多同学通过清华大学的教学评估系统以及给我发E-mail等方式强烈要求我编写一本Java程序设计教材。为此,我编写了本教材的第1版(《Java程序设计》雍俊海,北京: 清华大学出版社,2004)。
我希望本教材能够给读者带来尽可能多的益处。对于学习而言,最重要的应当是对学习方法的引导,学习每门课程都有其内在的学习规律,顺应其规律,采用正确的学习方法一般会产生良好的学习效果。对于有些初学者而言,在最开始学习的时候,要把握学习规律常常有难度;要按学习规律进行学习,常常会有很多来自自身的阻力。如果能够克服上述不利因素并加以坚持,相信会有事半功倍的效果。我希望本教材能够为初学者适应这些学习规律添加一些辅助的约束力,从而帮助初学者克服来自自身的阻力。
学习首先应当是“学以致用”,为此,我常常利用各种机会调研软件公司对Java程序设计的实际需求。如果能够从实际应用出发进行学习,那么应该会提高学习的效率。另外,学习过程的关键应当是实践,教材是实践的一种辅助工具,为此,本教材比较详细地讲解了Java语言编程环境的建
立过程,希望读者在开始学习Java语言的时候能够建立起Java语言编程环境。在教材每章的后面都有习题,对教材的习题,本书都没有提供答案,真诚地希望这些习题能够给读者增加一些自主性思考和实践练习的机会。自主性思考意味着应该通过自己的思考去理解Java语言并求解问题,而且不要拘泥于某一种答案,即可以采用多种不同的方法求解相同的问题。这似乎会增加学习时间和学习难度,但实际上一般会迅速提高学习的效率。在刚开始的时候,有些读者可能会不太习惯,但是如果能坚持,那么实际上会迅速降低后续学习的难度,而且会使对Java语言的掌握更加牢固。另外,希望读者能够理解习题编写的初衷,即它的主要目的是加强具有自主性思考的实践,而不是习题答案本身。希望读者能够经常总结实践过程的收获,享受其中的成就感,即使无法最终求解问题。因为教材提供的习题有些少,所以我还整理了一本习题集——《Java程序设计习题集(含参考答案)》(雍俊海,北京:清华大学出版社,2006)。这本习题集对判断正误题、填空题和选择题基本上都给出了答案,但只给出了少量编程题的答案,这本习题集是本教材的一个有益的补充。如果读者需要阅读编程样例,那么教材已经提供了大量的例程,而且在建立Java语言编程环境之后,在Java系统的安装目录中也包含了一些例程。
在进行编程实践的时候,经常需要查阅在线帮助文档,而不是各种教材或参考书。这对很多初学者来说有较大的难度,其实难度主要来自于自身的惰性,要真正做到这一点,基本上没有任何客观条件上的难度。现在越来越多的在线帮助文档已经有了相应的中文版本,即使直接使用英文的在线帮助文档,它的词汇量也不大,而且语法结构比较简单。另外,理解这些词汇的关键是实践,即通过实践理解或加深理解各种中文或英文术语。为了强化读者对在线帮助文档的使用,在2004年出版的那本教材中,我基本上不将在线帮助文档的内容编写入教材,而是希望读者对照在线帮助文档进行教材的阅读。当然,这样有一个负面作用,那就是会使阅读教材的速度变慢。其实,这种“慢”属于“磨刀不误砍柴工”,会给读者以后的工作或学习带来较大的益处,一般会提高工作和学习的整体效率。在本教材中,应很多读者的要求,我将这些本来属于在线帮助文档的内容添加到本教材中,但是读者不仅不能忽略在线帮助文档,而且应当将重视程度提高到足够的高度。当然,本教材不是简单地去翻译在线帮助文档,而是在该文档的基础上增加编程原理、经验和技巧的介绍,并且在内容上与在线帮助文档相比力求准确、简洁、易于理解。
本教材和2007年出版的教材《Java程序设计教程》(雍俊海,北京,清华大学出版社,2007)是姊妹篇,后者内容更为全面,体现出一定的手册特点。本教材内容是后者的节选,保留了Java语言核心部分,去掉了其中属于提高的部分内容。这两本教材都是在2004年出版的那本教材的基础上编写而成的,相对于2004年出版的那本教材,本教材删除了其中属于提高的部分,添加了泛型、枚举和哈希表等内容,同时添加了相关的在线帮助文档内容,从而方便读者阅读。为了方便读者查找知识点和中心内容,本教材通过加黑加粗加框的方式强调各部分内容的中心词以及各基本概念或定义的核心词,在附录中添加了图、表、例程以及类和接口的页码索引。同时,本教材继承了2004年出版的那本教材的一些特点,例如考虑了如何方便读者自学,希望各章内容的相关性尽可能地小。本教材的所有例程都在Java 7.0版本(也称为1.7版本)上编译运行。
本教材既可以作为计算机专业和非计算机专业的基础教材,也可以作为需要使用计算机的工程人员和科技工作者的自学参考书。本教材在编写与出版的过程中得到了许多朋友的帮助,这里一并表示诚挚的谢意,其中,读者与选修我所负责的课程的同学起到非常重要的作用,他们的建议和批评意见是教材发生变化的最重要的外在因素,这里再次对他们表示诚挚的谢意,真诚地希望读者能够轻松并且愉悦地掌握Java程序设计,也希望自己能做得更好。清华大学的研究生杜敏、范怀宇、高扬、高跃、李勇、林鸿维、刘倩欣、刘曙、刘永宾、卢新来、潘峰、宋征轩、孙学卫、佟强、汪亚君、王天兴、王维勃、王治中、夏雨、许嵩罡、余忠冕、喻晓峰、张佳、张楠、张怡文和赵宏星等同学参与了本教材的核对工作,本教材也凝聚了他们的劳动结晶,在此表示感谢。欢迎广大读者特别是讲授此课程的老师对本教材进行批评和指正,我真诚地希望这本教材能够给读者带来轻松和快乐,而我也会不断为此努力。目前,我的个人主页是http://cgcad.thss.tsinghua.edu.cn/~yongjh/ chn/index.html,E-mail是yongjunhai@tsinghua.org.cn,真诚地欢迎广大读者提出各种建设性意见。
本教材还配有网站,网址是http://cgcad.thss.tsinghua.edu.cn/~yongjh/java/index
.html。如果出现网络不稳定或无法连接的现象,请过几天重新连接或者访问清华大学出版社的网站,清华大学出版社网站的网址是http://www.tup.tsinghua.edu.cn/。
通过这两个网站,读者可以下载与本教材相关的一些资料,例如:
(1)本教材中用到的所有例程;
(2)本教材的课件(可能会不断更新)。
雍俊海
2014年5月于清华园
雍俊海:清华大学计算机科学与技术系学士、硕士和博士,美国肯塔基大学计算机系博士后。现为清华大学软件学院教授和博士生导师。主要研究方向为计算机辅助几何设计、计算机图形学和计算机动画。目前负责清华大学计算机动画精品课程。2004年入选教育部“新世纪优秀人才支持计划”,2005年获得教育部自然科学一等奖,2006年获得国家杰出青年科学基金、清华大学青年教师教学优秀奖,2007年被授予清华大学研究生“良师益友”称号,2008年获得霍英东教育基金会高等院校青年教师基金。
第1章 绪论
1.1 Java语言的历史简介
1.2 Java语言的特点
1.3 Java开发环境的建立
1.4 Java程序及其执行过程
1.4.1 开发Java程序的工作流程
1.4.2 Java程序的工作原理
1.5 本章小结
习题
第2章 结构化程序设计
2.1 标识符和关键字
2.2 基本数据类型、直接量和变量
2.2.1 基本数据类型
2.2.2 直接量
2.2.3 变量
2.3 运算符
2.3.1 算术运算符
2.3.2 关系运算符
2.3.3 布尔逻辑运算符
2.3.4 位运算符
2.3.5 赋值类运算符
2.3.6 条件运算符
2.3.7 其他运算符
2.4 控制结构44
2.4.1 if语句和if…else语句
2.4.2 switch语句
2.4.3 for语句
2.4.4 while语句
2.4.5 do…while语句
2.4.6 break语句
2.4.7 continue语句
2.5 结构化程序设计方法
2.6 本章小结
习题
第3章 面向对象程序设计
3.1 类、域、方法和实例对象
3.2 继承性
3.3 多态性
3.3.1 静态多态性
3.3.2 动态多态性
3.4 包
3.5 封装性
3.6 修饰词abstract、static和final
3.6.1 修饰词abstract
3.6.2 修饰词static
3.6.3 修饰词final
3.7 接口
3.8 内部类
3.9 变量作用域范围与参数传递方式
3.9.1 变量作用域范围
3.9.2 方法调用的值传递方式
3.10 递归方法
3.11 面向对象程序设计的基本思想
3.12 本章小结
习题
第4章 数组、字符串、向量和哈希表
4.1 数组
4.1.1 一维数组
4.1.2 多维数组
4.2 字符串和字符串缓冲区
4.2.1 String
4.2.2 StringBuffer
4.3 向量
4.4 哈希表
4.4.1 哈希表的基本原理
4.4.2 Hashtable
4.5 本章小结
习题
第5章 泛型和枚举
5.1 泛型
5.2 枚举
5.3 本章小结
习题
第6章 异常处理
6.1 异常及其种类
6.2 异常的产生
6.3 异常的处理
6.4 本章小结
习题
第7章 文件与数据流
7.1 输入流与输出流
7.1.1 InputStream和FileInputStream
7.1.2 OutputStream和FileOutputStream
7.1.3 PrintStream
7.1.4 带缓存的输入流和输出流
7.1.5 标准输入/输出流的重定向
7.2 随机访问文件
7.3 读写器
7.3.1 Reader和Writer
7.3.2 FileReader和FileWriter
7.3.3 带缓存的读写器
7.3.4 PrintWriter
7.3.5 从控制台窗口读入数据
7.4 文件
7.5 本章小结
习题
第8章 Swing图形用户界面程序设计
8.1 组件和容器
8.1.1 整体介绍
8.1.2 JFrame和JLabel
8.1.3 JTextField和JPasswordField
8.1.4 JButton、JCheckBox和JRadioButton
8.1.5 JComboBox、JList、JTextArea和JScrollPane
8.1.6 JPanel
8.2 布局管理器
8.2.1 FlowLayout和GridLayout
8.2.2 BorderLayout
8.2.3 BoxLayout
8.2.4 CardLayout
8.2.5 组合布局方式
8.3 事件处理及其模型
8.3.1 事件处理模型
8.3.2 鼠标事件处理和自定义绘制方法
8.4 菜单
8.5 本章小结
习题
第9章 小应用程序
9.1 源程序
9.1.1 生命周期
9.1.2 图形用户界面
9.2 网页标记
9.2.1 采用APPLET网页标记
9.2.2 归档文件
9.2.3 小应用程序参数
9.3 应用程序与小应用程序
9.4 本章小结
习题
第10章 编程规范
10.1 程序编写规范
10.1.1 命名规范
10.1.2 排版规范
10.1.3 语句
10.1.4 文件组织
10.2 文档注释
10.3 本章小结
习题
附录A 图的索引
附录B 表的索引
附录C 例程索引
附录D 类和接口索引
参考文献