编辑推荐
本书是Java语言的入门级教材,是作者针对Java语言的教学目的,结合国内教学的特点,根据多年的教学实践与科技开发的经验编写的。结合作者编写的《Java程序设计题解与上机指导》,能帮助读者尽快掌握Java程序设计的方法。
内容简介
本书从Java语言的基本特点入手,全面介绍了Java语言的基本概念和编程方法,并深入介绍了Java语言的高级特性。内容涉及Java语言的基本语法、数据类型、类、异常、界面设计、小应用程序、I/O数据流、线程及网络功能等,基本覆盖了Java语言的大部分技术,是进一步使用Java语言进行技术开发的基础。
本书内容详尽,实例丰富,在每章最后均列出了若干习题,以方便教学。
与本书配套的《Java程序设计题解与上机指导》(第四版)中提供了本书的习题解答及有关上机 实验。
本书适合作为高等学校教材,也可作为专业人员的参考书。
作者简介
辛运帏,女,博士,教授。现为南开大学计算机与控制工程学院计算机与信息安全系教授。多年来一直从事程序语言设计、数据结构与算法等方向的教学和科研工作,主讲数据结构与算法、形式语言与自动机、计算方法等课程。主要研究领域为人工智能、电子商务、加密技术、智能信息系统等,已出版《Java语言程序设计》、《数据结构》、《离散数学》等相关教材。
目录
概述
1.1 什么是Java语言 1
1.1.1 Java语言的特点 1
1.1.2 Java的三层架构 3
1.1.3 Java语言的目标 4
1.1.4 Java虚拟机 4
1.1.5 垃圾收集 5
1.1.6 代码安全 5
1.2 一个基本的Java应用程序 8
1.2.1 开发环境的安装 8
1.2.2 Java应用程序 11
1.3 程序的编译和运行 13
1.3.1 编译 13
1.3.2 运行 13
1.4 常见错误 14
1.4.1 编译时错误 14
1.4.2 运行时错误 15
1.5 使用Java核心API文档 16
习题 19
标识符和数据类型
2.1 Java的基本语法单位 20
2.1.1 空白、注释及语句 20
2.1.2 关键字 22
2.1.3 标识符 23
2.2 Java编码体例 23
2.3 Java的基本数据类型 24
2.3.1 基本数据类型 24
2.3.2 类型转换 27
2.3.3 变量、说明和赋值 27
2.4 复合数据类型 29
2.4.1 概述 29
2.4.2 复合数据类型 30
2.5 类和对象的初步介绍 30
2.5.1 Java中的面向对象技术 30
2.5.2 Java中的类定义 32
2.5.3 Java中与OOP有关的关键字 33
2.5.4 类定义示例 36
2.5.5 创建一个对象 38
2.5.6 引用变量的赋值 41
2.5.7 默认初始化和null引用值 41
2.5.8 术语概述 42
习题 43
表达式和流程控制语句
3.1 表达式 45
3.1.1 操作数 45
3.1.2 运算符 49
3.1.3 表达式的提升和转换 53
3.1.4 数学函数 53
3.2 流控制 54
3.2.1 表达式语句 54
3.2.2 块 55
3.2.3 分支语句 55
3.2.4 循环语句 61
3.2.5 break与continue语句 63
3.2.6 注释语句 65
3.3 简单的输入输出 66
习题 69
数组、向量和字符串
4.1 数组 72
4.1.1 数组说明 72
4.1.2 创建数组 73
4.1.3 数组边界 76
4.1.4 数组元素的引用 76
4.1.5 多维数组 78
4.1.6 数组复制 83
4.2 Vector类 83
4.2.1 概述 84
4.2.2 Vector类的构造方法 84
4.2.3 Vector类对象的操作 85
4.2.4 Vector类中的其他方法 87
4.2.5 Vector类的使用举例 87
4.3 字符串类型 89
4.3.1 字符串简述 89
4.3.2 字符串说明及初始化 89
4.3.3 字符串处理 90
4.3.4 几个特殊处理 91
习题 93
进一步讨论对象和类
5.1 抽象数据类型 96
5.1.1 概述 96
5.1.2 定义方法 97
5.1.3 按值传送 100
5.1.4 重载方法名 102
5.2 对象的构造和初始化 103
5.2.1 显式成员初始化 103
5.2.2 构造方法 103
5.2.3 默认的构造方法 105
5.2.4 构造方法重载 106
5.2.5 finalize()方法 106
5.2.6 this引用 107
5.3 子类 107
5.3.1 is-a关系 108
5.3.2 extends关键字 109
5.3.3 单重继承 110
5.3.4 转换对象 112
5.3.5 方法自变量和异类集合 114
5.4 方法重写 115
5.4.1 方法重写示例 115
5.4.2 应用重写的规则 119
5.4.3 父类构造方法调用 120
5.5 多态 121
5.6 Java包 122
5.6.1 Java包的概念 123
5.6.2 import语句 123
5.6.3 目录层次关系及CLASSPATH环境变量 125
5.6.4 访问权限与数据隐藏 126
5.6.5 封装 128
5.7 类成员 128
5.7.1 类变量 128
5.7.2 类方法 131
5.8 关键字final 132
5.8.1 终极类 133
5.8.2 终极方法 133
5.8.3 终极变量 134
5.9 抽象类 135
5.10 接口 137
5.10.1 接口的定义 138
5.10.2 接口的实现 138
5.11 内部类 142
5.11.1 内部类的概念 142
5.11.2 匿名类 144
5.11.3 内部类的工作方式 145
5.12 包装类 145
习题 147
Java语言中的异常
6.1 异常 149
6.1.1 引出异常 149
6.1.2 异常的概念 151
6.1.3 异常分类 152
6.2 异常处理 154
6.2.1 try-catch块 154
6.2.2 再讨论前面的示例 157
6.2.3 公共异常 157
6.3 抛出异常 159
6.4 创建自己的异常 160
习题 162
Java语言的高级特性
7.1 泛型 163
7.1.1 泛型数据类型 163
7.1.2 接口中的泛型 163
7.1.3 泛型类 164
7.1.4 泛型方法 166
7.2 迭代器 167
7.2.1 迭代器的基本概念 167
7.2.2 接口Iterator 167
7.2.3 接口Iterable 169
7.2.4 使用迭代器示例 169
7.2.5 Iterable和for-each循环 173
7.3 克隆 173
习题 181
Java的图形用户界面设计
精彩书摘
第5章 进一步讨论对象和类
5.1 抽象数据类型
5.1.1 概述
绝大多数程序设计语言都预定义了一些基本数据类型,并相应定义了对那些类型的实例执行的操作。比如,对整型、实型等数值类型,有加、减、乘、除等操作;对逻辑类型,有逻辑与、逻辑或、逻辑非等操作。
对于用户自定义的复合数据类型,需要由程序员自己定义一些方法,对该类型的实例进行所需的操作。在早期许多程序设计语言中,复合数据类型及其相关操作的代码之间没有特殊的联系。比如,用户定义日期Date类型,并定义一个方法tomorrow(),它接收一个Date类型的参数,据此推断其后继日是哪一天。程序中定义变量的代码和tomorrow()方法的代码可以是分离的。
有些编程语言改进了这种处理方式,允许数据类型说明和欲对该类型变量进行操作的代码说明之间有较紧密的联系。通常数据类型加上其上的操作称为抽象数据类型。严格地说,抽象数据类型是指基于一个逻辑类型的数据类型以及这个类型上的一组操作。每一个操作由它的输入、输出定义。一个抽象数据类型的定义并不涉及它的实现细节,这些实现细节对于抽象数据类型的用户是隐藏的。
程序5-1给出了Date类型和tomorrow操作间建立的一种联系。
程序5-1
public class Date {
private int day, month, year;
Date ( int i, int j, int k) {
?day = i;
?month = j;
?year = k;
}
Date() { //这是个构造方法,显式初始化
?day = 1;
?month = 1;
?year = 1998;
}
Date ( Date d) { //这是带一个参数的构造方法
?day = d.day;
?month = d.month;
?year = d.year;
}
public Date tomorrow() {
?Date d = new Date(this); //说明一个对象
?d.day++;
?if (d.day > d.daysInMonth()){//daysInMonth()返回每个月中不同的天数
d.day = 1;
d.month ++;
if (d.month > 12) {
d.month = 1;
d.year ++;
}
}
return d;
}
}
名为tomorrow的代码段在Java中叫作方法,也可以称为成员函数。
在有些程序设计语言中,tomorrow()方法的定义或许会要求带一个参数,例如:
void tomorrow(Date d);
像Java这种支持抽象数据类型的语言在数据和操作间建立了较严格的联系,即把方法与数据封装在一个类中。在程序中不是把方法描述为对数据的操作,而是认为数据知道如何修改自己,然后要求数据对它自己执行操作。相应的语句如下:
Data d = new Date ( 20, 11, 1998); //已初始化的date对象
d.tomorrow();
这种写法表明,数据自己执行操作,tomorrow()方法作用于变量d。要访问Date类的域,可使用点操作符“.”:
d.day
它的意思是“d所指的Date对象中的day域”。类似地,d.tomorrow()是指“调用d所指的Date对象中的tomorrow()方法”,即对d对象进行tomorrow操作。
把方法看作是数据的特性,而不把数据与方法分开,这种思想是建立面向对象系统过程中的重要步骤。
5.1.2 定义方法
定义一个抽象数据类型后,还需要为这个类型的对象定义相应的操作,也就是方法。在Java中,方法的定义方式类似于其他语言,尤其与C和C++ 很类似。定义的一般格式如下:
<修饰符> <返回类型> <名字>(<参数列表>)<块>
其中:
* <名字>是方法名,它必须使用合法的标识符。
* <返回类型>说明方法返回值的类型。如果方法不返回任何值,它应该声明为void。Java对待返回值的要求很严格,方法返回值必须与所说明的类型相匹配。如果方法说明有返回值,比如说是int,那么方法从任何一个分支返回时都必须返回一个整数值。
* <修饰符>段可以含几个不同的修饰符,其中限定访问权限的修饰符包括public、protected和private。public访问修饰符表示该方法可以被任何其他代码调用,而private表示方法只能被类中的其他方法调用。关于其他修饰符的说明请参考 2.5.3节。
* <参数列表>是传送给方法的参数表。表中各元素间以逗号分隔,每个元素由一个类型和一个标识符组成。
* <块>表示方法体,是要实际执行的代码段。
在例5-1中,为程序2-4中的Customer类定义了方法setName()和setAddress()。
例5-1 方法定义示例。
void setName (String name) {
this.name = name;
}
String getAddress() {
return address;
}
下面在Date类中增加daysInMonth()和printDate()方法,以便完善Date类。
程序5-2
public class Date {
private int day, month, year;
Date ( int i, int j, int k) {
day = i;
month = j;
year = k;
}
Date() { //构造方法
day = 1;
month = 1;
year = 1998;
}
Date ( Date d) { //带一个参数的构造方法
day = d.day;
month = d.month;
year = d.year;
}
public void printDate() {
System.out.print(day + "/" + month + "/" + year);
}
public Date tomorrow() {
Date d = new Date(this);
d.day++;
if (d.day > d.daysInMonth()) {
d.day = 1;
d.month ++;
if (d.month > 12) {
d.month = 1;
d.year ++;
}
}
return d;
}
public int daysInMonth() {
switch (month) {
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
return 31;
case 4: case 6: case 9: case 11:
return 30;
default:
if ( year % 100 != 0 && year % 4 == 0 ) {
return 29;
}
else return 28;
……
前言/序言
现代科学技术的飞速发展,改变了世界,也改变了人类的生活。作为新世纪的大学生,应当站在时代发展的前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求。新世纪需要具有丰富的现代科学知识,能够独立完成面临的任务,充满活力,有创新意识的新型人才。
掌握计算机知识和应用,无疑是培养新型人才的一个重要环节。现 在计算机技术已深入到人类生活的各个角落,与其他学科紧密结合,成为推动各学科飞速发展的有力的催化剂。无论学什么专业的学生,都必须 具备计算机的基础知识和应用能力。计算机既是现代科学技术的结晶, 又是大众化的工具。学习计算机知识,不仅能够掌握有关知识,而且能培养人们的信息素养。这是高等学校全面素质教育中极为重要的一部分。
高校计算机基础教育应当遵循的理念是:面向应用需要;采用多种模式;启发自主学习;重视实践训练;加强创新意识;树立团队精神,培养信息素养。
计算机应用人才队伍由两部分人组成:一部分是计算机专业出身的计算机专业人才,他们是计算机应用人才队伍中的骨干力量;另一部分是各行各业中应用计算机的人员。这后一部分人一般并非计算机专业毕业,他们人数众多,既熟悉自己所从事的专业,又掌握计算机的应用知识,善于用计算机作为工具解决本领域中的任务。他们是计算机应用人才队伍中的基本力量。事实上,大部分应用软件都是由非计算机专业出身的计算机应用人员研制的,他们具有的这个优势是其他人难以代替的。从这个事实可以看到在非计算机专业中深入进行计算机教育的必要性。
非计算机专业中的计算机教育,无论目的、内容、教学体系、教材、教学方法等各方面都与计算机专业有很大的不同,绝不能照搬计算机专业的模式和做法。全国高等院校计算机基础教育研究会自1984年成立以来,始终不渝地探索高校计算机基础教育的特点和规律。2004年,全国高等院校计算机基础教育研究会与清华大学出版社共同推出了《中国高等院校计算机基础教育课程体系2004》(简称CFC2004);2006年、2008年又共同推出了《中国高等院校计算机基础教育课程体系2006》(简称CFC2006)及《中国高等院校计算机基础教育课程体系2008》(简称CFC2008),由清华大学出版社正式出版发行。
??1988年起,我们根据教学实际的需要,组织编写了“计算机基础教育丛书”,邀请有丰富教学经验的专家、学者先后编写了多种教材,由清华大学出版社出版。丛书出版后,迅速受到广大高校师生的欢迎,对高等学校的计算机基础教育起了积极的推动作用。广大读者反映这套教材定位准确,内容丰富,通俗易懂,符合大学生的特点。
1999年,根据新世纪的需要,在原有基础上组织出版了“新世纪计算机基础教育丛书”。由于内容符合需要,质量较高,被许多高校选为教材。丛书总发行量1000多万册,这在国内是罕见的。最近,我们又对丛书作了进一步的修订,根据发展的需要,增加了新的书目和内容。本丛书有以下特点:
(1)内容新颖。根据21世纪的需要,重新确定丛书的内容,以符合计算机科学技术的发展和教学改革的要求。本丛书除保留了原丛书中经过实践考验且深受群众欢迎的优秀教材外,还编写了许多新的教材。在这些教材中反映了近年来迅速得到推广应用的一些计算机新技术,以后还将根据发展不断补充新的内容。
(2)适合不同学校组织教学的需要。本丛书采用模块形式,提供了各种课程的教材,内容覆盖了高校计算机基础教育的各个方面。丛书中既有理工类专业的教材,也有文科和经济类专业的教材;既有必修课的教材,也包括一些选修课的教材。各类学校都可以从中选择到合适的教材。
(3)符合初学者的特点。本丛书针对初学者的特点,以应用为目的,以应用为出发点,强调实用性。本丛书的作者都是长期在第一线从事高校计算机基础教育的教师,对学生的基础、特点和认识规律有深入的研究,在教学实践中积累了丰富的经验。可以说,每一本教材都是他们长期教学经验的总结。在教材的写法上,既注意概念的严谨和清晰,又特别注意采用读者容易理解的方法阐明看似深奥难懂的问题,做到例题丰富,通俗易懂,便于自学。这一点是本丛书一个十分重要的特点。
(4)采用多样化的形式。除了教材这一基本形式外,有些教材还配有习题解答和上机指导,并提供电子教案。
总之,本丛书的指导思想是内容新颖、概念清晰、实用性强、通俗易懂、教材配套。简单概括为:“新颖、清晰、实用、通俗、配套”。我们经过多年实践形成的这一套行之有效的创作风格,相信会受到广大读者的欢迎。
本丛书多年来得到了各方面人士的指导、支持和帮助,尤其是得到了全国高等院校计算机基础教育研究会的各位专家和各高校老师们的支持和帮助,我们在此表示由衷的感谢。本丛书难免有不足之处,希望得到广大读者的批评指正。
丛 书 主 编
全国高等院校计算机基础教育研究会荣誉会长
谭 浩 强
·II·
·I·
Java
语言之所以长盛不衰,一是其众多技术特点与现今的应用十分合拍,可以覆盖大部分需求;二是因为不断有新版本问世,完善了Java语言自身的功能。有了这两点,Java语言成为程序员首选的程序设计开发工具就顺理成章了。
现在越来越多的高等学校开设了Java语言程序设计这门课程,国内外已经出版了较多的教材。针对Java语言的教学目的,结合国内教学的特点,我们重新编写了《Java程序设计》一书,并配套编写了《Java程序设计题解与上机指导》。承蒙读者的厚爱,这本书的前三版已经被多所大学选作教材。
在第三版的基础上,本版做了一些调整。修改的内容主要集中在以下五方面。
(1)根据实际情况,重新编写了JDK的安装过程部分。
(2)重点调整了第5章的内容。有些内容在前几版都只停留在概念介绍层面,第四版中扩展为一节,例如多态。同时,引出了动态绑定等概念。
(3)完善了异常的介绍。包括异常的分类、异常的处理过程等,帮助读者分清应该处理哪类异常,哪类异常应该留给系统处理或是由其他类 处理。
(4)增加了Java高级特性介绍,包括泛型、迭代器及克隆。这些实用性很强的技术,在编写应用程序时很有用。本书使用一系列示例进行 说明。
(5)修正了一些错误和不当之处。
其他各章的结构,与第三版基本一致。
本书从Java语言的基本特点入手,详细介绍了Java语言的基本概念和编程方法,帮助读者深入了解Java的高级特性。全书分为13章,涉及Java的基本语法、数据类型、类、异常、界面设计、小应用程序、I/O数据流、线程及网络功能等内容,基本覆盖了Java的大部分技术,是进一步使用Java进行技术开发的基础,愿本书能成为读者进入Java殿堂的铺路石。
作为教材,每章的最后列出若干习题,供读者参考。本书不仅适合Java语言的初学者使用,也可作为专业人员的参考书。
计算机技术是不断发展、不断完善的技术,Java语言也是如此。在本书出版的过程中,Java语言仍没有停止它完善的过程。本书中有些内容是以目前的版本为标准,当推出更高的Java版本时,读者应参考这些新标准。
在编写过程中,得到了南开大学信息技术科学学院卢桂章、陈有祺、刘璟、周玉龙、朱耀庭等教授的亲切关怀和悉心指导。在此表示深深的感谢。我们非常感谢清华大学出版社为我们提供了这个难得的机会,也同样感谢读者在众多Java书中选中本书。
本书由辛运帏、饶一梅编写。由于作者的水平有限,书中难免有错误和不妥之处,恳请广大读者特别是同行专家批评指正。感谢您的指导,这是我们继续努力的源泉。
编者
于南开大学津南校区