要学好Java,就得从基本的程序语言上面学起。
基础打稳了,就能打通仁督二脉,一路继续学习下去,才有办法应用在各种实用的领域上。
朱仲杰这本《Java 2全方位学习》是你打好基础的武功秘笈。
自由人 洪志鹏
无论是服务器端J2EE应用,或是手机、PDA等J2ME的创作,都必须有J2SE的概念与基础,朱仲杰先生用优雅的文笔、从专业的角度撰写了这本《Java 2全方位学习》。
这本书范例与概念并重,真的是值得初学与已有一定基础的人购买使用。
松凌科技CTO 李日贵
本人常常嫉妒为什么他这本书过去的版本卖得那么好,书卖得好一定有它的理由,所以很乐意向广大的Java开发人员推荐。
升阳电脑教育训练中心 经 理 王 森
Java has brought about a worldwide revolution in software development. Java was designed for the Internet, and the implications of network programming. But that same internet has also brought around a revolution in the business and social structure of software development. It is now also a truly global community that produces today's software, and China is a key player in the global community. Jacky Chu's books have been very helpful in connecting China with the revolutions that are the modern Internet and Java.
Jame Gosling (Java 之父)
2005.01.14
无
本书不同于其他Java书籍先介绍面向对象程序设计的概念,而是把它放在中间等大家熟悉了简单的Java程序设计之后,再学习Java中相关的面向对象程序设计,以下是各个章节的导读。跟上一版相异之处(新增部分),会以星号(*)标示出来。在后面的章节中,笔者会把J2SE 50这样的字眼以“Tiger”来称呼,希望通过这次改版,能让大家轻易地驾驭这只威力强大的老虎!
第1章Java的过去、现在和未来
想要学好Java当然要知道它的来龙去脉,以及它未来的发展方向。第1章中笔者就带大家回顾一下Java的历史,看看Java一路走来是如何在电脑领域中大放异彩的。
第2章程序开发工具下载、安装与使用
看完第1章之后,是不是迫不及待想开始动手学写Java程序了呢?别急,所谓“工欲善其事,必先利其器”,在第2章中笔者教大家如何下载开发Java程序所需的相关工具程序。
第3章程序初体验
工具都准备妥了之后,笔者在第3章中先把基本的程序设计概念,还有编译、执行Java应用程序的方法教给各位,好让大家先了解整个程序开发的流程,以利于后面章节做练习时,能很快地完成练习程序。
*本章将会介绍UltraEdit与jEdit这两套文档编辑软件。
第4章程序基本单元
从本章开始,我们一步步地从一个程序中所需的最小单元开始学起,地基稳固之后,上面才能盖高楼大厦。在这一章会教大家认识什么是变量,又该如何声明和使用它。
*新增介绍新的关键字enum。
第5章Java的表达式
学会了程序基本的元件(变量)之后,在这一章中我们就用这些元件来做一些基本的运算,通过这些运算来完成我们想要做的事情。
第6章Java的语句
我们将前面两章中的东西组合成一行行完整的程序代码,这就是本章要学习的东西。学完这章后,你就已经具备了Java程序设计最基本的能力!
第7章Java面向对象程序设计
有了基本功之后,接下来就要真正进入Java面向对象的世界了。从这一章开始,笔者会一步步地让大家了解什么是面向对象的程序设计,如何利用对象来完成我们想要做的事情,而在Java程序语言中又是如何使用面向对象来编写程序的。
第8章深入Java面向对象程序设计
在上一章中初步体验了面向对象程序设计之后,在本章中我们要来探讨更深入的议题,让Java面向对象的概念更完整。
第9章Object类常用方法介绍
Java中所有的东西都是对象,javalangObject类是所有Java程序都会继承的类,为什么所有的Java程序都要继承它?它提供了哪些方法让我们使用?看完本章你就知道了。
第10章深入内存
到底数据是怎么存放在电脑内存中的?不同的数据有不同的存放方式,当然对于程序的编写和数据的使用上也有所差异,我们会在本章中研究这个问题。除此之外,数组对于程序设计也是很重要的一种数据结构,它长什么样子?该如何使用它?也是在本章的讨论之中。
*增加javautilArrays类的使用说明。
第11章Java Application与Applet
Application和Applet是Java中两种基本的程序模式,在本章中会来看看两种程序模式的基本架构和数据处理的方法。
第12章异常处理
由于一些程序代码的特性或是自己程序设计时的特殊,往往会让程序不能完成正常的工作,这种情况也就是所谓的异常。异常处理是Java程序设计中非常重要的一个机制,它可以让你的程序更稳定,我们会在这一章中学会如何去处理异常。
第13章容器和版面配置
从本章开始,我们就要学习如何设计出窗口应用程序。首先在这一章中,我们要来看的是如何来设计窗口程序的外表,也就是版面的设计。
第14章事件处理
我们要使用窗口应用程序,就必须操作放在窗口上的元件,如按钮、菜单等。而这些操作的动作会产生所谓的事件,程序员的工作就是处理这些事件,让每个元件完成它该有的功能。
第15章AWT元件使用
在这一章中,我们就要来学会一些最基本的窗口操作元件,学会了这些元件之后,你就能设计出基本的窗口应用程序了。
第16章高级AWT元件使用
觉得元件还不够用吗?在这一章中还有一些能让你的窗口界面更丰富的元件。
第17章绘图
想在窗口界面上涂鸦吗?来看看这章中介绍哪些Java所提供的绘图方法。
第18章Inner Class
Inner Class就是在类中的类,它存在的意义是什么?它又有哪些特殊的功能?它在Java中也是很重要的一个机制,大家可要仔细地看完这一章。
第19章Wrapper Class
又出现了一个新名词,什么又是Wrapper Class?我们为什么要使用它?它对应的是八种基本数据类型,也就是说它可以把基本数据类型的数据转换成对象的类型,看完这一章,你就知道为什么了。
第20章深入字符串处理
字符串是每个程序中一定会用到的东西,它有哪些不为人知的秘密呢?说秘密太严重了,应该说是它有哪些跟别的对象不一样的地方呢?这一章中会做详细的说明。
*增加StringBuilder类的使用说明。
第21章文件与输入/输出处理
文件是用来存放数据的地方,我们如何通过程序来访问文件中的数据?这就是本章要教你的。
第22章Threads
你想让你的程序能分身吗?什么是多任务应用程序?Threads这个机制就是来做这件事情的,在看这一章时头脑务必要清楚,一不留神就会昏头转向了,这一章是Java中最难学的一部分了。
增加javautilconcurrentTimeUnit 类的使用说明。
第23章Collection
Collection API是另外一种存放数据的类库,学会了它的使用方式,你的程序在处理数据时更能随心所欲。
第24章网络程序设计
网络是现今社会中最热门的媒体,所有的应用程序或多或少都会跟它扯上点关系,如何用Java设计网络应用程序?读完本章你就知道了。
附录Aassertion
assertion是Java 14所新增的一项机制,其他的语言也有类似的机制,想了解它的使用方式吗?任何学Java 14版的人都应该要懂得如何使用它。
附录BJava Web Start
除了Java Applet之外,有没有办法让用户从网页上下载Java Application回去执行呢?来看看本章所介绍的Java Web Start,你就会知道了。
附录CNew I/O
Java 14版最重要的一个部分是新增加了一组New I/O的API包,想要让你程序中的I/O更有效率吗?熟读这章就对了。
附录D泛型——Generics
在Tiger里最重要的一个新的技术非泛型莫属了,第23章所介绍的Collection API跟它有密不可分的关系,如果你常会使用到Collection API,那就一定要把泛型这个新的技术、功能、语法学好,这将有助于程序执行的正确性。
附录EEnum
Enum又称为枚举类型,在Tiger之前我们就已经使用其他的方式来达到枚举类型的设计,现在Tiger里直接支持枚举类型,让你在使用这种写程序的技巧时更方便。
附录FTiger的好帮手
除了前面两章所介绍的泛型与枚举类型外,Tiger里还有四个新的好帮手来帮助你在编写Java程序时更容易,它们分别是foreach循环、static import、Autoboxing/Autounboxing与varags。到底它们是怎么帮助你写好Java程序的呢?读完本章便知道。
附录G简易格式化的输入与输出
你在使用Systemoutprintln这个方法时,常常为了把数据给输出成同一行,使用字符串在那里加来加去吗?又偶尔为了读入数据时需要自行判断读进来的数据是什么格式而烦恼吗?Tiger里新的printf方法与Scanner类可以助你解决这些问题。
附录 HAnnotations
Annotation又可称为metadata,意思是数据的注释或是数据的数据,简单地说就是描述数据的一种语言,在Tiger里被描述的数据就是指程序代码。Java程序代码我们可以加上Java Doc的注释说明,然后产生Java API说明文档,但光是产生说明文档还是不够,我们需要更多有关程序代码的信息,所以Tiger新加入了annotation,想知道详细的内容吗?在学习本章之前,请先打好Java程序设计的基本功。
再版序
时间真的是个很神奇的东西,距离上一版完成一眨眼就过了两年多,两年多可以发生很多事,结婚、生小孩、买房子,天啊!变化真快!这几年下来惟一没变的就是我对Java的支持。去年是个很有收获的一年,可以算是在人生阶段上的一个高峰,有幸参加了全世界最大的Java盛会——JavaOne,感受世界级的会议水准。工作上也很顺利,逐渐在累积实力和知名度。生活上认识了几位好朋友,这几年好朋友一直对我有很大的影响,不论是在工作上或是生活上都给我帮助。
很高兴《Java 2全方位学习》能帮助到许多人,让他们在学习Java的路程中减少了许多困难,各位读者的支持是我努力做到更好的动力来源,我会持续努力写出更好的书,若对书中有任何的疑问或建议,欢迎来信指教。
J2SDK 50(Tiger)上市所带来的冲击非常大,它所提供的一些语言上的改进和好用的API,让你想不用它们都很难,不过在使用Tiger所带来的便利之前,请先把基础给打好,再来学习这些新的功能,不然可是会画虎不成反类犬的。希望这本书能够帮助你在学习Java的路上更顺利。
谢谢广大读者的支持,也谢谢我的家人和好朋友,没有你们我不会有今天的成就。
朱仲杰
20050406
推荐序一——驯服老虎,畅饮咖啡
朱仲杰的《Java 2全方位学习》几年来已经成为台湾学习Java的标准教科书。现在这个新版本在千呼万唤中总算问世了,对众多学习Java的人是一个大好消息。
在很多时候,看似最简单的东西,做起来反而最难。Java应用的范围已经无所不在,Java的相关技术当然也跟着越长越多。只要对Java 2平台有稍微了解的人,面对J2EE、J2ME当中的技术规范,都会在心中兴起“学海无涯”的慨叹。书店里满柜子的Java书籍,介绍各种高级技术的著作多的是。这些高级技术的书籍内容比较艰深,但是从另一个角度来看,对作者来说写起来反而比较顺手。因为作者本身就是高手,技术知识方面没有问题,针对的读者也是有一定程度的人,所以大家已经有了共同的背景,讲起话来相对而言就没有阻碍。反倒是针对刚跨进Java领域的初学者,这样的书籍不但需求比较高,要向这些新手读者清楚解释Java技术,反而是一个更有挑战性的工作。
当然,如果像市面上很多四处拼凑剪贴、很快兜出厚厚一大本的所谓入门书,事情就轻松容易得多。不过这本《Java 2全方位学习》显然不是这样的剪贴板。 J2SE 50版在2004年9月正式推出,它的Beta版在更早之前也已经公开让大家试用。在程序语言本身的革新上面,这可以说是从1997年的JDK 11以来最重要的改版。所以作者花了很多时间去消化、研读、整理这些新功能,然后用最负责的态度来介绍给大家。
朱仲杰是我的老朋友,这几年来Java的发展突飞猛进,我们的人生也有很大的变化。我在去年离开了Java的创始者——升阳电脑(Sun Microsystems),朱仲杰也在这几年内完成了终身大事,接下来又准备迈入“科技老爸”的行列。世事多变化,不过很多事是不会变的,比方说友情、亲情等等。还有另外一个不会变的,就是要学好Java,就得从基本的程序语言上面学起。基础打稳了,就能打通任督二脉,一路继续学下去,才有办法应用在各种实用的领域上。朱仲杰的这本《Java 2全方位学习》,是让你打好基础的武功秘笈。只要努力按照本书的讲解去练习,保证让你功力大增,练完之后必能轻松地驯服凶猛的老虎、畅饮香醇的Java咖啡。
自由人 洪志鹏
http://wwwMichaelSoftorg
推荐序二
从JDK 11到12,从JDK 12到13,从JDK 13到14,每次JDK改版的时候, Sun公司总是告诉大家:这次的改版, 将是一个重要的改版,而且Sun对Java做了很多的改善。
作为一种营销手段,这样的宣传方式绝对是必要的,可是,从JDK 14到50(也可以称作15),除了版本号码一开始就让人一头雾水之外,JDK 50是名副其实的大跃进,这次,真的是Java往前迈进的一大步。
JDK 50开发小组的领导人 Calvin Austin,于2005年1月宣布离开Sun,并在他的Blog(http://blogssunom/roller/page/calvinaustin/20050121)提到,他之所以离开Sun,是因为他相信,JDK 50所做的改进,已经非常完善,是他认为最好的了,因此他才能放心离开。从真正拥有技术背景和威望的人士口中所传达的信息,绝对远胜于营销口号。 您还能视JDK 50的每个新功能于不见吗?
朱仲杰这本Java全方位学习的新版,正是因应这股JDK 50的潮流而改版,并加入了许多新内容,希望带领更多人学习到最新的Java语言。虽然本人常常忌妒他这本书过去的版本为什么卖得那么好,但书卖得好一定有其它的理由,当然也乐于向广大的Java开发人员推荐。
Sun教育训练中心经理
王森
senwang@suncom
推荐序三
能够教会新手的人是好人,能够教会新手的书是好书。
目前对于 Java 的应用越来越普及,学习的渠道也非常多元,无论是上补习班或是上网查询数据,对于每个初学 Java 的学生或是程序员,拥有一本能够加强基础观念,练习相关技巧,临时查阅应用的基础书籍也是很重要的。
J2SE 50 ( Tiger ) 在 2004 年热热闹闹地出现在世人面前,简化了工程师的学习及编写。 很高兴地,朱仲杰先生秉持着优雅的文笔,从专业的角度编写之前几版的 Java 2 全方位学习,让无数优秀的学习者由茫然无知到知晓高深应用。 相信这次的增修版,将会使国内的 Java 学习更多更广更深入。
在我面试许多工程师的经验中,往往许多人对于概念都不清晰,没有花心思实现出一套系统,当然无法找出自己的问题在哪里。 记得我在 JavaWorld@Taiwan 的 “给 Java 新手的一封信”谈到,“新手,大概都要由 J2SE 开始学习”。 无论是服务器端J2EE 应用,或是手机、PDA 等 J2ME 的创作,都必须要有 J2SE 的观念与基础。 所以,这本书范例与观念并重,真的是值得初学者与高级使用者购买使用。
朱仲杰先生是一个风趣不失典范的君子,能够和他认识算是相见恨晚。看到他花心思为这本书整理相关数据,不断仔细斟酌文句的通畅及测试相关的学习步骤及范例程序,我相信,技术的学习不是难事,关键是是否有正确的指引,而朱先生的这本书,犹如在大海中航行的指南针,将为您指引 Java 技术上正确的方向。
jini ( 99% Jakarta )
SoftLeader TechCorpTaiwan
CTO
2005/03
朱仲杰:中国台湾知名Java技术专家和畅销书作家。擅长J2ME移动应用开发、J2EE企业系统构建、JCOE技术导入和软件开发项目管理。曾担任JavaOne Tokyo 2005讲师、JavaTwo 2001至2005年讲师,著有多本畅销Java技术图书。
第1章Java 的过去、现在和未来
11Java的历史
12Java的架构
121Java的语法
122Java的执行环境
123Java API简介
13Java的优点
14Java未来的发展
15Tiger的全新体验
16本章总结
17课后习题
18参考文献
第2章程序开发工具下载、安装与使用
21JDK下载、安装与设定
211Java 2 SDK
212Java说明文档
22程序编辑工具下载、安装、设定与使用
221UltraEdit
222jEdit
23本章总结
24课后习题
25参考文献
第3章程序初体验
31开始写程序
32使用记事本
321程序编辑
322程序编译
323程序执行
33UltraEdit
331程序编辑
332编译程序
333执行程序
34jEdit
341程序编辑
342程序编译
343程序执行
35程序说明
36范例欣赏
37本章总结
38课后习题
39参考文献
基础篇
第4章程序基本单元
41程序中的标记
411关键字
412标识符
413Literal
414符号
42数据类型
421基本数据类型
422变量的声明
423类型转换
43字符串
44本章总结
45课后习题
46参考文献
第5章Java的表达式
51算术运算
52比较运算
53逻辑运算
54递加、递减运算
55赋值运算
56位运算
57位移运算
58优先级和结合性
59本章总结
510课后习题
511参考文献
第6章Java的语句
61认识语句
62一般语句
621注释
622赋值语句
623对象的使用 (方法的调用)
624其他
63声明语句
631变量的声明
632对象的声明
633类的声明
634方法的声明
64条件控制语句
641if
642else
643嵌套式的if
644?:操作符
645switch
65循环控制语句
651for
652while
653dowhile
654高级循环控制
66本章总结
67课后习题
68参考文献
高级篇
第7章Java面向对象程序设计
71从日常生活中看对象
711类与对象
712成员
713继承
714多态
72用Java实现面向对象程序设计
721定义类
722定义成员
723产生与使用对象
724初看构造函数
725封装
726类的继承
727类的多态
728类成员与实例成员
729再看构造函数
7210重载、遮蔽与改写
73本章总结
74课后习题
75参考文献
第8章深入Java面向对象程序设计
81包的使用
811什么是包
812package语句
813import语句
814classpath的设定
815访问权限修饰符的使用
82final修饰符
83抽象类
84接口
85本章总结
86课后习题
87参考文献
第9章Object类常用方法介绍
91类的类型转换
92对象之间的比较运算
93hash code
94对象的复制
95将对象转为字符串
96本章总结
97课后习题
98参考文献
第10章深入内存
101声明
1011变量
1012 对象
102数组
1021数组的产生
1022数组的使用
1023length属性
1024数组的复制
1025多维数组
1026对象数组
1027javautilArrays API使用
103变量的访问范围
104参数传递
1041基本数据类型参数值传递
1042类对象类型参数值传递
105垃圾回收
1051Garbage Collection简介
1052调用GC
1053finalize方法
1054回收顺序
1055GC的执行时间
106本章总结
107课后习题
108参考文献
第11章Java Application与Applet
111Application
1111输入与输出
1112系统参数
1113System类使用
1114Runtime类使用
112Applet
1121输入与输出
1122基本方法使用
1123安全性
113Application与Applet合并
114本章总结
115课后习题
116参考文献
第12章异常处理
121认识异常
1211Runtime Exception
1212Checked Exception
1213Error
122捕捉和处理异常
1221捕捉异常try…catch
1222处理异常
1223finally
1224异常捕捉的顺序
1225throws关键字的使用
123自己设计异常
1231throw关键字的使用
1232定义自己的Exception类
124异常与方法的改写
125本章总结
126课后习题
127参考文献
GUI篇
第13章容器和版面配置
131认识AWT
132Container
1321Frame
1322Panel
133版面配置
1331什么是Layout
1332BorderLayout
1333FlowLayout
1334CardLayout
1335GridLayout
1336GridBagLayout
1337不使用Layout
134本章总结
135课后习题
136参考文献
第14章事件处理
141认识事件处理机制
1411什么是事件
1412Java事件处理架构
1413委托模式
1414AWT Event类架构
142使用事件处理机制
1421WindowEvent
1422MouseEvent
1423KeyEvent
1424其他Lowlevel Event
143本章总结
144课后习题
145参考文献
第15章AWT元件使用
151Button
152Checkbox
1521多重选择
1522单一选择
153Choice
154List
155Label
156Scrollbar
157ScrollPane
158TextField
159TextArea
1510本章总结
1511课后习题
1512参考文献
第16章高级AWT元件使用
161Font
162Color
163Menu
164Dialog
165FileDialog
166本章总结
167课后练习
168参考文献
内功心法篇
第17章绘图
171认识Graphics类
1711产生Graphics对象
1712paint方法
1713Canvas类
1714坐标
172基本绘图方法
1721画线
1722画字符串
1723画矩形
1724画圆
1725画多边形
173高级绘图方法
1731颜色设置
1732字体设置
1733语句块处理
174本章总结
175课后习题
176参考文献
第18章Inner Class
181认识Inner Class
182成员式Inner Class
183区域式Inner Class
184匿名式Inner Class
185本章总结
186课后习题
187参考文献
第19章Wrapper Class
191认识Wrapper Class
192Integer类
193Boolean类
194Byte类
195Character类
196Double类
197Float类
198Long和Short类
199本章总结
1910课后习题
1911参考文献
第20章深入字符串处理
201深入了解String对象
2011产生String对象
2012String类的方法使用
202StringBuffer类使用
2021产生StringBuffer对象
2022StringBuffer类的方法使用
203StringTokenizer类使用
2031建立StringTokenizer对象
2032StringTokenizer类的方法使用
204本章总结
205课后习题
206参考文献
第21章文件与输入/输出处理
211javaio包简介
2111Stream
2112Node
2113方法使用
212文件处理
2121文件操作
2122文件访问
213数据流连结
214对象序列化
215本章总结
216课后习题
217参考文献
第22章Threads
221认识Threads
222建立Threads
223Threads操作
2231启动Threads
2232停止Threads执行
2233暂停Threads执行
2234取得Threads信息
224数据同步处理
225Threads高级操作
226本章总结
227课后习题
228参考文献
第23章Collection
231认识Collection库
232Set接口使用
233List接口使用
234Iterator接口使用
235Map接口使用
236JDK 11中的Collection库
237本章总结
238课后习题
239参考文献
第24章网络程序设计
241网络基本概念
2411ClientServer架构
2412网际网络地址
2413TCP/IP传输协议
2414面向连接协议
2415非面向连接协议
2416连接端口
2417Socket
242Java网络类
2421InetAddress类
2422Socket类
2423ServerSocket类
2424DatagramSocket类和DatagramPacket类
243本章总结
244课后习题
245参考文献
附录
附录Aassertion
A1什么是assertion
A2assertion的语法
A3编译与执行
A4Java assertion的设计哲学
A5适当地使用assertion机制
A6ClassLoader类和Throwable类的新方法
A7本章总结
A8课后习题
A9参考文献
附录BJava Web Start
B0前言
B1认识Java Web Start
B2使用Java Web Start
B3Java Web Start设定
B4Java Web Start应用程序设计
B41执行其他Java Web Start应用程序
B42设计Java Web Start应用程序
B5Tiger里的Java Web Start
B6本章总结
B7课后习题
B8参考文献
附录CNew I/O
C1认识New I/O API
C2Channels和Buffers
C21Channels
C22Buffers
C23ByteBuffer类
C3Buffer范例实现
C4FileChannel类
C41数据传送
C42数据合并与分流
C43文件锁定
C44其他方法
C5本章总结
C6课后习题
C7参考文献
附录D泛型——Generics
D1泛型初体验
D11ClassCastException
D12泛型让你的程序更安全
D2深入了解泛型
D3高级使用
D31 Xlint
D32Map也一样
D33方法参数与返回值
D34泛型类型的转型
D4制作自己的泛型类
D5看懂Java API说明文档
D6本章总结
D7参考文献
附录EEnum
E1回顾从前
E2枚举式数据最佳的解决方案
E3深入了解Enum
E31骨子里还是个类
E32javalangEnum类方法使用说明
E33Enum声明
E34static import使用说明
E35foreach循环使用说明
E36switch使用说明
E4配合Enum的新API
E41 Enum枚举类型方法声明
E42javautilEnumMap使用说明
E43javautilEnumSet使用说明
E5本章总结
E6参考文献
附录FTiger的好帮手
F1Foreach
F11数组的运用
F12Collection对象的运用
F13自行设计可顺序读取的类
F14foreach循环的限制
F2Static import
F21基本用法
F22重载
F23遮蔽
F3varags
F31什么是varags
F32如何使用
F33使用限制
F4Autoboxing与Autounboxing
F41Autoboxing与Autounboxing是什么
F42使用限制
F43条件判断式使用
F44方法重载
F5本章总结
F6参考文献
附录G简易格式化的输入与输出
G1简易输出
G11回顾javatextFormat
G12认识javautilFormatter
G2简易输入
G21回顾
G22认识javautilScanner
G3本章总结
G4参考文献
附录HAnnotations
H1认识Annotation
H11什么是Annotation
H12Tiger默认的三个Annotation类型
H13Annotation的种类
H2Metaannotation
H21什么是Metaannotation?
H22Target
H23Retention
H24Documented
H25Inherited
H3设计自己的Annotation类型
H31动手设计自己的Annotation类型
H32使用它们
H33写个工具来测试
H4本章总结
H5参考文献