标题：疯狂Java讲义精粹
出版信息
《疯狂Java讲义精粹》
李刚 编著  ISBN978-7-121-15579-6
2012年1月出版
定价：79.00元（含光盘1张）
16开
596 页
疯狂源自梦想 技术成就辉煌
内容简介
本书是《疯狂Java讲义》的精粹版，本书同样保留了《疯狂Java讲义》的特性：本书基于Java 7完成，全面介绍了Java 7的新特性。
本书删除了《疯狂Java讲义》中关于图形界面编程、数据库编程的内容，保留了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制的内容。本书的这种调整一方面是为了对《疯狂Java讲义》进行精简，另一方面也是应广大高校老师的反馈：高校课程前期已经讲授过数据库相关内容，因此本书删除了相关内容。本书的写作是基于Java 7完成的，全面介绍了Java 7的二进制整数、菱形语法、增强switch语句、多异常捕获、自动关闭资源的try语句、JDBC 4.1新特性、NIO.2、AIO等新特性。
本书光盘里包含书中所有示例的代码和《疯狂Java实战演义》的所有项目代码。但由于本书并未包含Java图形界面编程的相关知识，因此读者在阅读带图形界面的项目代码时可能有一定困难，此时读者可以参考《疯狂Java讲义》的相关内容，也可以登录站点与笔者及本书庞大的读者群相互交流。
本书为所有打算深入掌握Java编程的读者而编写，适合各种层次的Java学习者和工作者阅读。本书专门针对高校课程进行过调整，尤其适合作为大学教育、培训机构的Java教材。本书不适合只想简单涉猎Java的读者阅读。
作者简介
李刚，从事10多年的Java EE应用开发，现任疯狂软件教育中心教学总监。
疯狂Java实训营创始人，疯狂Java体系图书作者。曾任LITEON公司的J2EE技术主管，负责该公司的企业信息化平台的架构设计。
曾任广州电信、广东龙泉科技等公司的技术培训导师。曾兼任广东技术师范学院计算机科学系的兼职副教授。
2007年3月26日的《电脑报》专访人物。
培训的学生已在华为、立信、普信、网易、电信盈科等公司就职。
国内著名的高端IT技术作家，已出版《疯狂Java讲义》、《疯狂Android讲义》、《轻量级Java EE企业应用实战》、《疯狂Ajax讲义》、《疯狂XML讲义》、《经典Java EE企业应用实战》、《Struts 2.1权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。其中疯狂Java体系图书都是已经得到广泛的市场认同，并多次重印的畅销图书，并被多家高校选作教材，部分图书已被翻译成繁体中文版、输出到台湾地区。
序
如何学习Java
——谨以此文献给打算以编程为职业、并愿意为之疯狂的人
经常看到有些学生、求职者捧着一本类似JBuilder入门、Eclipse指南之类的图书学习Java，当他们学会了在这些工具中拖出窗体、安装按钮之后，就觉得自己掌握、甚至精通了Java；又或是找来一本类似JSP动态网站编程之类的图书，学会使用JSP脚本编写一些页面后，就自我感觉掌握了Java开发。
还有一些学生、求职者听说J2EE、Spring或EJB很有前途，于是立即跑到书店或图书馆找来一本相关图书。希望立即学会它们，然后进入软件开发业、大显身手。
还有一些学生、求职者非常希望找到一本既速成、又大而全的图书，比如突击J2EE开发、一本书精通J2EE之类的图书（包括笔者曾出版的《轻量级J2EE企业应用实战》一书，据说销量不错)，希望这样一本图书就可以打通自己的“任督二脉”，一跃成为J2EE开发高手。
也有些学生、求职者非常喜欢J2EE项目实战、项目大全之类的图书，他们的想法很单纯：我按照书上介绍，按图索骥、依葫芦画瓢，应该很快就可学会J2EE，很快就能成为一个受人羡慕的J2EE程序员了。
……
凡此种种，不一而足。但最后的结果往往是失败，因为这种学习没有积累、没有根基，学习过程中困难重重，每天都被一些相同、类似的问题所困扰，起初热情十足，经常上论坛询问，按别人的说法解决问题之后很高兴，既不知道为什么错？也不知道为什么对？只是盲目地抄袭别人的说法。最后的结果有两种：
久而久之，热情丧失，最后放弃学习。
大部分常见问题都问遍了，最后也可以从事一些重复性开发，但一旦遇到新问题，又将束手无策。
第二种情形在普通程序员中占了极大的比例，笔者多次听到、看到（在网络上）有些程序员抱怨：我做了2年多Java程序员了，工资还是3000多点。偶尔笔者会与他们聊聊工作相关内容，他们会告诉笔者：我也用Spring了啊，我也用EJB了啊……他们感到非常不平衡，为什么我的工资这么低？其实笔者很想告诉他们：你们太浮躁了！你们确实是用了Spring、Hibernate又或是EJB，但你们未想过为什么要用这些技术？用这些技术有什么好处？如果不用这些技术行不行？
很多时候，我们的程序员把Java当成一种脚本，而不是一门面向对象的语言。他们习惯了在JSP脚本中使用Java，但从不去想JSP如何运行，Web服务器里的网络通信、多线层机制，为何一个JSP页面能同时向多个请求者提供服务？更不会想如何开发Web服务器；他们像代码机器一样编写SpringBean代码，但从不去理解Spring容器的作用，更不会想如何开发Spring容器。
有时候，笔者的学生在编写五子棋、梭哈等作业感到困难时，会向他们的大学师兄、朋友求救，这些程序员告诉他：不用写了，网上有下载的！听到这样回答，笔者不禁感到哑然：网上还有Windows下载呢！网上下载和自己编写是两码事。偶尔，笔者会怀念以前黑色屏幕、绿荧荧字符时代，那时候程序员很单纯：当我们想偷懒时，习惯思维是写一个小工具；现在程序员很聪明：当他们想偷懒时，习惯思维是从网上下一个小工具。但是，谁更幸福？
当笔者的学生把他们完成的小作业放上互联网之后，然后就有许多人称他们为“高手”！这个称呼却让他们万分惭愧；惭愧之余，他们也感到万分欣喜，非常有成就感，这就是编程的快乐。编程的过程，与寻宝的过程完全一样：历经辛苦，终于找到心中的梦想，这是何等的快乐？
如果真的打算将编程当成职业，那就不应该如此浮躁，而是应该扎扎实实先学好Java语言，然后按Java本身的学习规律，踏踏实实一步一个脚印地学习，把基本功练扎实了才可获得更大的成功。
实际情况是，有多少程序员真正掌握了Java的面向对象？真正掌握了Java的多线程、网络通信、反射等内容？有多少Java程序员真正理解了类初始化时内存运行过程？又有多少程序员理解Java对象从创建到消失的全部细节？有几个程序员真正独立地编写过五子棋、梭哈、桌面弹球这种小游戏？又有几个Java程序员敢说：我可以开发Struts？我可以开发Spring？我可以开发Tomcat？很多人又会说：这些都是许多人开发出来的！实际情况是：许多开源框架的核心最初完全是由一个人开发的。现在这些优秀程序已经出来了！你，是否深入研究过它们，是否深入掌握了它们？
如果要真正掌握Java，包括后期的JavaEE相关技术（例如Struts、Spring、Hibernate和EJB等），一定要记住笔者的话：绝不要从IDE（如JBuilder、Eclipse和NetBeans）工具开始学习！IDE工具的功能很强大，初学者学起来也很容易上手，但也非常危险：因为IDE工具已经为我们做了许多事情，而软件开发者要全部了解软件开发的全部步骤。
2011年12月17日
前 言
2011年7月，Oracle如约发布了Java 7正式版。接下来笔者对《疯狂Java讲义》进行了升级：使用Java 7改写了全书所有程序，全面介绍了Java 7的各种新特性。
《疯狂Java讲义》面市的近3年时间内，得到了广大读者的一致好评。笔者也收到了一些关于《疯狂Java讲义》的建议：有人觉得这本书实在太大、太厚了；也有读者建议把《疯狂Java讲义》拆分成上、下册来出版；针对这些建议，笔者慎重地斟酌了很久：Java经过10多年的发展，已经成为世界上应用最广泛的编程语言，而且Java语言的强大是有目共睹的。功能如此丰富、强大，历史如此悠久的一门编程语言，如果希望通过一本三、四百页的书能讲透，笔者觉得不太现实。虽然笔者也很希望对《疯狂Java讲义》进行精简，但实在难以取舍。如果把《疯狂Java讲义》拆分成上、下册来出版，这种做法会增加读者的经济负担（1本书变成了2本书，总价会高很多）。后来出版社的朋友启发说：可以尝试把《疯狂Java讲义》部分内容抽取成“精粹本”；又想到有高校老师反应：学校在安排Java课程之前，已经安排了数据库开发相关课程，《疯狂Java讲义》中关于SQL、JDBC编程的内容有些重复。出于上面两种需求，笔者对《疯狂Java讲义》内容进行了调整，删除了部分内容，得到这本《疯狂Java讲义精粹》，本书更适合作为高校教材使用。
在以“疯狂Java体系”图书为教材的疯狂软件教育中心里，经常有学生询问：为什么叫疯狂Java这个名字？也有一些读者通过网络、邮件来询问这个问题。其实这个问题答案可以在本书第1版的前言中找到。疯狂的本质是一种“享受编程”的状态。在一些不了解编程的人看来：编程的人总面对着电脑、在键盘上敲打，这种生活实在太枯燥了，但实际上是因为他们并未真正了解编程，并未真正走进编程。在外人眼中：程序员不过是在敲打键盘；但在程序员心中：程序员敲出的每个字符，都是程序的一部分。
程序是什么呢？程序是对现实世界的数字化模拟。开发一个程序，实际是创造一个或大或小的“模拟世界”。在这个过程中，程序员享受着“创造”的乐趣，程序员沉醉在他所创造“模拟世界”里：疯狂地设计、疯狂地编码实现。实现过程不断地遇到问题，然后解决它；不断地发现程序的缺陷，然后重新设计、修复它——这个过程本身就是一种享受。一旦完全沉浸到编程世界里，程序员是“物我两忘”的，眼中看到的、心中想到的，只有他正在创造的“模拟世界”。
在学会享受编程之前，编程学习者都应该采用“案例驱动”的方式，学习者需要明白程序的作用是：解决问题——如果你的程序不能解决你自己的问题，如何期望你的程序去解决别人的问题呢？那你的程序的价值何在？——知道一个知识点能解决什么问题，才去学这个知识点，而不是盲目学习！因此本书强调编程实战，强调以项目激发编程兴趣。
仅仅只是看完这本书，你不会成为高手！在编程领域里，没有所谓的“武林秘笈”，再好的书一定要配合大量练习，否则书里的知识依然属于作者，而读者则仿佛身入宝山而一无所获的笨汉。本书配合了大量高强度的练习，希望读者强迫自己去完成这些项目。这些习题的答案可以参考本书所附光盘中《疯狂Java实战演义》的配套代码。如果需要获得编程思路和交流，可以登录与广大读者和笔者交流。
本书有什么特点
本书是《疯狂Java讲义》的精粹版，本书并不是一本简单的Java入门教材。本书的内容完全取自《疯狂Java讲义》，只是删减了原书中关于SQL、JDBC编程，以及Java图形界面编程的相关内容。
因此，本书具有如下三个特点。
1．阐述透彻、原理清晰
本书并不是简单地罗列Java语法规则，而是尽量从语法设计者的角度向读者解释每个语法规则的作用、缘由；本书力求从运行机制来解释代码的运行过程，从内存分配的细节上剖析程序的运行细节。阅读本书不仅要求读者知道怎么做，而且要求读者能理解“为什么这么做”。
2．再现李刚老师课堂氛围
本书的内容是笔者6年多授课经历的总结，知识体系取自疯狂Java实战的课程体系。
本书力求再现笔者的课堂氛围：以浅显比喻代替乏味的讲解，以疯狂实战代替空洞的理论。
书中包含了大量“注意”、“学生提问”部分，这些正是上千个Java学员所犯错误的汇总。
3．注释详细，轻松上手
为了降低读者阅读的难度，书中代码的注释非常详细，几乎每两行代码就有一行注释。不仅如此，本书甚至还把一些简单理论作为注释穿插到代码中，力求让读者能轻松上手。
本书所有程序中关键代码以粗体字标出，也是为了帮助读者能迅速找到这些程序的关键点。
本书写给谁看
如果你仅仅想对Java有所涉猎，那么本书并不适合你；如果你想全面掌握Java语言，并使用Java来解决问题、开发项目，或者希望以Java编程作为你的职业，那么本书将非常适合你。希望本书能引爆你内心潜在的编程激情，如果本书能让你产生废寝忘食的感觉，那笔者就非常欣慰了。
李刚
2011-12-17
目 录
第1章 Java语言概述
1.1 Java语言的发展简史
1.2 Java的竞争对手及各自优势
1.2.1 C#简介和优势
1.2.2 Ruby简介和优势
1.2.3 Python简介和优势
1.3 Java程序运行机制
1.3.1 高级语言的运行机制
1.3.2 Java程序的运行机制和JVM
1.4 开发Java的准备
1.4.1 下载和安装Java 7的JDK
学生提问 不是说JVM是运行Java程序的虚拟机吗？那JRE和JVM的关系是怎样的呢？
为什么不安装公共JRE呢？
1.4.2 设置PATH环境变量
学生提问 为什么选择用户变量？用户变量与系统变量有什么区别？
1.5 第一个Java程序
1.5.1 编辑Java源代码
1.5.2 编译Java程序
学生提问 当我们编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢？
1.5.3 运行Java程序
1.5.4 根据CLASSPATH环境变量定位类
1.6 Java程序的基本规则
1.6.1 Java程序的组织形式
1.6.2 Java源文件的命名规则
1.6.3 初学者容易犯的错误
1.7 垃圾回收机制
1.8 何时开始使用IDE工具
学生提问 我想学习Java编程,到底是学习Eclipse好呢,还是学习NetBeans好呢？
1.9 本章小结
本章练习
第2章 数据类型和运算符
2.1 注释
2.1.1 单行注释和多行注释
2.1.2 文档注释
API文档是什么？
学生提问 为什么要掌握查看API文档的方法？
2.2 标识符和关键字
2.2.1 分隔符
2.2.2 标识符规则
2.2.3 Java关键字
2.3 数据类型分类
2.4 基本数据类型
2.4.1 整型
2.4.2 Java 7新增的二进制整数
2.4.3 字符型
2.4.4 浮点型
2.4.5 Java 7新增的数值中使用下画线分隔
2.4.6 布尔型
2.5 基本类型的类型转换
2.5.1 自动类型转换
2.5.2 强制类型转换
2.5.3 表达式类型的自动提升
2.6 直接量
2.6.1 直接量的类型
2.6.2 直接量的赋值
2.7 运算符
2.7.1 算术运算符
2.7.2 赋值运算符
2.7.3 位运算符
2.7.4 扩展后的赋值运算符
2.7.5 比较运算符
2.7.6 逻辑运算符
2.7.7 三目运算符
2.7.8 运算符的结合性和优先级
2.8 本章小结
本章练习
第3章 流程控制与数组
3.1 顺序结构
3.2 分支结构
3.2.1 if条件语句
3.2.2 Java 7的switch分支语句
3.3 循环结构
3.3.1 while循环语句
3.3.2 do while循环语句
3.3.3 for循环
3.3.4 嵌套循环
3.4 控制循环结构
3.4.1 使用break结束循环
3.4.2 使用continue结束本次循环
3.4.3 使用return结束方法
3.5 数组类型
3.5.1 理解数组：数组也是一种类型
int[]是一种类型吗？怎么使用这种类型呢？
3.5.2 定义数组
3.5.3 数组的初始化
学生提问 能不能只分配内存空间,不赋初始值呢？
3.5.4 使用数组
学生提问 为什么要我记住这些异常信息？
3.5.5 foreach循环
3.6 深入数组
3.6.1 内存中的数组
学生提问 为什么有栈内存和堆内存之分？
3.6.2 基本类型数组的初始化
3.6.3 引用类型数组的初始化
3.6.4 没有多维数组
学生提问 我是否可以让图3.13中灰色覆盖的数组元素再次指向另一个数组？这样不就可以扩展成三维数组吗？甚至扩展成更多维的数组？
3.6.5 操作数组的工具类
3.6.6 数组的应用举例
3.7 本章小结
本章练习
第4章 面向对象（上）
4.1 类和对象
4.1.1 定义类
学生提问 构造器不是没有返回值吗？为什么不能用void修饰呢？
4.1.2 对象的产生和使用
4.1.3 对象、引用和指针
4.1.4 对象的this引用
4.2 方法详解
4.2.1 方法的所属性
4.2.2 方法的参数传递机制
4.2.3 形参个数可变的方法
4.2.4 递归方法
4.2.5 方法重载
学生提问 为什么方法的返回值类型不能用于区分重载的方法？
4.3 成员变量和局部变量
4.3.1 成员变量和局部变量
4.3.2 成员变量的初始化和内存中的运行机制
4.3.3 局部变量的初始化和内存中的运行机制
4.3.4 变量的使用规则
……
第5章 面向对象（下）
第6章 Java集合
第7章 泛型
第8章 异常处理
第9章 Annotation（注释）
第10章 输入/输出
第11章 多线程
第12章 网络编程
第13章 类加载机制与反射