第1章 Java入门 1
1.1 计算机语言发展史及未来方向 1
1.1.1 计算机已经成为人类大脑的延伸 1
1.1.2 算法是计算机的“灵魂”,
编程语言是塑造计算机“灵魂”
的工具 2
1.1.3 为什么担心软件开发人才饱和是
多余的 3
1.1.4 未来30年必将是软件人才的世界 3
1.2 常用的编程语言 4
1.3 Java语言介绍 6
1.3.1 Java发展简史 6
1.3.2 Java的核心优势 6
1.3.3 Java各版本的含义 7
1.3.4 Java的特性 7
1.3.5 Java应用程序的运行机制 9
1.3.6 JVM、JRE和JDK 9
1.4 Java开发环境搭建 10
1.4.1 JDK的下载和安装 10
1.4.2 环境变量Path的配置 12
1.4.3 JDK安装测试 13
1.5 建立和运行第一个Java程序 13
1.5.1 建立第一个Java程序 13
1.5.2 编译第一个程序时的常见错误 15
1.5.3 总结第一个Java程序 15
1.5.4 最常用的DOS命令 16
1.6 常用的Java开发工具 16
1.7 Eclipse使用10分钟入门 17
1.7.1 下载和安装Eclipse 17
1.7.2 在Eclipse中创建Java项目 18
1.7.3 使用Eclipse开发和运行Java
程序 20
1.8 30分钟完成桌球小游戏项目 22
本章总结 28
本章作业 28
第2章数据类型和运算符 30
2.1 注释 30
2.2 标识符 31
2.3 Java中的关键字/保留字 32
2.4 变量 32
2.4.1 变量的本质 32
2.4.2 变量的分类 33
2.5 常量 35
2.6 基本数据类型 36
2.6.1 整型 36
2.6.2 浮点型 37
2.6.3 字符型 39
目 录
实战Java
程序设计
VI 实战Java程序设计
2.6.4 布尔型 40
2.7 运算符 40
2.7.1 算术运算符 40
2.7.2 赋值及其扩展赋值运算符 41
2.7.3 关系运算符 42
2.7.4 逻辑运算符 42
2.7.5 位运算符 43
2.7.6 字符串连接符 43
2.7.7 条件运算符 43
2.7.8 运算符优先级问题 44
2.8 数据类型的转换 44
2.8.1 自动类型转换 45
2.8.2 强制类型转换 45
2.8.3 基本类型转换时的常见错误和
问题 46
2.9 简单的键盘输入和输出 46
本章总结 47
本章作业 48
第3章控制语句 50
3.1 条件判断结构 50
3.1.1 if单分支结构 51
3.1.2 if-else双分支结构 52
3.1.3 if-else if-else多分支结构 54
3.1.4 switch多分支结构 55
3.2 循环结构 57
3.2.1 while循环 57
3.2.2 do-while循环58
3.2.3 for循环 59
3.2.4 嵌套循环 62
3.2.5 break语句和continue语句 63
3.2.6 带标签的break语句和continue
语句 64
3.3 语句块 65
3.4 方法 65
3.5 方法的重载 67
3.6 递归结构 68
本章总结 70
本章作业 71
第4章 Java面向对象编程基础 74
4.1 面向过程和面向对象思想 74
4.2 对象的进化史 75
4.3 对象和类的概念 77
4.4 类和对象初步 77
4.4.1 第一个类的定义 78
4.4.2 属性(field成员变量) 78
4.4.3 方法 79
4.4.4 一个典型类的定义和UML图 79
4.5 面向对象的内存分析 80
4.6 对象的使用及内存分析 81
4.7 构造器 82
4.8 构造器的重载 83
4.9 垃圾回收机制 84
4.9.1 垃圾回收的原理和算法 84
4.9.2 通用的分代垃圾回收机制 85
4.9.3 JVM调优和Full GC 86
4.9.4 开发中容易造成内存泄露的
操作 86
4.10 this关键字 87
4.11 static关键字 89
4.12 静态初始化块 90
4.13 参数传值机制 91
4.14 包 92
4.14.1 package 92
4.14.2 JDK中的常用包 92
4.14.3 导入类 93
4.14.4 静态导入 94
本章总结 94
本章作业 95
第5章 Java面向对象编程进阶 97
5.1 继承 97
5.1.1 继承的实现 97
5.1.2 instanceof运算符 98
5.1.3 继承的使用要点 99
5.1.4 方法的重写 99
5.2 Object类100
VII 目 录
5.2.1 Object类的基本特性 100
5.2.2 toString方法 101
5.2.3 ==和equals方法102
5.3 super关键字 103
5.4 封装 104
5.4.1 封装的作用和含义 104
5.4.2 封装的实现——使用访问
控制符 106
5.4.3 封装的使用细节 109
5.5 多态 110
5.6 对象的转型112
5.7 final关键字113
5.8 抽象方法和抽象类 114
5.9 接口interface 115
5.9.1 接口的作用 115
5.9.2 定义和使用接口 116
5.9.3 接口的多继承 117
5.9.4 面向接口编程 118
5.10 内部类 119
5.10.1 内部类的概念 119
5.10.2 内部类的分类 120
5.11 字符串String 123
5.11.1 String基础 124
5.11.2 String类和常量池 124
5.11.3 阅读API文档 125
5.11.4 String类的常用方法 127
5.11.5 字符串相等的判断 129
5.12 设计模式相关知识 130
5.12.1 开闭原则 130
5.12.2 相关设计模式 130
本章总结 130
本章作业 132
第6章异常机制 136
6.1 导引问题 136
6.2 异常的概念 137
6.3 异常的分类 138
6.3.1 Error 138
6.3.2 Exception139
6.3.3 RuntimeException——运行时
异常 139
6.3.4 CheckedException——已检查
异常 143
6.4 异常的处理方式之一:捕获异常 143
6.5 异常的处理方式之二:声明异常
(throws子句) 145
6.6 自定义异常 146
6.7 如何利用百度解决异常问题 148
本章总结 148
本章作业 149
第7章数组 151
7.1 数组概述 151
7.2 创建数组和初始化 151
7.2.1 数组声明 151
7.2.2 初始化 153
7.3 常用数组操作 154
7.3.1 数组的遍历 154
7.3.2 for-each 循环 155
7.3.3 数组的复制 155
7.3.4 java.util.Arrays类 156
7.4 多维数组 158
7.5 用数组存储表格数据 160
7.6 冒泡排序算法 161
7.6.1 冒泡排序的基础算法 161
7.6.2 冒泡排序的优化算法 162
7.7 二分法检索 163
本章总结 165
本章作业 166
第8章常用类 168
8.1 基本数据类型的包装类 168
8.1.1 包装类的基本知识 168
8.1.2 包装类的用途 169
8.1.3 自动装箱和拆箱 170
8.1.4 包装类的缓存问题 172
VIII 实战Java程序设计
8.2 字符串相关类 174
8.2.1 String类 174
8.2.2 StringBuffer 和StringBuilder 176
8.2.3 不可变和可变字符序列使用
陷阱 178
8.3 时间处理相关类 179
8.3.1 Date时间类(java.util.Date) 179
8.3.2 DateFormat类和
SimpleDateFormat类 181
8.3.3 Calendar日历类 183
8.4 Math类186
8.5 File类 188
8.5.1 File类的基本用法 188
8.5.2 递归遍历目录结构和树状展现 191
8.6 枚举 192
本章总结 194
本章作业 194
第9章容器 197
9.1 泛型 198
9.1.1 自定义泛型 198
9.1.2 容器中使用泛型 198
9.2 Collection接口 199
9.3 List接口 200
9.3.1 List特点和常用方法 200
9.3.2 ArrayList的特点和底层实现 203
9.3.3 LinkedList的特点和底层实现 204
9.3.4 Vector 向量 205
9.4 Map接口 205
9.4.1 HashMap和HashTable 206
9.4.2 HashMap底层实现详解 207
9.4.3 二叉树和红黑二叉树 212
9.4.4 TreeMap 的使用和底层实现 215
9.5 Set接口 215
9.5.1 HashSet的基本应用 215
9.5.2 HashSet的底层实现 216
9.5.3 TreeSet 的使用和底层实现 217
9.6 Iterator接口 218
9.6.1 迭代器介绍 218
9.6.2 使用Iterator迭代器遍历容器元素
(List/Set/Map) 218
9.7 遍历集合的方法总结 220
9.8 Collections工具类 221
本章总结 222
本章作业 223
第10章输入与输出技术 226
10.1 基本概念和I/O入门 227
10.1.1 数据源 227
10.1.2 流的概念 227
10.1.3 第一个简单的I/O流应用程序 228
10.1.4 Java中流的概念细分 230
10.1.5 Java中I/O流类的体系 231
10.1.6 四大I/O抽象类 232
10.2 常用流详解 233
10.2.1 文件字节流 233
10.2.2 文件字符流 235
10.2.3 缓冲字节流 237
10.2.4 缓冲字符流 239
10.2.5 字节数组流 241
10.2.6 数据流 242
10.2.7 对象流 244
10.2.8 转换流 246
10.2.9 随意访问文件流 248
10.3 Java对象的序列化和反序列化 249
10.3.1 序列化和反序列化是什么 249
10.3.2 序列化涉及的类和接口 250
10.3.3 序列化与反序列化的步骤和
实例 250
10.4 装饰器模式构建I/O流体系 252
10.4.1 装饰器模式简介 252
10.4.2 I/O流体系中的装饰器模式 253
10.5 Apache IOUtils和FileUtils的
使用 253
10.5.1 Apache基金会介绍 254
10.5.2 FileUtils的妙用 254
10.5.3 IOUtils的妙用 258
IX 目 录
本章总结 259
本章作业 260
第11章多线程技术 262
11.1 基本概念 262
11.1.1 程序 262
11.1.2 进程 262
11.1.3 线程 263
11.1.4 线程和进程的区别 264
11.1.5 进程与程序的区别 264
11.2 Java中如何实现多线程 264
11.2.1 通过继承Thread类实现多线程265
11.2.2 通过Runnable接口实现多线程266
11.3 线程状态和生命周期 266
11.3.1 线程状态 266
11.3.2 终止线程的典型方式 267
11.3.3 暂停线程执行的常用方法 269
11.3.4 联合线程的方法 270
11.4 线程的基本信息和优先级别 272
11.4.1 获取线程基本信息的方法 272
11.4.2 线程的优先级 273
11.5 线程同步 274
11.5.1 什么是线程同步 274
11.5.2 实现线程同步 275
11.5.3 死锁及解决方案 277
11.6 线程并发协作(生产者-消费者
模式) 280
11.7 任务定时调度 284
本章总结 285
本章作业 286
第12章网络编程 289
12.1 基本概念 289
12.1.1 计算机网络 289
12.1.2 网络通信协议 290
12.1.3 数据封装与解封 291
12.1.4 IP地址与端口 293
12.1.5 URL 294
12.1.6 Socket 294
12.1.7 TCP协议和UDP协议 294
12.2 Java网络编程中的常用类 295
12.2.1 InetAddress 296
12.2.2 InetSocketAddress297
12.2.3 URL类 297
12.3 TCP通信的实现 298
12.4 UDP通信的实现 308
本章总结 313
本章作业 314
第13章 J20飞机游戏项目 316
13.1 简介 316
13.2 游戏项目基本功能的开发 316
13.2.1 使用AWT 技术画出游戏主窗口
(0.1版) 317
13.2.2 图形和文本绘制(0.2版) 319
13.2.3 ImageIO实现图片加载技术
(0.3版) 319
13.2.4 多线程和内部类实现动画
效果(0.4版) 321
13.2.5 双缓冲技术解决闪烁问题
(0.4) 324
13.2.6 GameObject类设计(0.5版)325
13.3 飞机类设计(0.6版) 327
13.3.1 键盘控制原理 328
13.3.2 飞机类:增加操控功能 328
13.3.3 主窗口类:增加键盘监听 329
13.4 炮弹类设计(0.7版) 330
13.4.1 炮弹类的基本设计 330
13.4.2 炮弹任意角度飞行路径 331
13.4.3 容器对象存储多发炮弹 331
13.5 碰撞检测技术(0.8版) 332
13.5.1 矩形检测原理 333
13.5.2 炮弹和飞机碰撞检测 333
13.6 爆炸效果的实现(0.9版) 334
13.6.1 爆炸类的基本设计 335
13.6.2 主窗口类创建爆炸对象 335
13.7 其他功能(1.0版) 337
13.7.1 计时功能 337
X 实战Java程序设计
13.7.2 学员开发Java基础小项目案例展示
和说明 338
第14章 GUI编程——Swing基础 341
14.1 AWT 简介 342
14.2 Swing简介 342
14.2.1 javax.swing.JFrame 343
14.2.2 javax.swing.JPanel 347
14.2.3 常用基本控件 349
14.2.4 布局管理器 352
本章总结 357
本章作业 358
第15章事件模型 359
15.1 事件模型简介及常用事件类型 359
15.1.1 事件控制的过程 359
15.1.2 ActionEvent事件 361
15.1.3 MouseEvent事件364
15.1.4 KeyEvent事件 366
15.1.5 WindowEvent 事件 366
15.2 事件处理的实现方式 367
15.2.1 使用内部类实现事件处理 367
15.2.2 使用适配器实现事件处理 369
15.2.3 使用匿名内部类实现事件
处理 372
本章总结 380
本章作业 380
第16章 Swing中的其他控件 382
16.1 单选按钮控件(JRadioButton) 382
16.2 复选框控件(JCheckBox)385
16.3 下拉列表控件(JComboBox) 386
16.4 表格控件(JTable) 389
16.4.1 JTable 的简单应用 390
16.4.2 DefaultTableModel 393
16.5 用户注册案例 396
本章总结 402
本章作业 402
第17章反射机制 404
17.1 动态语言 404
17.2 反射机制的本质和Class类 404
17.2.1 反射机制的本质 405
17.2.2 java.lang.Class类406
17.3 反射机制的常见操作 407
17.3.1 操作构造器(Constructor类) 408
17.3.2 操作属性(Field类) 409
17.3.3 操作方法(Method类) 410
17.4 反射机制的效率问题411
本章总结 412
本章作业 412
第18章核心设计模式 415
18.1 GoF 23设计模式简介 415
18.2 单例模式 416
18.2.1 饿汉式 417
18.2.2 懒汉式 417
18.2.3 静态内部类式 418
18.2.4 枚举式单例 419
18.2.5 四种单例创建模式的选择 419
18.3 工厂模式 420
18.4 装饰模式 422
18.5 责任链模式 425
18.6 模板方法模式(钩子方法) 429
18.7 观察者模式 431
18.8 代理模式(动态) 433
本章总结 437
本章作业 438
附录Java 300集大型教学视频
目录 440
实战Java
程序设计
案例目录
第1章 Java入门
【示例1-1】使用记事本开发第一个Java程序 13
【示例1-2】使用Eclipse开发Java程序 21
【示例1-3】桌球游戏代码——绘制窗口 23
【示例1-4】桌球游戏代码——加载图片 24
【示例1-5】桌球游戏代码——实现水平方向来回
飞行 26
【示例1-6】桌球游戏代码——实现任意角度
飞行 27
第2章 数据类型和运算符
【示例2-1】认识Java的三种注释类型 31
【示例2-2】合法的标识符 31
【示例2-3】不合法的标识符 31
【示例2-4】声明变量 33
【示例2-5】在一行中声明多个变量 33
【示例2-6】在声明变量的同时完成变量的初始化 33
【示例2-7】局部变量的声明 34
【示例2-8】实例变量的声明 34
【示例2-9】常量的声明及使用 35
【示例2-10】long类型常数的写法及变量的
声明 37
【示例2-11】使用科学记数法给浮点型变量
赋值 37
【示例2-12】float类型常量的写法及变量的声明 37
【示例2-13】浮点型数据的比较一 38
【示例2-14】浮点型数据的比较二 38
【示例2-15】使用BigDecimal进行浮点型数据的
比较 38
【示例2-16】字符型演示 39
【示例2-17】字符型的十六进制值表示
方法 39
【示例2-18】转义字符 39
【示例2-19】boolean类型演示 40
【示例2-20】一元运算符++与-- 41
【示例2-21】扩展运算符 41
【示例2-22】短路与和逻辑与 42
【示例2-23】左移运算和右移运算 43
【示例2-24】连接符“+” 43
【示例2-25】三目条件运算符 44
【示例2-26】自动类型转换特例 45
【示例2-27】强制类型转换 45
【示例2-28】强制类型转换特例 46
【示例2-29】类型转换常见问题一 46
【示例2-30】类型转换常见问题二 46
【示例2-31】使用Scanner获取键盘输入 46
第3章 控制语句
【示例3-1】if单分支结构 51
【示例3-2】if-else双分支结构 52
第6章异常机制
【示例6-1】伪代码——使用if处理程序中可能
出现的各种情况 136
【示例6-2】异常的分析 137
【示例6-3】ArithmeticException异常——试图
除以0 139
【示例6-4】NullPointerException异常 140
【示例6-5】ClassCastException异常 141
【示例6-6】ArrayIndexOutOfBoundsException
异常 141
【示例6-7】NumberFormatException异常 142
【示例6-8】异常处理的典型代码(捕获异常) 145
【示例6-9】异常处理的典型代码(声明异常
抛出throws) 146
【示例6-10】自定义异常类 147
【示例6-11 】自定义异常类的使用 147
第7章数组
【示例7-1】数组的声明方式(以一维数组
为例) 151
【示例7-2】创建基本类型一维数组 152
【示例7-3】创建引用类型一维数组 152
【示例7-4】数组的静态初始化 153
【示例7-5】数组的动态初始化 153
【示例7-6】数组的默认初始化 154
【示例7-7】使用循环初始化和遍历数组 154
【示例7-8】使用增强for循环遍历数组155
【示例7-9】数组的复制 155
【示例7-10】使用Arrays类输出数组中的元素 156
【示例7-11 】使用Arrays类对数组元素进行
排序一 156
【示例7-12】使用Arrays类对数组元素进行
排序二(Comparable接口的应用)157
【示例7-13】使用Arrays类实现二分法查找法 158
【示例7-14】使用Arrays类对数组进行填充 158
【示例7-15】二维数组的声明 159
【示例7-16】二维数组的静态初始化 159
【示例7-17】二维数组的动态初始化 159
【示例7-18】获取数组长度 160
【示例7-19】使用二维数组保存表格数据 161
【示例7-20】冒泡排序的基础算法 162
【示例7-21】冒泡排序的优化算法 163
【示例7-22】二分法检索的基本算法 164
第8章常用类
【示例8-1】初识包装类 169
【示例8-2】包装类的使用 170
【示例8-3】自动装箱 171
【示例8-4】自动拆箱 171
【示例8-5】包装类空指针异常问题 171
【示例8-6】自动装箱与拆箱 172
【示例8-7】Integer类相关源码172
【示例8-8】IntegerCache类相关源码173
【示例8-9】包装类的缓存测试 173
【示例8-10】String类的简单使用 175
【示例8-11 】字符串常量拼接时的优化 175
【示例8-12】AbstractStringBuilder 部分源码176
【示例8-13】StringBuffer/StringBuilder 基本用法177
【示例8-14】String和StringBuilder在字符串频繁
修改时的效率测试 178
【示例8-15】Date类的使用180
【示例8-16】DateFormat类和SimpleDateFormat
类的使用 181
【示例8-17】时间格式字符的使用 182
【示例8-18】GregorianCalendar类和Calendar类
的使用 183
【示例8-19】可视化日历的编写 184
【示例8-20】Math类的常用方法186
【示例8-21】Random类的常用方法187
【示例8-22】使用File类创建文件188
【示例8-23】使用File类访问文件或目录属性189
【示例8-24】使用mkdir创建目录189
【示例8-25】使用mkdirs创建目录 190
【示例8-26】File类的综合应用190
【示例8-27】使用递归算法,以树状结构展示
目录树 191
【示例8-28】创建枚举类型 193
【示例8-29】枚举的使用 193
第9章容器
【示例9-1】泛型的声明 198
【示例9-2】泛型的应用 198
【示例9-3】泛型在集合中的使用 199
【示例9-4】List的常用方法201
【示例9-5】两个List之间的元素处理201
【示例9-6】List中操作索引的常用方法202
【示例9-7】Map接口中的常用方法206
【示例9-8】测试hash算法210
【示例9-9】HashSet的使用216
【示例9-10】TreeSet 和Comparable接口的使用 217
【示例9-11 】迭代器遍历List 218
【示例9-12】迭代器遍历Set 219
【示例9-13】迭代器遍历Map(一)219
【示例9-14】迭代器遍历Map(二)220
【示例9-15】遍历List方法一——普通for循环 220
【示例9-16】遍历List方法二——增强for循环
(使用泛型) 221
【示例9-17】遍历List方法三——使用Iterator
迭代器(1) 221
【示例9-18】遍历List方法四——使用Iterator
迭代器(2) 221
【示例9-19】遍历Set方法一——增强for循环 221
【示例9-20】遍历Set方法二——使用Iterator
迭代器 221
【示例9-21】遍历Map方法一——根据key获取
value 221
【示例9-22】遍历Map方法二——使用entrySet221
【示例9-23】Collections工具类的常用方法 222
第10章输入与输出技术
【示例10-1】使用流读取文件内容(不规范
的写法,仅用于测试) 228
【示例10-2】使用流读取文件内容(经典代码,
一定要掌握) 229
【示例10-3】将文件内容读取到程序中 233
【示例10-4】将字符串/字节数组的内容写入到
文件中 233
【示例10-5】利用文件流实现文件的复制 234
【示例10-6】使用FileReader与FileWriter 实现
文本文件的复制 236
【示例10-7】使用缓冲流实现文件的高效率
复制 237
【示例10-8】使用BufferedReader 与BufferedWriter
实现文本文件的复制 239
【示例10-9】简单测试ByteArrayInputStream 的
使用 241
【示例10-10】DataInputStream和DataOutputStream
的使用 242
【示例10-11 】ObjectInputStream和ObjectOutputStream
的使用 244
【示例10-12】使用InputStreamReader接收用户的
输入,并输出到控制台 247
【示例10-13】RandomAccessFile的应用 248
【示例10-14】将Person类的实例进行序列化
和反序列化 250
【示例10-15】装饰器模式演示 252
【示例10-16】读取文件内容,并输出到控制台上
(只需一行代码) 256
【示例10-17】复制目录,并使用FileFilter过滤
目录和以html结尾的文件257
【示例10-18】IOUtils的方法 258
第11章多线程技术
【示例11-1 】通过继承Thread类实现多线程 265
【示例11-2 】通过Runnable接口实现多线程 266
【示例11-3 】终止线程的典型方法(重要) 268
【示例11-4 】暂停线程的方法——sleep() 269
【示例11-5 】暂停线程的方法——yield() 269
【示例11-6 】线程的联合-join() 270
【示例11-7 】线程的常用方法一 272
【示例11-8 】线程的常用方法二 273
【示例11-9 】多线程操作同一个对象(未使用
线程同步) 274
【示例11-10 】多线程操作同一个对象(使用线程
同步) 276
【示例11-11 】死锁问题演示278
【示例11-12 】死锁问题的解决 279
【示例11-13 】生产者与消费者模式 281
【示例18-11 】责任链模式典型用法——抽象
处理者 427
【示例18-12】责任链模式典型用法——具体
处理者 427
【示例18-13】责任链模式的调用 429
【示例18-14】模板方法模式典型用法 430
【示例18-15】定义子类或者匿名内部类实现
调用模板方法 430
【示例18-16】观察者模式典型用法——目标
对象 432
【示例18-17】观察者模式典型用法——观察者 432
【示例18-18】观察者模式的调用 432
【示例18-19】动态代理模式的典型用法——定义
统一接口 435
【示例18-20】动态代理模式的典型用法——真正
的明星类 435
【示例18-21】动态代理模式的典型用法——
机制)435
【示例18-22】动态代理模式的调用 436