第1章 Java语言初体验 1
1.1学习Java的优势 2
1.1.1排名第一的编程语言 2
1.1.2良好的就业前景 2
1.2学习Java需要了解的那些事 3
1.2.1 Java语言的发展历史 3
1.2.2 Java的特点 4
1.2.3 Java的平台无关性 5
1.3 Java的运行机制 6
1.3.1高级语言的运行机制 6
1.3.2 Java的运行机制 7
1.3.3 Java虚拟机——JVM 8
1.4开发前的准备 9
1.4.1安装JDK 9
1.4.2设置环境变量 13
1.4.3 JRE和JDK是有区别的 14
1.4.4困扰初学者的环境变量问题 14
1.5体验第一个Java程序 15
1.5.1编辑Java源代码 15
1.5.2编译Java程序 16
1.5.3运行Java程序 17
1.5.4分析Java程序的运行过程 17
1.6初学者应该明白的几个问题 18
1.6.1独特的垃圾回收机制 18
1.6.2对学习者的几条建议 19
第2章 探索Java敏捷学习之道 21
2.1究竟要学习什么 22
2.2学习编程的正确观念 22
2.3将面向对象贯穿全书 23
2.3.1什么是面向对象 23
2.3.2面向对象的几个基本特性 24
2.3.3 Java的面向对象 24
2.3.4 Java的面向对象特性 25
2.4初学者应该注意的问题 26
2.4.1需要遵循源文件命名规则 26
2.4.2不要忽视系统文件的扩展名 26
2.4.3时刻注意大小写的问题 27
2.4.4必须有main()方法 27
2.4.5注意空格带来的麻烦 27
2.5使用Java IDE工具能事半功倍 28
2.5.1到底用不用IDE工具 28
2.5.2最受欢迎的工具——Eclipse 28
2.5.3 Sun公司推出的工具——NetBeans 34
2.5.4一度很“火”的商业工具——JBuilder 35
第3章 速成Java的基本语法 37
3.1快速学习语法的秘诀 38
3.2变量和常量 38
3.2.1不可变的量叫常量 39
3.2.2定义常量时的注意事项 40
3.2.3可以变化的量叫变量 40
3.3数据类型一通则百通 42
3.3.1简单数据类型值的范围 42
3.3.2字符型 43
3.3.3整型 44
3.3.4浮点型 44
3.3.5布尔型 45
3.4 if语句 46
3.4.1简单if语句 46
3.4.2通过if语句的延伸用法体验if-else语句的意义 47
3.4.3 if语句可以有多个条件判断 48
3.5 switch语句 49
3.5.1 switch语句的基本用法 49
3.5.2使用switch语句时应该注意的事项 49
3.5.3如果没有break 50
3.5.4如果case没有执行语句 50
3.5.5如果default不在末尾 51
3.6需要正确使用条件语句 51
3.6.1参数case和参数switch的值要相等 51
3.6.2在使用if语句时要按照逻辑顺序编码 52
3.6.3理解switch语句的执行顺序 52
3.7循环语句 53
3.7.1 for循环 53
3.7.2有多个表达式的for循环 54
3.7.3 for语句可以嵌套 55
3.7.4 while循环语句 56
3.7.5可以联合使用if语句和while循环 57
3.7.6 do-while循环语句 57
3.7.7不要忘记分号 58
3.8跳转语句 58
3.8.1使用break语句 58
3.8.2使用return语句返回一个值 59
3.8.3使用continue语句实现跳转 60
3.9一维数组 60
3.9.1声明一维数组 60
3.9.2创建一维数组 61
3.9.3一维数组的初始化 62
3.10二维数组 63
3.10.1声明二维数组 63
3.10.2创建二维数组 63
3.10.3二维数组的初始化 64
3.11 三维数组 65
3.11.1声明三维数组 65
3.11.2三维数组的初始化 65
3.12复制数组中的数据 66
3.13比较两个数组中的数据 67
3.14搜索数组中的元素 68
3.15排序数组 68
3.16深入理解数组 69
3.16.1可以任意伸缩数组长度的动态数组 69
3.16.2 foreach循环 70
3.17初学者应该明白的几个问题 71
3.17.1 char中的单引号和int的提升处理 71
3.17.2正无穷和负无穷的问题 72
3.17.3 double型和float型之间的处理 72
3.17.4何时使用switch语句,何时使用if…else if语句 72
3.17.5使用for循环的技巧 73
3.17.6可以在嵌套语句中使用break语句 73
3.17.7设置有意义的标号 75
3.17.8通过区别来决定怎样选择跳转语句 76
3.17.9理解Java数组的内部机制 77
3.17.10数组必须初始化 78
3.17.11 Java中的两种引用类型 79
3.17.12向数组中填充数据 79
3.17.13在使用foreach操作数组时不建议对循环变量进行赋值 81
3.17.14定义常量时的注意事项 82
3.17.15 移位运算符的限制 83
3.17.16扩展赋值运算符 83
3.17.17 switch语句和if…else if语句的选择 84
第4章 同时学习类和方法 87
4.1类中的相关定义 88
4.1.1理解类的意义 88
4.1.2定义类 88
4.1.3定义属性 89
4.1.4定义方法 89
4.1.5定义构造器 90
4.1.6 Java的修饰符 90
4.2 Java方法 91
4.2.1传递方法参数 91
4.2.2可以定义形参长度可变的参数 92
4.2.3构造方法和递归方法 93
4.3 this关键字 95
4.4类和对象 96
4.4.1创建和使用对象 96
4.4.2使用静态变量和静态方法 97
4.5抽象类和抽象方法 97
4.5.1为什么推出抽象方法 97
4.5.2了解抽象类和抽象方法 98
4.5.3抽象类必须有一个抽象方法 100
4.6使用软件包 101
4.6.1定义软件包 101
4.6.2在Eclipse中定义软件包 102
4.6.3在程序里插入软件包 104
4.7继承 105
4.7.1父类和子类 105
4.7.2对父类的操作 106
4.7.3重写方法的两点注意事项 108
4.8重写和重载 108
4.8.1重写 108
4.8.2重载 109
4.8.3重写和重载的区别 110
4.9隐藏和封装 110
4.9.1 Java中的封装 111
4.9.2使用访问控制符 111
4.9.3解决重名问题的包 113
4.9.4 import 115
4.10初学者应该明白的几个问题 116
4.10.1方法的所属性问题 116
4.10.2探讨Java传递引用类型的实质 117
4.10.3体会使用this关键字的好处 118
4.10.4体会抽象类的作用 119
4.10.5通过一个错误程序体会包的作用 121
4.10.6掌握使用包的一些规则 122
4.10.7探讨package和import的机制 122
第5章 深入理解Java的面向对象 125
5.1接口 126
5.1.1需要理解Java接口编程的机理 126
5.1.2定义接口 127
5.1.3接口里的量和方法 127
5.1.4实现接口 128
5.1.5引用接口 128
5.1.6接口的继承 129
5.2特殊的方法——构造器 129
5.2.1初始化构造器 130
5.2.2构造器重载 130
5.2.3 this在构造器中的妙用 131
5.2.4调用父类构造器 131
5.2.5子类构造器调用父类构造器的几种情况 131
5.3多态 132
5.3.1何谓多态 132
5.3.2演示Java中的多态 134
5.3.3 Java多态的核心 135
5.4引用类型 135
5.4.1四种引用类型 135
5.4.2 instanceof运算符 138
5.4.3强制类型转换不是万能的 139
5.5选择继承还是组合 141
5.6包装类 144
5.7用final修饰基本类型和引用类型变量的区别 145
5.7.1用final修饰变量 145
5.7.2使用final修饰方法 147
5.8内部类 148
5.8.1为什么需要内部类 148
5.8.2非静态内部类 149
5.8.3成员内部类 151
5.8.4局部内部类 152
5.8.5静态内部类 153
5.8.6匿名内部类 154
5.8.7对内部类的总结 157
5.9枚举类 161
5.9.1手动实现枚举类的缺点 161
5.9.2枚举类型 163
5.9.3接口和抽象类 165
5.10初学者应该明白的几个问题 166
5.10.1区分构造器和方法 166
5.10.2使用instanceof运算符时要避免编译错误 167
5.10.3分析Java中的自动装箱和自动拆箱 168
5.10.4 Java类的几种权限 169
5.10.5使用this限定类的属性 169
5.10.6 在匿名类和内部类中使用this 170
5.10.7枚举类常用的几个方法 171
第6章 集合 173
6.1 Java集合概述 174
6.2学习Collection和Iterator的诀窍 175
6.2.1基础知识介绍 175
6.2.2改变Collection集合元素的问题 177
6.3挖掘Set接口的妙用 178
6.3.1基础知识介绍 178
6.3.2使用HashSet 181
6.3.3 HashSet深入 183
6.4深入List接口 183
6.4.1基本知识介绍 183
6.4.2使用List接口和ListIterator接口 185
6.4.3使用ArrayList和Vector类 186
6.4.4 ArrayList和Vector的区别 187
6.5 Map接口的深入浅出 187
6.5.1使用HashMap和Hashtable实现类 188
6.5.2使用SortedMap接口和TreeMap类实现排序处理 190
6.5.3使用WeakHashMap类 192
6.5.4使用IdentityHashMap类 193
6.5.5使用EnumMap类 194
6.5.6分析几种Map类的性能 195
6.6模拟队列数据结构的Queue接口 195
6.6.1常用的方法 196
6.6.2 List接口的实现类——LinkedList 196
6.6.3处理优先级的PriorityQueue类 197
6.7集合工具类Collections 198
6.7.1排序操作 198
6.7.2使用swap()方法交换集合中两个位置的内容 199
6.7.3查找和替换 199
6.8初学者应该明白的几个问题 201
6.8.1总结Java中处理排序的问题 201
6.8.2使用EnumSet类的注意事项 206
6.8.3体会List中的额外方法 206
6.8.4 HashMap和Hashtable之间的选择 207
6.8.5 TreeMap判断两个元素是否相等的标准 207
6.8.6体验数组的优良性能 207
6.8.7 LinkedList、ArrayList、Vector性能问题的研究 208
第7章 使用类库提高开发效率 211
7.1 StringBuffer类 212
7.1.1 StringBuffer类基础 212
7.1.2使用StringBuffer类 212
7.1.3 StringBuffer和String选择的异同 213
7.2运行时操作类 Runtime 213
7.3实现Java程序国际化 215
7.3.1 Java实现国际化的方案 215
7.3.2表示国家语言的类——Locale 215
7.3.3 ResourceBundle类 216
7.3.4处理动态文本 217
7.3.5使用类代替资源文件 219
7.4系统类System 220
7.4.1 System类基础 220
7.4.2垃圾对象的回收 221
7.5日期操作类——Date 222
7.5.1使用Date类 222
7.5.2使用Calendar类获取当前时间 222
7.5.3使用DateFormat类设置日期的格式 224
7.5.4使用SimpleDateFormat类 225
7.6使用Math类实现数学运算 226
7.7使用Random类生成随机数 226
7.8数字格式化类——NumberFormat 227
7.9使用Arrays类操作数组 228
7.10 Comparable接口 229
7.10.1 Comparable接口基础 229
7.10.2使用Comparable接口 229
7.10.3使用Comparator接口 230
7.11使用Observable类和Observer接口实现观察者模式 232
7.12正则表达式 233
7.12.1正则表达式是一种可以用于模式匹配和替换的规范 233
7.12.2 String类和正则表达式 235
7.13线程类Timer和TimerTask 236
7.14初学者应该明白的几个问题 237
7.14.1了解Java的内存管理机制 237
7.14.2传递可变参数 239
7.14.3通过System类获取本机的全部环境属性 240
7.14.4把一个日期变为指定格式 241
7.14.5在Math类中也有一个random()方法 241
7.14.6如果没有实现Comparable接口会出现异常 242
7.14.7体验正则表达式的好处 243
第8章 泛型 245
8.1泛型基础 246
8.1.1使用泛型的好处 246
8.1.2检查类型 246
8.1.3使用泛型 248
8.2深入泛型 249
8.2.1定义泛型接口和类 249
8.2.2派生子类 250
8.2.3并不存在泛型类 251
8.3类型通配符 252
8.3.1设置类型通配符的上限 253
8.3.2设置类型形参的上限 255
8.4泛型方法 256
8.4.1定义泛型方法 256
8.4.2设置通配符下限 259
8.5泛型接口 260
8.6泛型继承 262
8.6.1以泛型类为父类 262
8.6.2以非泛型类为父类 263
8.7运行时类型识别 264
8.8强制类型转换 265
8.9擦除 266
8.9.1擦除基础 266
8.9.2需要避免擦除带来的错误 269
8.10初学者应该明白的几个问题 270
8.10.1使用泛型应该遵循的原则和注意的问题 270
8.10.2分析Java语言中泛型的本质 271
8.10.3体验泛型方法和类型通配符的区别 271
8.10.4重温泛型类的继承规则 272
8.10.5挖掘类型擦除和泛型特性的联系 273
第9章 异常处理 275
9.1什么是异常 276
9.1.1认识异常 276
9.1.2 Java的异常处理机制 276
9.1.3 Java为我们提供了异常处理类 279
9.2处理异常的方式 280
9.2.1使用try-catch来处理异常 280
9.2.2处理多个异常 281
9.2.3使用finally关键字处理异常 281
9.2.4访问异常信息 283
9.3抛出异常 284
9.3.1使用throws抛出异常 284
9.3.2使用throw抛出异常 286
9.3.3区别throws关键字和throw关键字 287
9.4自定义异常 287
9.4.1 Throwable类介绍 287
9.4.2子类Error和Exception 290
9.5 Checked异常和Runtime异常的区别 290
9.6初学者应该明白的几个问题 292
9.6.1杜绝异常处理的陋习 293
9.6.2学习异常没有诀窍 296
9.6.3异常处理语句的规则 296
9.6.4建议使用嵌套来处理异常 298
9.6.5分析异常类的继承关系 298
第10章 使用I/O系统来处理文件 301
10.1 Java I/O简介 302
10.2与文件有关的类——File 302
10.3随机读取类RandomAccessFile 304
10.4字节流和字符流 306
10.4.1字节流类和字符流类 306
10.4.2使用字节流 306
10.4.3使用字符流 309
10.5字节转换流 311
10.6内存操作流 312
10.7使用管道流实现线程间的通信 313
10.8使用打印流输出信息 315
10.9 BufferedReader类 316
10.9.1 BufferedReader类基础 316
10.9.2使用BufferedReader类 317
10.10 Scanner类 318
10.11数据操作流 320
10.11.1 DataOutputStream类 321
10.11.2 DataInputStream类 322
10.12压缩流 323
10.12.1 ZIP压缩输入/输出流简介 323
10.12.2 ZipOutputStream类 324
10.12.3 ZipFile类 327
10.12.4 ZipInputStream类 327
10.13回退流 328
10.14字符编码 329
10.14.1得到本机的编码显示 329
10.14.2产生乱码 330
10.15对象序列化 330
10.15.1 Serializable接口 331
10.15.2对象输出流ObjectOutputStream 331
10.15.3对象输入流ObjectInputStream 332
10.15.4 Externalizable接口 333
10.15.5关键字transient 333
10.15.6序列化一组对象 335
10.16新增的I/O 336
10.16.1新I/O概述 336
10.16.2使用Buffer 336
10.17初学者应该明白的几个问题 338
10.17.1使用File.separator表示分隔符 338
10.17.2综合创建和删除文件的操作 338
10.17.3体会File类的复杂用法 339
10.17.4将写入的数据换行 340
10.17.5弄清字节流和字符流的区别 340
10.17.6显示菜单 342
10.17.7对象序列化和对象反序列化操作时的版本兼容性问题 344
10.17.8不能让所有的类都实现Serializable接口 344
10.17.9如何选择Externalizable接口和Serializable接口 345
第11章 快速体验AWT 347
11.1 GUI和AWT 348
11.2容器 350
11.2.1容器基础 350
11.2.2容器中的常用组件 350
11.3布局管理器 353
11.3.1布局利器FlowLayout 353
11.3.2布局利器BorderLayout 355
11.3.3矩形网格布局GridLayout 356
11.3.4版面管理器GridBagLayout 358
11.3.5可以设置一个组件的布局——CardLayout 360
11.3.6可以摆放GUI组件的布局管理器——BoxLayout 362
11.4 AWT中的常用组件 364
11.4.1 AWT中的组件 364
11.4.2实现对话框效果 367
11.5事件处理 369
11.5.1 Java的事件模型 369
11.5.2事件和事件监听器 371
11.5.3事件适配器 376
11.6 AWT的菜单 378
11.6.1菜单条、菜单和菜单项 378
11.6.2右键菜单 381
11.7绘图 383
11.7.1 Component类中的绘图方法 383
11.7.2 Graphics类 383
11.8操作位图 385
11.8.1 Image类和BufferedImage类 385
11.8.2输入/输出位图 388
11.9初学者应该明白的几个问题 389
11.9.1创建Glue、Strut和RigidArea的几个静态方法 389
11.9.2体会绝对定位的好处 390
11.9.3 AWT中的菜单组件不能创建图标菜单 391
第12章 由浅入深体验Swing 393
12.1 Swing介绍 394
12.2 Swing的基本组件 394
12.2.1 Swing组件的层次结构 395
12.2.2 Swing组件的特性 396
12.2.3 Swing胜过AWT的优势 397
12.2.4使用Swing实现AWT组件 397
12.2.5 JFrame、JScrollPane和边框 398
12.2.6 JToolBar 401
12.2.7 JColorChooser和JFileChooser 403
12.2.8 JOptionPane 405
12.2.9 JSplitPane 408
12.2.10 JTabbedPane 409
12.3拖放处理 410
12.4 JProgressBar、ProgressMonitor和BoundedRangeModel 412
12.4.1创建一个进度条 413
12.4.2使用ProgressMonitor创建进度条对话框 413
12.5 JSlider和BoundedRangeModel 415
12.6 JList和JComboBox 416
12.6.1使用JList和JComboBox的构造器创建列表框 416
12.6.2使用ListCellRenderer 418
12.7 JTree和TreeModel 418
12.7.1创建树 419
12.7.2拖动、编辑节点 420
12.8初学者应该明白的几个问题 421
12.8.1贯穿Java开发的MVC模式 421
12.8.2实现有意义的进度条效果 422
第13章 数据库编程 425
13.1与数据库相关的概念 426
13.2.SQL语言 428
13.2.1数据定义 428
13.2.2数据操纵 430
13.2.3视图 432
13.2.4 SQL高级操作 433
13.3初识JDBC 434
13.3.1 JDBC驱动类型 434
13.3.2 JDBC的常用接口和类 435
13.3.3 JDBC编程步骤 437
13.4常用的几种数据库 441
13.4.1 Access数据库 441
13.4.2 SQL Server数据库 441
13.4.3 MySQL数据库 445
13.5执行SQL语句的方式 445
13.5.1使用executeUpdate 445
13.5.2使用execute方法 447
13.6事务处理 449
13.6.1 JDBC中的事务控制 449
13.6.2检查数据库是否支持事务处理 450
13.6.3 JDBC事务控制的流程 450
13.7存储过程 454
13.7.1创建存储过程 454
13.7.2调用创建的存储过程 456
13.8初学者应该明白的几个问题 458
13.8.1通过课外学习掌握数据库技术 458
13.8.2数据库产品概览,没有最完美的产品 458
13.8.3乱花渐欲迷人眼,始终相信合适的即为最好的 460
第14章 网络与通信编程 463
14.1 Java中的网络包 464
14.1.1 InetAddress类详解 464
14.1.2 URLDecoder类和URLEncoder类 464
14.1.3 URL和URLConnection 465
14.1.4实践演练 467
14.2 TCP编程 468
14.2.1使用ServletSocket 469
14.2.2使用Socket 469
14.2.3 TCP中的多线程 471
14.2.4实现非阻塞Socket通信 475
14.3 UDP编程 479
14.3.1使用DatagramSocket 479
14.3.2使用MulticastSocket 484
14.3.3 MulticastSocket类的意义 487
14.4代理服务器 487
14.4.1什么是代理服务器 487
14.4.2使用Proxy创建连接 489
14.4.3使用ProxySelector选择代理服务器 490
14.4.4服务器代理实例 492
14.5初学者应该明白的几个问题 496
14.5.1 URL处理的两点注意事项 496
14.5.2使用异常处理完善程序 497
14.5.3分析ServerSocketChannel的麻烦之处 497
14.5.4体会繁琐的DatagramPacket 498
14.5.5需要知道代理背后的事情 498
14.5.6代理服务无止境 499
第15章 多线程 501
15.1线程基础 502
15.1.1线程概述 502
15.1.2线程与函数的关系 502
15.1.3 Java的线程模型 503
15.2创建线程 503
15.2.1使用Thread类创建线程 503
15.2.2使用Runnable接口创建线程 506
15.3线程的生命周期 508
15.3.1创建并运行线程 508
15.3.2 start和run的区别 509
15.3.3挂起和唤醒线程 509
15.3.4终止线程的三种方法 511
15.3.5线程的优先级 513
15.3.6线程阻塞 513
15.3.7线程死亡 514
15.4控制线程 514
15.4.1使用join方法 514
15.4.2慎重使用volatile关键字 515
15.4.3后台、让步和睡眠 517
15.4.4 sleep()方法和yield()方法的区别 519
15.5线程传递数据 519
15.5.1向线程传递数据的三种方法 519
15.5.2两种从线程返回数据的方法 522
15.6数据同步 523
15.6.1使用synchronized关键字同步类方法 526
15.6.2使用Synchronized块同步变量 529
15.6.3同步锁 531
15.7多线程编程的常见缺陷及其产生的原因 533
15.7.1死锁问题 534
15.7.2多线程编程的常见陷阱 537
15.8初学者应该明白的几个问题 541
15.8.1在方法run()中使用线程名时带来的问题 542
15.8.2继承Thread类或实现Runnable接口的比较 542
15.8.3使用sleep()方法的注意事项 542
15.8.4如何确定死锁发生 543
15.8.5关键字synchronized和volatile的区别 543
15.8.6使用关键字synchronized的注意事项 544
15.8.7分析Swing的多线程死锁问题 546
第16章 案例:综合供求信息平台 549
16.1需求分析 550
16.1.1规划流程 550
16.1.2开发背景 550
16.1.3需求分析 550
16.1.4项目规划 551
16.2网站功能结构 551
16.3搭建开发环境 552
16.4搭建数据库 552
16.4.1数据库需求分析 553
16.4.2数据库概念设计 553
16.4.3数据库逻辑结构设计 554
16.5设计公共类 555
16.5.1数据库连接及操作类 555
16.5.2业务处理类 557
16.5.3分页类 559
16.5.4字符串处理类 560
16.6具体编码 560
16.6.1设计前台页面 561
16.6.2前台信息显示设计 562
16.6.3信息发布模块设计 570
16.6.4登录模块 572
16.6.5后台页面模块 574
16.6.6后台信息管理模块 574
16.7测试 577
第17章 案例:小区物业管理系统 581
17.1系统概述和总体设计 582
17.1.1系统需求分析 582
17.1.2系统演示流程 583
17.2数据库设计 583
17.2.1选择数据库 583
17.2.2数据库结构的设计 584
17.3系统框架设计 586
17.3.1创建工程及设计主界面 586
17.3.2数据库ADO访问类 589
17.3.3系统登录模块设计 589
17.4基本信息管理模块 590
17.4.1小区信息管理 590
17.4.2楼宇信息管理 592
17.4.3业主信息管理 594
17.4.4收费项目管理 594
17.4.5查询单价清单 595
17.5消费指数管理模块 596
17.5.1业主消费录入 597
17.5.2物业消费录入 599
17.6各项费用管理模块 600
17.6.1业主费用查询 600
17.6.2物业费用查询 602
17.7测试 604
参考文献 605