Java语言已成为软件设计开发者应掌握的一门基础语言。本书为Java课程设计指导用书,共分11章,具体内容包括:Java环境的安装与配置、Java语言编程的基础知识、Java语言中重要的类与对象、网页浏览器案例、成绩查询APP设计案例、消息推送APP设计案例、端口扫描器案例、聊天程序案例、中国象棋对弈系统案例、资产管理系统案例和人事管理系统案例。
本书以案例带动知识点的讲解,展示实际项目的设计思想和设计理念,使读者可以举一反三。本书每个实例各有侧重点,避免了实例罗列和知识点重复。本书选择目前流行的APP设计及高校课程设计的典型项目,并注重切合实际应用,使读者能够真正做到学以致用。
本书适合作为高等院校学生学习Java课程设计的教材,也可作为Java语言程序开发人员及Java编程爱好者的指导用书。
本书语言通俗,简明实用,并通过实例来解释相关的概念和方法,有助于读者理解和掌握Java语言编程方法。书中各个案例相互独立,均给出了详细的设计步骤,包括功能描述、理论基础、总体设计、代码实现、程序运行与发布等,而且代码都有详细的注释,便于读者阅读。
本书前两版受到了广泛欢迎,应广大读者的要求,作者于2015年进行了第3版修订。为了满足广大读者对当前流行的APP设计开发的需求,新版书中更新了原第5章(蜘蛛纸牌)和第6章(吃豆子游戏)两个案例,将其分别改为成绩查询APP和消息推送APP。其中,成绩查询APP设计结合当前校园信息化建设实际需求,详细讲解了如何利用移动客户端APP来查询学生的考试成绩;消息推送APP则结合当前常用的向移动客户端推送消息的实际应用需求,对如何利用第三方推送平台,从移动客户端"接收消息"、"打开链接"、"管理消息"等进行了详尽分析,对关键代码重点讲解。作者希望借助新增的案例,向读者讲解APP的设计方式与功能实现的方式,以达到举一反三的目的。
前 言
Java语言的出现迎合了人们对应用程序跨平台运行的需求,已成为软件设计开发者应掌握的一门基础语言,很多新的技术领域都涉及Java语言。目前无论是高校的计算机专业还是IT培训学校都将Java语言作为主要的教学内容之一,这对于培养学生的计算机应用能力具有重要的意义,掌握Java语言已经成为人们的共识。
在掌握了Java语言的基本知识之后,如何快速有效地提高Java语言编程技术成为大家普遍关注的问题。实践证明,案例教学是计算机语言教学最有效的方法之一。好的案例对理解知识和掌握应用方法十分重要。本书语言通俗,简明实用,并通过实例来解释相关的概念和方法,有助于读者理解和掌握Java语言编程方法。书中各个案例相互独立,均给出了详细的设计步骤,包括功能描述、理论基础、总体设计、代码实现、程序运行与发布等,而且代码都有详细的注释,便于读者阅读。
本书自2010年第2版出版以来,受到了广大读者的一致好评,有很多热心读者来电讨论书中的相关技术问题,并询问第3版的信息。应广大读者的要求,作者于2015年对本书又进行了第3版修订。为了满足广大读者对当前流行的APP设计开发的需求,新版书中更新了原第5章(蜘蛛纸牌)和第6章(吃豆子游戏)两个案例,将其分别改为成绩查询APP和消息推送APP。其中,成绩查询APP设计结合当前校园信息化建设实际需求,详细讲解了如何利用移动客户端APP来查询学生的考试成绩;消息推送APP则结合当前常用的向移动客户端推送消息的实际应用需求,对如何利用第三方推送平台,从移动客户端"接收消息"、"打开链接"、"管理消息"等进行了详尽分析,对关键代码重点讲解。作者希望借助新增的案例,向读者讲解APP的设计方式与功能实现的方式,以达到举一反三的目的。
在此,再次感谢广大读者对本书的支持,也感谢热心读者对本书再版提出的意见和建议,希望大家今后一如既往地提出宝贵意见。谢谢!
本书所有案例程序都在JDK 1.6运行环境下及AndroidStudio(Android 4.0.3)环境下调试通过。本书代码仅供学习Java语言使用,欢迎读者对不妥之处提出批评和建议。
本书由张建军、吴启武主编,同时参与编写的人员还有张广彬、王小宁、高静、张红朝、余健。由于作者水平有限,书中难免存在疏漏和不足,恳请读者提出宝贵意见,使本书再版时得以改进和完善。
编 者
第1章 Java概述 1
1.1 Java语言简介 2
1.1.1 Java语言的历史 2
1.1.2 Java语言的特点 2
1.2 Java平台 4
1.2.1 Java平台简介 4
1.2.2 Java虚拟机 4
1.3 Java运行环境的建立 5
1.3.1 JDK简介 5
1.3.2 JDK的安装 5
1.3.3 JDK运行环境的设置 5
1.3.4 JDK包含的常用工具 7
1.4 JDK 1.6的新特性 8
1.5 Java程序的编写、编译和运行 10
1.5.1 Java程序的编译与运行 10
1.5.2 简单的Java程序举例 11
1.5.3 Java的注释 13
第2章 Java程序设计基础 15
2.1 Java的基本数据类型 16
2.1.1 数据类型 16
2.1.2 标识符与关键字 16
2.1.3 常量 17
2.1.4 变量 19
2.2 Java运算符与表达式 21
2.2.1 算术运算符 21
2.2.2 关系运算符 21
2.2.3 布尔运算符 22
2.2.4 位运算符 22
2.2.5 赋值运算符 22
2.2.6 条件运算符 24
2.2.7 表达式和运算符的优先级 24
2.3 Java控制语句 25
2.3.1 选择结构 25
2.3.2 循环结构 26
2.3.3 跳转结构 28
2.4 字符串 29
2.4.1 String类 30
2.4.2 StringBuffer类 31
2.5 数组 32
2.5.1 一维数组 32
2.5.2 多维数组 34
2.5.3 对象数组 35
第3章 类和对象 37
3.1 类的定义与使用 38
3.1.1 类的定义 38
3.1.2 构造函数 41
3.1.3 对象的使用 42
3.1.4 访问控制 43
3.2 继承 44
3.3 重载 45
3.3.1 方法的重载 45
3.3.2 构造函数的重载 47
3.3.3 super与this 48
3.4 包与接口 51
3.4.1 包与引用包 51
3.4.2 ClassPath环境变量 52
3.4.3 接口 52
3.5 Java的垃圾回收与析构 53
3.6 抽象类与内部类 54
3.6.1 抽象类 54
3.6.2 内部类 54
3.7 基础类的使用 55
3.7.1 基础类库 55
3.7.2 Math类 59
3.7.3 时间与日期的处理 61
第4章 网页浏览器的开发 67
4.1 功能描述 68
4.2 理论基础 68
4.2.1 事件处理 68
4.2.2 Swing相关组件 70
4.2.3 输入输出 76
4.3 总体设计 80
4.4 代码实现 81
4.4.1 WebBrowser.java 81
4.4.2 ViewSourceFrame.java 91
4.5 程序的运行与发布 92
4.5.1 运行程序 92
4.5.2 发布程序 94
第5章 成绩查询APP设计 95
5.1 功能描述 96
5.2 理论基础 96
5.2.1 Http请求 96
5.2.2 Wireshark软件的使用 97
5.2.3 数据解析 98
5.2.4 SimpleAdapter的应用 100
5.3 总体设计 101
5.3.1 登录教务系统 101
5.3.2 获取并显示成绩 101
5.4 代码实现 102
5.4.1 登录功能 102
5.4.2 获取成绩 109
5.4.3 显示成绩 117
5.5 程序的运行与发布 122
5.5.1 运行程序 122
5.5.2 发布程序 124
第6章 消息推送APP设计 127
6.1 功能描述 128
6.2 理论基础 128
6.2.1 第三方消息推送平台 128
6.2.2 AppKey申请 128
6.2.3 导入SDK开发包 129
6.2.4 配置 AndroidManifest.xml 130
6.2.5 SQLite 132
6.2.6 BaseAdapter的应用 133
6.3 总体设计 134
6.3.1 数据库设计 134
6.3.2 消息处理 134
6.3.3 消息管理 134
6.4 代码实现 135
6.4.1 数据库设计 135
6.4.2 消息处理 135
6.4.3 消息管理 138
6.5 程序的运行与发布 149
6.5.1 运行程序 149
6.5.2 发布程序 152
第7章 基于多线程的端口扫描器 153
7.1 功能描述 154
7.2 理论基础 154
7.2.1 布局管理器
(LayoutManager) 154
7.2.2 多线程 157
7.2.3 端口扫描 161
7.3 总体设计 162
7.4 代码实现 163
7.4.1 TCPThread.java 163
7.4.2 ThreadScan.java 167
7.4.3 AboutDialog.java 178
7.5 程序的运行与发布 179
7.5.1 运行程序 179
7.5.2 发布程序 181
第8章 Java聊天室 183
8.1 功能描述 184
8.2 理论基础 184
8.2.1 套接字通信 184
8.2.2 套接字客户端 185
8.2.3 套接字服务端 186
8.2.4 数据报通信 186
8.2.5 URL与URLConnection 187
8.2.6 Java链表的实现 189
8.3 总体设计 190
8.3.1 聊天室服务器端的设计 190
8.3.2 聊天室客户端设计 191
8.4 代码实现 191
8.4.1 聊天室服务器端代码的
实现 191
8.4.2 聊天室客户端代码的实现 211
8.5 程序的运行与发布 228
8.5.1 聊天室服务器端程序的
运行 228
8.5.2 聊天室服务器端程序的
发布 230
8.5.3 聊天室客户端程序的运行 231
8.5.4 聊天室客户端程序的发布 232
第9章 中国象棋对弈系统 233
9.1 功能描述 234
9.2 理论基础 234
9.2.1 中国象棋简介 234
9.2.2 中国象棋走子规则 234
9.2.3 中国象棋吃子规则 234
9.3 总体设计 235
9.4 代码实现 235
9.4.1 引用类包及类的定义 235
9.4.2 图形用户界面模块 236
9.4.3 按钮的操作模块 240
9.4.4 棋子的操作模块 243
9.4.5 棋子的移动规则类模块 250
9.5 程序的运行与发布 280
9.5.1 运行程序 280
9.5.2 发布程序 282
第10章 资产管理系统 283
10.1 需求分析 284
10.2 系统设计 284
10.2.1 结构设计 284
10.2.2 功能结构 285
10.2.3 功能流程及工作流描述 285
10.3 数据库设计 287
10.4 详细设计 288
10.4.1 资产管理系统主界面模块 288
10.4.2 系统管理模块 295
10.4.3 资产信息管理模块 302
11.4.4 人员信息管理模块 319
11.4.5 资产操作管理模块 335
11.4.6 信息查询模块 355
11.4.7 数据库操作模块 363
10.5 程序的运行与发布 395
10.5.1 配置数据源 395
10.5.2 运行程序 397
10.5.3 发布程序 397
第11章 人事管理系统 399
11.1 需求分析 400
11.2 系统设计 401
11.2.1 结构设计 401
11.2.2 功能结构 401
11.2.3 功能流程及工作流描述 401
11.3 数据库设计 403
11.4 详细设计 404
11.4.1 人事管理系统主界面模块 404
11.4.2 基础信息管理模块 410
11.4.3 人员调动管理模块 435
11.4.4 人员考核管理模块 443
11.4.5 劳资管理模块 450
11.4.6 数据库操作模块 458
11.5 程序的运行与发布 483
11.5.1 配置数据源 483
11.5.2 运行程序 484
11.5.3 发布程序 484
参考文献 486
第2章 Java程序设计基础
本章主要介绍基本数据类型、运算符、控制语句、字符串及数组等Java程序设计所要掌握的基础知识。基本数据类型部分主要介绍Java中的数据类型、标识符与关键字、常量与变量等内容;运算符与表达式部分主要介绍算术运算符、位运算符、布尔运算符、赋值运算符、关系运算符、条件运算符及它们的优先级;控制语句部分主要介绍选择结构、循环结构及跳转结构所使用的各种语句及其特性;字符串部分主要介绍String类与StringBuffer类的使用方法与注意事项;最后介绍数组概念及一维数组、多维数组及对象数组的定义与使用。
2.1 Java的基本数据类型
数据类型是程序设计中最基本的概念。Java语言中的数据类型非常丰富,所有变量都必须属于某一个数据类型。不同的数据类型所存储的值的种类,以及可能进行的操作方式都是不同的。本节主要讲解Java的基本数据类型,常量、变量的基本概念,以及变量的定义方法。
2.1.1 数据类型
Java的数据类型可以分为两大类:基本数据类型与复合数据类型。其中,基本数据类型包括整型、浮点型、布尔型和字符型;复合数据类型包括数组、接口和类,如图2.1所示。
图2.1 Java的数据类型
2.1.2 标识符与关键字
在程序设计语言中,用来标识成分(如类、对象、变量、常量、方法和参数名称等)存在与唯一性的名字,称为标识符。标识符是由字母、下划线或美元符号$开头,后接若干任意字符的字符串。在程序设计中,程序设计者可以根据需要,自由地确定简单且易于理解的标识符,但同时也应该遵循一定的语法规则。
Java对标识符定义的规定如下。
* 标识符可以由字母、数字、下划线(_)或美元符号($)组成。
* 标识符必须以字母、下划线(_)或美元符号($)开头。
* 标识符的长度不限,但在实际应用中不宜过长。
* Java语言中的标识符区分大小写,例如Myworld与myworld是不同的。
* 标识符不能与关键字(保留字)同名。
下面举例说明。
合法标识符:xyz、_xyz、$xyz。
非法标识符:5xyz(首字符不能为数字)、Xyz@(含有非法字符)、if(关键字)。
在Java语言中,有一部分标识符被确定为关键字(保留字),因为在程序设计中,该部分标识符已经被使用或者被赋予特定意义。表2.1为Java语言中的关键字。
2.1.3 常量
常量是指在程序运行过程中固定不变的量。常量共包含以下6类。
1.整型常量
整型常量包括4种类型:int、long、short、byte。4种类型的取值范围如表2.2所示。
整数类型的文字可使用十进制、八进制和十六进制表示。首位为"0"表示八进制的数值;首位为"0x"表示十六进制的数值。请看下面的例子:
8 表示十进制值8
075 表示八进制数值75(也就是十进制数61)
0x9ABC 表示十六进制的数值9ABC(也就是十进制数39612)
整数默认为int类型,如在其后有一个字母"L"则表示一个long值(也可以用小写字母"l")。由于小写字母"l"与数字"1"容易混淆,因而,建议大家采用大写字母"L"。
上面所说的整数long的形式如下:
8L 表示十进制值8,是一个long值
075L 表示八进制数值75,是一个long值
0x9ABCL 表示十六进制的数值9ABC,是一个long值
2.浮点型常量
为了提高计算的准确性,由此引入了浮点型数据。浮点型数据包括两种:单精度和双精度,取值范围如表2.3所示。
表2.3 浮点型数据的取值范围
数据类型
所占字节
表示范围
float(单精度)
4
-3.4E38~3.4E38
double(双精度)
8
-1.7E308~1.7E308
如果不明确指明浮点数的类型,浮点数默认为double。下面是几个浮点数:
3.14159 (double型浮点数)
2.08E25 (double型浮点数)
6.56f (float型浮点数)
在两种类型的浮点数中,double类型的浮点数具有更高的精度。
3.字符型常量
字符型常量是由一对单引号包含起来的单个字符,例如'a','2'。Java中的字符型数据是16位无符号型数据,它表示Unicode集,而不仅仅是ASCII集。
与C语言类似,Java也提供转义字符,以反斜杠(\)开头,将其后的字符转变为另外的含义。表2.4列出了Java中的转义字符。
4.字符串型常量
字符串型常量是由一对双引号包含的,由0个或多个字符组成的一个字符序列。
5.布尔型常量
布尔型常量只能取值为true和false,其中true表示逻辑真,false表示逻辑假。
6.null常量
null常量只有一个值,用null表示为空。
2.1.4 变量
变量就是在程序运行过程中值可以变化的量。变量名是用户为变量定义的标识符,变量的值存储在系统为变量分配的存储单元中。Java变量的类型包括:整型变量、浮点型变量、布尔型变量、字符型变量、字符串型变量、数组变量、对象(引用)变量等。
1.变量的定义
在Java程序设计过程中,变量需要先定义后使用。定义变量的时候需要确定变量的类型和变量的标识符。
声明Java变量的语法格式如下:
type var1[,ver2][,...]
type var1[=init1][,var2[=init2],...]
其中,type为变量类型名,var为变量名,init为初始值,方括号中的内容为可选项。例如:
int a = 1, b, c; //定义整型变量a、b、c,并为a赋初值1
float f = 1.12f; //定义单精度浮点型变量f,并赋初值
double d = 32.34; //定义双精度浮点型变量d,并赋初值
char char1 = 'c'; //定义字符型变量char1,并赋初值
String s = "abc"; //定义字符串型变量s,并赋初值
boolean b = true; //定义布尔型变量b,并赋初值
2.变量基本数据类型的转换
在Java程序中,将一种数据类型的常数或变量转换为另外一种数据类型,称为类型转换。当多种数据类型的数据混合运算时,不同类型的数据必须先转化为同一种数据类型。类型转换有两种:自动类型转换(或称隐含类型转换)和强制类型转换。
1) 自动类型转换
自动类型转换遵循的规则是把低精度类型转换为高精度类型。当把占用位数较短的数据转化成占用位数较长的数据时,Java执行自动类型转换,不需要在程序中做出特别的 说明。
例如,下面的语句把int型数据赋值给long型数据,在编译时不会发生任何错误:
int i = 10;
long j = i;
假若对主数据类型执行任何算术运算或按位运算,在正式执行运算之前,"比int小"的数据(char、byte、short)会自动转换成int,这样一来,最终生成的值就是int类型。
整型、实型、字符型数据同样可以混合运算。运算中,不同类型的数据先转化为同一种类型,然后进行运算,转换遵循从低级到高级的原则。通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。例如:若将一个float值与一个double值相乘,结果就是double值;如将一个int值和一个long值相加,则结果为long值。
2) 强制类型转换
当两种类型彼此不兼容,或者目标类型的取值范围小于源类型时,就必须进行强制类型转换。强制类型转换的语法如下:
目标类型 变量 = (目标类型)值
经过强制类型转换,将得到一个在"()"中声明的数据类型的数据,该数据是从指定变量所包含的数据转换而来的。例如:
int x,y;//定义int型变量x,y
byte z;//定义byte型变量z
//强制类型转换
x = (int)22.11 + (int)11.22;
y = (int)'a' + (int)'b';
z = (byte)(x+y);
3.变量的作用域
变量的作用域是指可访问该变量的代码域。声明一个变量的同时也就指明了变量的作用域。按作用域来分,变量可以有下面几种:局部变量、类变量、方法参数、例外处理参数。局部变量在方法或方法的部分代码中声明,其作用域为它所在的代码块(整个方法或方法中的某块代码)。
Java语言用大括号将若干语句组成语句块,变量的有效范围是声明它的语句所在的语句块,一旦程序的执行离开了这个语句块,将无法继续调用其中的变量。例如:
if (...) {
int i = 25;
...
}
System.out.println("The value of i = " + i); // 错误
最后一行无法进行汇编是因为变量i已经超出了作用域。i的作用域是"{"和"}"之间的代码块。在该代码块外,变量i就不存在了,所以无法调用。改正的方法是可以将变量的声明移到if语句块的外面,或者是将println方法调用移动到if语句块中。
2.2 Java运算符与表达式
2.2.1 算术运算符
算术运算符分为单目运算符和双目运算符,具体运算符如表2.5所示。
在算术运算中,有以下值得注意的地方。
* 算术运算符的总体原则是先乘除、再加减,括号优先。
* 整数除法会直接砍掉小数,而不是进位。
* 取模运算符的操作数可以为浮点数。如:37.2%10=7.2。这点与C语言不同。
* Java也可用一种简写形式进行运算,并同时进行赋值操作。例如,为了将10与变量x相加,并将结果赋给x,可用x+=10。
* Java对加运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"def",得到串"abcdef"。
* 前缀++、--与后缀++、--的区别如下。
* ++i(前缀++)在使用i之前,使i的值加1,因此执行完++i后,整个表达式和i的值均为i+1;i++(后缀++)在使用i之后,使i的值加1,因此执行完i++后,整个表达式的值为i,而i的值变为i+1。
* --i(前缀--)在使用i之前,使i的值减1,因此执行完--i后,整个表达式和i的值均为i-1;i--(后缀--)在使用i之后,使i的值减1,因此执行完i--后,整个表达式的值为i,而i的值变为i-1。