From 9794edcdd162f8fab4e31b8d65c632e5817094b7 Mon Sep 17 00:00:00 2001 From: subaochen Date: Fri, 11 Oct 2019 10:14:19 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guide/io.lyx | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/guide/io.lyx b/guide/io.lyx index f9d44a8..c26821d 100644 --- a/guide/io.lyx +++ b/guide/io.lyx @@ -4570,10 +4570,19 @@ status open \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout String toString() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4590,10 +4599,19 @@ String toString() \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path getFileName() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4611,10 +4629,19 @@ etFileName实际上会调用返回的Path对象的toString方法。 \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path getName(int index) \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4631,10 +4658,19 @@ Path getName(int index) \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout int getNameCount() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4651,10 +4687,19 @@ int getNameCount() \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path subpath(int beginIndex, int endIndex) \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4672,10 +4717,19 @@ Path subpath(int beginIndex, int endIndex) \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path getParent() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4693,10 +4747,19 @@ Path getParent() \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path getRoot() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4810,17 +4873,36 @@ status open \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout URI toUri() \end_layout +\end_inset + + +\end_layout + \end_inset \begin_inset Text \begin_layout Plain Layout -使用Uri方式描述路径。对于本地文件(文件系统)使用file协议,因此URI的形式如file:///path-to-file +使用 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Uri +\end_layout + +\end_inset + +方式描述路径。对于本地文件(文件系统)使用file协议,因此URI的形式如file:///path-to-file \end_layout \end_inset @@ -4830,10 +4912,19 @@ URI toUri() \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path toAbsolutePath() \end_layout +\end_inset + + +\end_layout + \end_inset @@ -4850,11 +4941,20 @@ Path toAbsolutePath() \begin_inset Text +\begin_layout Plain Layout +\begin_inset Flex Code +status open + \begin_layout Plain Layout Path toRealPath(LinkOption... options) throws IOException \end_layout +\end_inset + + +\end_layout + \end_inset From fc265dc0a72e9393c8afee78c734167f41462969 Mon Sep 17 00:00:00 2001 From: subaochen Date: Mon, 14 Oct 2019 17:44:11 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Planet=E7=BB=83=E4=B9=A0?= =?UTF-8?q?=E7=9A=84=E8=BF=9B=E4=B8=80=E6=AD=A5=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guide/enum.lyx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/guide/enum.lyx b/guide/enum.lyx index f849706..685ff93 100644 --- a/guide/enum.lyx +++ b/guide/enum.lyx @@ -827,7 +827,17 @@ cSignal增加了value属性以表明不同颜色交通信号灯所代表的意 \end_inset 或者“hold on”时,只需要修改TrafficSignal类的定义即可,其他引用TrafficSignal的类都不需要修改,也就是说,我们的代码可以很好的适 -用未来的变化:用尽量小的代价应对未来的需求变化,软件的可维护性就大大提高了。 +用未来的变化:用尽量小的代价应对未来的 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +需求变化 +\end_layout + +\end_inset + +,软件的可维护性就大大提高了。 \begin_inset Flex Emph status open @@ -872,7 +882,7 @@ reference "Month.java" \end_layout \begin_layout Exercise -定义一个enum Planet表示太阳系各行星的名称、质量和半径。 +定义一个enum Planet表示太阳系各行星的名称、质量和半径,并设计一个方法计算在这个星球上的物体的重量。 \begin_inset CommandInset label LatexCommand label name "exer:定义一个enum-Planet表示太阳系各行星的名称、质量和半径" From 6555ec6c3978dbb9e9611d5c3659a54b3acf2adf Mon Sep 17 00:00:00 2001 From: subaochen Date: Sat, 29 Aug 2020 23:03:19 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=99=E6=A1=88?= =?UTF-8?q?=EF=BC=8Cnot=20finished?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guide/imgs/intro/duke.png | Bin 0 -> 17756 bytes guide/intro.lyx | 6 +- guide/lecture_guide/lecture1.lyx | 3670 ++++++++++ guide/lecture_guide/lecture2.lyx | 3770 ++++++++++ guide/lecture_guide/lecture3.lyx | 9340 +++++++++++++++++++++++++ guide/lecture_guide/lecture_guide.lyx | 233 + guide/lecture_guide/readme.MD | 1 + guide/tests-guide.lyx | 4 +- 8 files changed, 17019 insertions(+), 5 deletions(-) create mode 100644 guide/imgs/intro/duke.png create mode 100644 guide/lecture_guide/lecture1.lyx create mode 100644 guide/lecture_guide/lecture2.lyx create mode 100644 guide/lecture_guide/lecture3.lyx create mode 100644 guide/lecture_guide/lecture_guide.lyx create mode 100644 guide/lecture_guide/readme.MD diff --git a/guide/imgs/intro/duke.png b/guide/imgs/intro/duke.png new file mode 100644 index 0000000000000000000000000000000000000000..878543f3419eb321dade4a544b527caed8831502 GIT binary patch literal 17756 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 + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第一次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java在程序设计语言中的霸主地位" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java在程序设计语言中的霸主地位" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java简史" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java简史" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java的特点" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java的特点" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java开发环境的搭建" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java开发环境的搭建" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:初识Java的输入输出" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:初识Java的输入输出" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java的开发环境如何搭建 +\end_layout + +\begin_layout Enumerate +如何创建简单的Java应用程序 +\end_layout + +\begin_layout Enumerate +对Java的输入输出有个初步的印象 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Java的输入输出 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +了解Java语言的来历和特点; +\end_layout + +\begin_layout Enumerate +掌握Java开发环境的搭建方法和基本用法; +\end_layout + +\begin_layout Enumerate +熟悉Java的输入输出方法。 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java为什么能够异军突起,在众多程序设计语言中发展的这么好? +\end_layout + +\begin_layout Enumerate +在大数据、人工智能蓬勃发展的今天,Java是否依然是主流程序设计语言,为什么? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +初识Java +\begin_inset CommandInset label +LatexCommand label +name "chap:初识Java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/intro/java-concept.png + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Section +Java在程序设计语言中的霸主地位 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java在程序设计语言中的霸主地位" + +\end_inset + + +\end_layout + +\begin_layout Standard +自从发明了计算机,程序设计语言就成了一门专门的技艺,至今人类已经发明了上千种程序设计语言 +\begin_inset CommandInset citation +LatexCommand cite +key "progamming-lang-stats" +literal "true" + +\end_inset + +。从权威统计机构TIOBE +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://www.tiobe.com/ +\end_layout + +\end_inset + +的最新流行度统计结果可以看出,Java程序设计语言在最近的十五年几乎牢牢的占据了头名座椅。此后的10年、20年,Java的霸主地位会动摇吗?根据ruby之父松本 +行弘的自述,ruby从开始开发到发布用了3年左右的时间,在程序员圈子中拥有一定的知名度则又花了4年的时间,再到通过Ruby on Rails而走红,则又花了5年 +的时间 +\begin_inset CommandInset citation +LatexCommand cite +after "p109" +key "code-future" +literal "true" + +\end_inset + +。可见,程序设计语言的发展和进化是相对缓慢的一个过程,因此笔者大胆推断,至少在未来10年,Java和C仍然会是主流的程序设计语言。学好Java是IT职业生涯的不 +二敲门砖。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/tiobe_top_langs.pdf + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +最近15年top 10程序设计语言 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Java简史 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java简史" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java程序设计语言是不是天生丽质,一开始就大红大紫呢? +\end_layout + +\begin_layout Standard +让我们穿越到1990年,了解一下Java的前生和今世,看一看它当年是如何降临人间的 +\begin_inset CommandInset citation +LatexCommand cite +key "java-history-wikimedia" +literal "true" + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +Java的前生:Oak的诞生 +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement l +overhang 0in +width "20line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/duke.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的吉祥物 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java的吉祥物" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +1990年12月,当时的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Sun公司 +\end_layout + +\end_inset + +Sun公司开始了一个叫做“Stealth计划”的内部项目,由帕特里克.诺顿领衔,起因是公司自己开发的C++和C语言编译器很难用,帕特里克被搞的焦头烂额。“Stea +lth计划”后来改名为“Green计划”, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +詹姆斯.高斯林 +\end_layout + +\end_inset + +詹姆斯.高斯林(人称“Java之父”,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:詹姆斯.高斯林" + +\end_inset + +)和麦克.舍林丹加入到了帕克里克的工作小组。Sun公司预计未来的家用电器必将向智能化方向发展,于是“Green计划”的目标是打造一款智能家电程序设计语言及其平台。 +\end_layout + +\begin_layout Standard +团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家比尔.乔伊,发现C++在嵌入式系统上存在很大问题。因为嵌入式系统可以使用的资源有限,而C++缺乏垃圾 +回收机制以及可移植的安全性、分布式程序设计和多线程等特性。于是,乔伊决定开发一种集C语言和Mesa语言大成的新语言,乔伊把它叫做“未来”。他提议Sun公司的工程 +师应该在C++的基础上,开发一种新的面向对象的程序设计语言。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ –:多么糟糕的命名啊,高斯 +林自己后来也放弃了这个名字。直到某一天,高斯林把这种新的语言命名为“Oak +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Oak +\end_layout + +\end_inset + +”(橡树),这是他办公室外的一棵橡树。 +\end_layout + +\begin_layout Standard +就像很多开发新技术的秘密工程一样,Green团队没日没夜的工作到了1992的夏天,终于能够演示新平台的一部分了,包括Green操作系统、Oak程序设计语言、类库 +及其硬件。Green的最初设想是用于一种叫做Star7的类PDA设备,这种设备在当时由鲜艳的图形界面和被称为“Duke”(Duke后来称为Java的吉祥物,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的吉祥物" + +\end_inset + +)的智能代理来帮助用户。1992年12月3日,Star7正式面世。 +\end_layout + +\begin_layout Standard +同年11月,Green计划的成果转化成为“FirstPerson有限公司”,这是一个Sun公司 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Sun公司 +\end_layout + +\end_inset + +的全资子公司。FirstPerson团队对于打造高度互动的设备感兴趣,当时代华纳发布了一个电视机顶盒的征求提议书时,FirstPerson决定响应时代华纳的提议 +,提出了一个机顶盒平台方案。但是当时的有线电视界觉得FirstPerson的平台给予了用户过多的控制权,最终FirstPerson输给了SGI。FirstPer +son与3DO公司的另外一笔关于机顶盒的交易也没有成功,也就是说,FirstPerson公司在电视工业没有取得任何效益,Sun公司不得不收回了FirstPers +on公司。幸运的是, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Oak +\end_layout + +\end_inset + +Oak语言的命运并没有就此止步。 +\end_layout + +\begin_layout Subsection +Java拥抱互联网,横空出世 +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement o +overhang 0in +width "50col%" +status open + +\begin_layout Plain Layout +\align right +\begin_inset Graphics + filename ../imgs/intro/James_Gosling_2008.jpg + lyxscale 30 + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +詹姆斯.高斯林 +\begin_inset CommandInset label +LatexCommand label +name "fig:詹姆斯.高斯林" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +1994年6月,在经历了一场历时三天的脑力激荡的讨论后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次做出 +重大决定,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器 +\begin_inset Foot +status open + +\begin_layout Plain Layout +Mosaic是浏览器的鼻祖,参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://en.wikipedia.org/wiki/Mosaic_(web_browser) +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来 +改名为 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +HotJava +\end_layout + +\end_inset + +HotJava。 +\end_layout + +\begin_layout Standard +\align block +1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java 1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公 +开发布却是在1995年3月23日SunWorld大会上进行的。Sun公司的科学指导约翰·盖吉宣告了Java技术的诞生。这个发布是与网景公司的执行副总裁马克·安德 +森的惊人发布一起进行的:网景宣布将在其浏览器中包含对Java的支持,这在当时引起了很大的轰动。1996年1月,Sun公司成立了Java业务集团,专门开发Java +技术。这一次,詹姆斯.高斯林等终于扬眉吐气了,Java此后的发展虽然也不是一帆风顺,但是到今天,Java可谓如日中天, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +詹姆斯.高斯林 +\end_layout + +\end_inset + +詹姆斯.高斯林也被称为“Java之父”, +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:詹姆斯.高斯林" + +\end_inset + +为詹姆斯.高斯林本尊。 +\end_layout + +\begin_layout Subsection +Sun公司没落,Java易手Oracle +\end_layout + +\begin_layout Standard +然而,天有不测风云,当年像太阳一样耀眼的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Sun公司 +\end_layout + +\end_inset + +Sun公司,在2002年突然衰落 +\begin_inset Foot +status open + +\begin_layout Plain Layout +关于Sun衰落的原因,网络上有大量的讨论,比如:http://tech.sina.com.cn/it/2011-03-04/16485248026.shtml +\end_layout + +\end_inset + +,从此便江河日下,一下从硅谷最值钱的公司沦为人均市值最低的公司。由于种种原因,2009年4月20日,Sun公司以74亿美元(要知道,2001年,Sun的市值超过 +2000亿美元)整体出售给了 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Oracle +\end_layout + +\end_inset + +Oracle,从此Java易手,Oracle开启了Java发展的新历程。通过 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java简史" + +\end_inset + +我们可以简要的了解Java发展的历程 +\begin_inset CommandInset citation +LatexCommand cite +key "java-brief-history" +literal "true" + +\end_inset + +和各个版本发布的时间 +\begin_inset Foot +status open + +\begin_layout Plain Layout +如果你对Java的历史特别感兴趣,可以参考以下的几个站点: +\end_layout + +\begin_layout Itemize +Oracle庆祝Java 20年: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://oracle.com.edgesuite.net/timeline/java/ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +Java 20年:历史与未来: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://www.infoq.com/cn/news/2015/05/java-20-history-future +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/java-history.png + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java简史 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java简史" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +补充一下Java在服务器领域的市场份额 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Java的特点 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的特点" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +参考自:htp://zh.wikipedia.org/wiki/java +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要重写,暂时内容来自:https://zh.wikipedia.org/wiki/Java +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +面向对象 +\end_layout + +\begin_layout Standard +Java的特点之一就是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +面向对象 +\end_layout + +\end_inset + +面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。 +一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和 +设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。 +\end_layout + +\begin_layout Subsection +跨平台 +\end_layout + +\begin_layout Standard +Java语言的第二个特性就是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +跨平台 +\end_layout + +\end_inset + +跨平台性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”(write + once, run anywhere)。 +\end_layout + +\begin_layout Standard +执行Java应用程序必须安装Java Runtime Environment(JRE +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRE +\end_layout + +\end_inset + +),JRE内部有一个Java虚拟机(Java Virtual Machine, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JVM +\end_layout + +\end_inset + +JVM)以及一些标准的类库(Class Library)。通过JVM才能在电脑系统执行Java应用程序(Java Application),这与.Net + Framework的情况一样,所以电脑上如果没有安装JVM,Java应用程序将不能够执行。 +\end_layout + +\begin_layout Standard +实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟 +机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的访问工作。需要注意的是,尽管已经存在一个进行代码翻译的 +解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。 +\end_layout + +\begin_layout Standard +有些编译器,比如GCJ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +GCJ +\end_layout + +\end_inset + +,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +甲骨文公司对于Java的许可是“全兼容的”,这也导致了微软和Sun关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。Sun最终赢得了官司, +获得了大约两千万美元的赔偿,法院强制要求微软执行Sun公司关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本 +,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程序和控件的支持。但是Sun公司和其他使用Java运行时系统 +的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高 +出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序。 +\end_layout + +\begin_layout Standard +Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JIT +\end_layout + +\end_inset + +JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为 +,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。 +\end_layout + +\begin_layout Standard +程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会 +出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。以Java + AWT为例,早期Java AWT内提供的按钮、文字区等均是以电脑系统所默认的样式而显示。这令Java程序在有些没有提供图案的电脑系统产生错误(在Microso +ft Windows设有窗口管理器,在一些Linux distribution则没有)。后来SUN公司针对Java AWT一些问题而推出Java + Swing。 +\end_layout + +\begin_layout Standard +平台无关性让Java在 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +服务器端 +\end_layout + +\end_inset + +服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立,比如占据了WWW服务器半壁江山的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Apache +\end_layout + +\end_inset + +Apache服务器 +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://www.apache.org +\end_layout + +\end_inset + +,当下火爆的大数据平台Hadoop +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Hadoop +\end_layout + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://hadoop.apache.org +\end_layout + +\end_inset + +等,都是使用Java语言开发的。 +\end_layout + +\begin_layout Subsection +自动垃圾回收 +\end_layout + +\begin_layout Standard +C++语言被用户诟病的原因之一是大多数C++编译器不支持垃圾收集机制 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +垃圾收集机制 +\end_layout + +\end_inset + +。通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机内存堆栈上分配一块内存与地址,当不需要此对象时,进行析构或者删除的时候再释放分配的内存地址。如果 +对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +内存泄漏 +\end_layout + +\end_inset + +内存泄漏(Memory Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的内存空间。而且如果同一内存地址被删除两次的话,程序会变得不 +稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为NULL,然后在删除之前先判断指针是否为NULL。 +\end_layout + +\begin_layout Standard +C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++托管扩 +展被微软的Visual C++ 7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的 +话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员 +在需要使用多态特性进行自动清理时也可能束手无策。 +\end_layout + +\begin_layout Standard +Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的创建和放置都是在内存堆栈上面进行的。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发 +挥作用, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +自动 +\end_layout + +\end_inset + +删除这个对象所占用的空间,释放内存以避免内存泄漏。 +\end_layout + +\begin_layout Standard +注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用时,内存泄漏仍 +然不可避免。 +\end_layout + +\begin_layout Standard +不同厂商、不同版本的JVM中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界 +上最快的JVM,JVM性能的世界纪录也在不断的被打破并提高。 +\end_layout + +\begin_layout Exercise +Java语言可以跨平台的秘诀是什么? +\end_layout + +\begin_layout Section +Java开发环境的搭建 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java开发环境的搭建" + +\end_inset + + +\end_layout + +\begin_layout Standard +学习一门程序设计语言,最佳实践是边读边练,在一个“全浸”的环境中学习,自然就轻松多了。因此,我们从一开始就搭建一个“舒服”的开发环境,学习中的每一步我们都在这个 +舒服的开发环境中验证,这样我们走的每一步都是扎实的,串起来就是一个坚实的学习之旅。 +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Linux +\end_layout + +\end_inset + +Linux是学习程序设计的绝佳搭档,因此笔者建议大家在Linux平台上开始Java的学习之旅。Linux的发布版比较多,根据笔者多年的教学经验,建议大家选择 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Ubantu +\end_layout + +\end_inset + +Ubantu的最新LTS版本即可,下面的Java开发环境的搭建均基于Ubuntu 16.04(写作本书时的最新LTS版本)。 +\end_layout + +\begin_layout Subsection +Java版本的选择 +\end_layout + +\begin_layout Standard +Java分为三个版本: +\end_layout + +\begin_layout Itemize +Java SE(Java Standard Edition):Java的标准版,包含了常见的Java应用程序开发和运行所需的环境。本书此后如没有特别说明,Jav +a都是指Java SE。 +\end_layout + +\begin_layout Itemize +Java EE(Java Enterprise Edition):Java的企业版,包含了Java的一些高级特性,如Servlet,JDBC等。 +\end_layout + +\begin_layout Itemize +Java ME(Java Micro Edition):Java的移动版,包含了开发移动终端应用程序所需的环境。不过,自从Android横空出世,Java + ME几乎就没有多大市场了。 +\end_layout + +\begin_layout Subsection +JDK的概念 +\begin_inset CommandInset label +LatexCommand label +name "subsec:JDK的概念" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDK +\end_layout + +\end_inset + +JDK(Java Development Kit)是开发Java应用程序的必备,提供了开发Java应用程序的必须工具,比如: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +java +\end_layout + +\end_inset + +java +\end_layout + +\end_inset + +:Java虚拟机,任何Java应用程序都是通过java这个虚拟机解释执行的。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +javac +\end_layout + +\end_inset + +javac +\end_layout + +\end_inset + +:Java编译器,将Java源代码编译为java虚拟机可以理解的字节码文件。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +javap +\end_layout + +\end_inset + +javap +\end_layout + +\end_inset + +:反编译工具,可以粗略的认为,javap能够将二进制文件还原为Java源代码,帮助我们了解javac的工作原理。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +详细的JDK工具列表在 +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:下载和安装JDK" + +\end_inset + +(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:下载和安装JDK" + +\end_inset + +)之后转到bin目录浏览,在ubuntu下面通过以下命令 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +也许你安装的JDK版本和这里不一致。可以通过这个命令了解你的电脑上安装的是哪个版本的JDK:dpkg -l | grep -i +\begin_inset Quotes eld +\end_inset + +openjdk +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\end_inset + +了解JDK包含了哪些命令和工具: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ dpkg -L openjdk-8-jdk-headless | more +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +基础开发环境 +\end_layout + +\begin_layout Standard +在ubuntu环境下,下载和安装 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDK +\end_layout + +\end_inset + +JDK可以简单的执行下列命令来完成 +\begin_inset Foot +status open + +\begin_layout Plain Layout +如果你使用的是windows,请参考 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://jingyan.baidu.com/article/eae07827a4b4a31fec548535.html +\end_layout + +\end_inset + +了解windows下JDK的安装和设置方法。由于Java是跨平台的,因此JDK安装后的用法都是一样的,本书不再强调windows和Linux中Java的用法区别 +。 +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ sudo apt-get install openjdk-8-jdk +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +就这些了!是不是很简单? +\end_layout + +\begin_layout Standard +验证一下Java是不是已经安装好了,执行命令: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ java -version +\end_layout + +\begin_layout Plain Layout +openjdk version "1.8.0_91" +\end_layout + +\begin_layout Plain Layout +OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14) +\end_layout + +\begin_layout Plain Layout +OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode) +\end_layout + +\begin_layout Plain Layout +$ which java +\end_layout + +\begin_layout Plain Layout +/usr/bin/java +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,我们安装的是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +openjdk +\end_layout + +\end_inset + +openjdk +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://openjdk.java.net/ +\end_layout + +\end_inset + +,不是Oracle官方的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDK +\end_layout + +\end_inset + +JDK。对于我们学习Java程序设计而言,openjdk就足够了。如果你介意的话,也可以去下载Oralce官方的JDK,不再赘述。 +\end_layout + +\begin_layout Standard +现在,我们就可以尝试编写HelloWord了!使用任意的文本编辑器编写下面的程序代码并保存为HelloWorld.java: +\end_layout + +\begin_layout Example +使用Java语言向世界问好 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/intro/src/HelloWorld.java" +lstparams "caption={HelloWorld.java},label={HelloWorld.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +打开一个终端,执行下面的命令编译HelloWorld.java: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ javac HelloWorld.java +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +执行下面的命令欣赏HelloWorld吧: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ java HelloWorld +\end_layout + +\begin_layout Plain Layout +Hello World! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Itemize +注意在编写HelloWorld.java源文件时,文件名HelloWorld和源文件中的HelloWorld要严格一致的。 +\end_layout + +\begin_layout Itemize +执行java的class文件时,java命令后面的参数不要带class字样,即,如果执行HelloWorld.class,则只输入java HelloWorld即 +可,千万不要画蛇添足变成java HelloWorld.class。Java虚拟机会根据HelloWorld自动去寻找HelloWorld.class,如果在终端输 +入java HelloWorld.class,java虚拟机就会去寻找HelloWorld.class.class文件,自然就找不到了。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +请说明JDK中,哪个程序是Java虚拟机?哪个程序是Java编译器? +\end_layout + +\begin_layout Subsection +IDE开发环境 +\end_layout + +\begin_layout Standard +终端界面(命令行方式)对于编写一个简单的程序很方便,但是终端界面毕竟缺少了一些方便程序设计的功能,比如代码自动提示和补全、文件浏览等,因此在实际的学习和开发中, +往往使用所谓的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +IDE +\end_layout + +\end_inset + +IDE(Integrated Development Enviroment)环境。Java开发中主流的IDE有如下三种: +\end_layout + +\begin_layout Itemize +JetBrain Idea +\end_layout + +\begin_layout Itemize +eclipse +\end_layout + +\begin_layout Itemize +NetBeans +\end_layout + +\begin_layout Standard +笔者推荐大家使用第一种:JetBrain Idea。 +\end_layout + +\begin_layout Subsubsection +Idea +\end_layout + +\begin_layout Standard +JetBrains +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Idea +\end_layout + +\end_inset + +Idea是 +\begin_inset CommandInset href +LatexCommand href +name "JetBrains" +target "https://www.jetbrains.com" +literal "false" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +https://www.jetbrains.com +\end_layout + +\end_inset + +公司出品的优秀Java IDE环境,是很多Java高手的最爱,google公司也将android开发的IDE:android studio构建在IDEA的基础之 +上(最早的android集成开发环境是作为eclipse的插件存在的,估计google公司对eclipse的插件效率和管理方式不满意,于是另起炉灶,在IDEA的 +基础上开发了android studio)。 +\end_layout + +\begin_layout Standard +IDEA分为免费的社区版和收费的旗舰版,对于Java初学者而言,社区版的功能已经足以应付。 +\end_layout + +\begin_layout Paragraph* +下载和安装Idea +\end_layout + +\begin_layout Standard +从 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://www.jetbrains.com/idea/ +\end_layout + +\end_inset + + 选择Community版本下载即可。请根据所使用的操作系统选择不同的压缩格式。作者使用的是Linux操作系统,因此选择的是tar.gz不带JDK的安装包。假设最 +新的idea下载到了~/downloads目录下。作者的习惯是在家目录建立一个devel目录,然后将所有软件开发相关的工具等都放到devel目录下,因此将下载的 +idea安装文件解压缩: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +$ cd ~/downloads +\end_layout + +\begin_layout Plain Layout +$ tar xzvf ideaIC-2016.3.4-no-jdk.tar.gz -C ~/devel +\end_layout + +\begin_layout Plain Layout +$ cd ~/devel/idea-IC-163.12024.16/bin +\end_layout + +\begin_layout Plain Layout +$ ./idea.sh +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +第一次启动Idea的时候需要进行简单的配置,目前阶段全部选择默认选项既可。 +\end_layout + +\begin_layout Paragraph* +创建新项目 +\end_layout + +\begin_layout Standard +下面以HelloWorld为例说明如何使用Idea创建一个简单的Java应用程序。 +\end_layout + +\begin_layout Enumerate +创建新项目。通过File->New菜单打开创建新项目的窗口,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:新建项目的菜单" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择项目类型" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +从菜单新建项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:新建项目的菜单" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-2.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择项目类型 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择项目类型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +接着,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择从模板创建项目" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:填写项目名称和所在目录" + +\end_inset + +所示,填写项目名称和所在目录,Idea自动创建项目目录和一个默认的Main文件。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-3.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择从模板创建项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择从模板创建项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-4.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +填写项目名称和所在目录 +\begin_inset CommandInset label +LatexCommand label +name "fig:填写项目名称和所在目录" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Enumerate +编写源代码。在自动打开的Main文件中,编写源代码,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:编写源代码" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-5.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +编写源代码 +\begin_inset CommandInset label +LatexCommand label +name "fig:编写源代码" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +源代码编写完毕后,可以将Main这个文件改名字为HelloWorld,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:修改类名" + +\end_inset + +所示,当光标停在Main上面时,两次按Shift+F6修改类名。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-6.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +修改类名 +\begin_inset CommandInset label +LatexCommand label +name "fig:修改类名" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +运行应用程序。如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:运行应用程序" + +\end_inset + +所示,在右键单击弹出的菜单中选择“Run”运行 +\begin_inset Foot +status open + +\begin_layout Plain Layout +Ctrl+Shift+F10是运行应用程序的快捷键。 +\end_layout + +\end_inset + +即可。 +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-new-project-7.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行应用程序 +\begin_inset CommandInset label +LatexCommand label +name "fig:运行应用程序" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +建议读者在使用Idea完成了第一个HelloWorld项目后,使用资源管理器或者命令行工具打开项目的目录看一下Idea到底创建了哪些目录,哪些文件?尤其要注意到 +,Java应用程序源代码都是使用java作为文件扩展名的,比如HelloWorld. +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +java +\end_layout + +\end_inset + +,编译后的Java字节码文件(即所谓的可执行文件)都是以class作为文件扩展名的,比如HelloWorld. +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +class +\end_layout + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +要特别注意,Java是大小写敏感的程序设计语言,Java源代码的文件名和类名必须完全一致!这个规定并非铁板一块,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:定义Java类" + +\end_inset + +详细讨论Java定义类的细节。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +NetBeans +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +NetBeans +\end_layout + +\end_inset + +NetBeans是一个始于1997年的Xelfi计划,本身是捷克布拉格查理大学Charles University的数学及物理学院的学生计划。此计划延伸而成立了 +一家公司进而发展成为商用版本的NetBeans IDE,直到1999年Sun Microsystems电脑买下此公司。Sun Microsystems于2000 +年6月将NetBeans IDE作为开源项目发展。2010年1月,Sun Microsystems成为甲骨文的子公司。 NetBeans IDE最新版下载量已经 +超过18万次,参与开发人员超过80万。NetBeans项目正在蓬勃发展,并将继续成长。 +\end_layout + +\begin_layout Standard +NetBeans包括开源的开发环境和应用平台,NetBeans IDE可以使开发人员利用Java平台能够快速创建Web、企业、桌面以及移动的应用程序,NetBe +ans IDE已经支持PHP、Ruby、JavaScript、Groovy、Grails和C/C++等开发语言。NetBeans项目由一个活跃的开发社区提供支持 +, NetBean开发环境提供了丰富的产品文档和培训资源以及大量的第三方插件。 NetBeans是开源软件开发集成环境,是一个开放框架,可扩展的开发平台,可以用 +于Java、C/C++,PHP等语言的开发,本身是一个开发平台,可以通过扩展插件来扩展功能。 +\end_layout + +\begin_layout Standard +ubuntu环境下直接执行下面的命令即可安装Netbeans: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ sudo apt-get install netbeans +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +上面的命令虽然只是安装了Netbeans的基本组件,但是对于我们学习Java程序设计语言而言已经足够了!如果你希望尝试最新的Netbeans版本,可以从Netb +eans官网 +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://www.netbeans.org +\end_layout + +\end_inset + +下载并安装,此处不再赘述。 +\end_layout + +\begin_layout Standard +如果你已经使用过任何一种IDE开发环境了,Netbeans是很容易上手的。一般的开发步骤如下: +\end_layout + +\begin_layout Enumerate +创建新项目:通过File->New Project打开创建新项目的窗口,填写项目目录即可创建一个新的项目 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +没有并排显示,需要修改 +\end_layout + +\end_inset + +: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/intro/NewJavaApplication_001.pdf + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择项目类型 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset space \hspace*{\fill} +\end_inset + + +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/intro/NewJavaApplication_002.pdf + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +设置项目名称和存储目录 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Caption Standard + +\begin_layout Plain Layout +创建新项目 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Enumerate +编写源文件:在第一步中创建新项目后,已经自动打开了HelloWorld.java文件: +\begin_inset Newline newline +\end_inset + + +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/edit-helloworld.png + lyxscale 30 + scale 30 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +编辑HelloWorld.java +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex Tip +status open + +\begin_layout Itemize +巧用Netbeans的自动代码提示,比如打出System.之后,会自动提示System类有哪些方法可以调用。 +\end_layout + +\begin_layout Itemize +如果代码中有语法错误,Netbeans会给出提示信息和建议的修改方案,一般情况下选择第一个修正方案即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +运行:在IDE中运行Java应用程序很简单,在打开的java文件中右键可以看到run file菜单: +\begin_inset Newline newline +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/intro/run-file.png + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +右键选择Run File菜单 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset space \hspace*{\fill} +\end_inset + + +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/intro/run-file-console.png + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Caption Standard + +\begin_layout Plain Layout +在Netbeans中运行文件 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Eclipse +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Eclispe +\end_layout + +\end_inset + +Eclispe是当下非常流行的Java开发IDE环境,以丰富的插件著称,详情可以访问Eclipse的官网: +\begin_inset CommandInset href +LatexCommand href +name "http://www.eclipse.org" +target "http://www.eclipse.org" +literal "false" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +安装Eclipse可以有两种方式: +\end_layout + +\begin_layout Enumerate +直接在ubuntu执行命令: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ sudo apt-get install eclipse +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +在eclipse的官网下载相应于你的环境(32位或者64位)的合适版本,一般下载最新的稳定版即可。eclipse是绿色软件,直接解压缩运行其中的eclipse文 +件即可。 +\end_layout + +\begin_layout Standard +eclipse的具体用法和Netbeans大同小异,不再赘述。 +\end_layout + +\begin_layout Section +初识Java的输入输出 +\begin_inset CommandInset label +LatexCommand label +name "sec:初识Java的输入输出" + +\end_inset + + +\end_layout + +\begin_layout Standard +C语言提供了简单的printf和scanf处理输出和输入,Java的输入输出确实要比C复杂的多。不过,我们在学习C语言的时候也花了不少的时间学习printf的格 +式化输出方式,不是吗?而Java的输出虽然形式上复杂了点,但是却不需要我们学习格式化字符串的语法了。为了学习方便,这里先给出最简单的Java输入输出方法。 +\end_layout + +\begin_layout Subsection +输出到屏幕 +\end_layout + +\begin_layout Standard +在屏幕上输出字符串可以直接调用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +println +\end_layout + +\end_inset + +println +\end_layout + +\end_inset + +方法(ln是line的缩写): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +System.out.println(“希望输出的字符串写在这里”); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们先不用理会System和out具体是什么意思(在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:面向字节的流" + +\end_inset + +我们会详细研究System以及out的用法), +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +println +\end_layout + +\end_inset + +的意思是输出双引号内的字符串到屏幕上,并自动回车换行,这正是我们需要的。 +\end_layout + +\begin_layout Standard +另外,在输出字符串到屏幕时,一般情况下我们可以忘掉C中printf函数的格式化输出,因为Java提供了更自然的字符串输出方式:直接使用“+”将多个字符串连接起来 +即可 +\begin_inset Foot +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:拼接字符串" + +\end_inset + +我们会更具体的讨论如何连接多个字符串。 +\end_layout + +\end_inset + +,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +System.out.println("variable a = " + a + ",variable b = " + b); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +从键盘输入 +\end_layout + +\begin_layout Standard +从键盘输入的简便方式是使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Scanner +\end_layout + +\end_inset + +Scanner类: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Scanner console = new Scanner(System.in); +\end_layout + +\begin_layout Plain Layout + +int quantity = console.nextInt(); +\end_layout + +\begin_layout Plain Layout + +double num = console.nextDouble(); +\end_layout + +\begin_layout Plain Layout + +String str = console.nextLine(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +同样的,我们在这里先忽略System.in的含义,只需要了解console.nextInt()的意思是从键盘获取一个整数,console.nextDouble的意思是 +从键盘获取一个双精度数字即可。Scanner类的常用函数如表 +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Scanner的常用函数" + +\end_inset + +所示: +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\noindent +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +函数名称 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +功能描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextInt() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个整数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextShort() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个短整数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextLong() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个长整数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextFloat() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个浮点数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextDouble() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个双精度浮点数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +next() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一个token(空白字符隔开的字符串) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +nextLine() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +读入下一行 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Scanner的常用函数 +\begin_inset CommandInset label +LatexCommand label +name "fig:Scanner的常用函数" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +我们会发现,几乎每个Java类都需要创建一个main方法,Idea提供了“模板”机制帮助我们快速创建main方法:尝试在一个类的内部敲入psvm并按回车键看看, +如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/intro/idea-psvm.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +psvm +\end_layout + +\end_inset + +: 分别是public static void main的第一个字母。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +Java的输入输出 +\end_layout + +\begin_layout Example +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "IODemo.java" + +\end_inset + +,我们从键盘输入什么,就在屏幕上打印出什么。 +\end_layout + +\begin_layout Example +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/intro/src/IODemo.java" +lstparams "caption={IODemo.java},label={IODemo.java}" + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,在屏幕打印10行“Hello,Java!”。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,在屏幕上显示如下的图形 +\begin_inset CommandInset label +LatexCommand label +name "exer:编写程序,在屏幕上显示如下的图形:" + +\end_inset + +[参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +solutionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "solu:的一个实现如下所示:" + +\end_inset + +]: +\begin_inset Newline newline +\end_inset + + +\begin_inset Graphics + filename ../imgs/intro/exe-logo-asterisks.png + scale 20 + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +熟悉一下常用的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Idea +\end_layout + +\end_inset + +Idea快捷键,具体可以参照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +appendixname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "chap:Idea的常用快捷键" + +\end_inset + +。记住一些常用快捷键可以大大提高开发和学习的效率,因此下些功夫练习一下还是值得的。 +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture2.lyx b/guide/lecture_guide/lecture2.lyx new file mode 100644 index 0000000..30aa959 --- /dev/null +++ b/guide/lecture_guide/lecture2.lyx @@ -0,0 +1,3770 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +coderemarks +logicalmkup +theorems-bytype +theorems-chap-bytype +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第二次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:变量和变量的命名" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:变量和变量的命名" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:常量和常量的命名" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:常量和常量的命名" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:简单数据类型" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:简单数据类型" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:运算符" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:运算符" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:表达式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:表达式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:数组" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:数组" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:条件判断和分支" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:条件判断和分支" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:循环" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:循环" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:方法的不定长参数" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:方法的不定长参数" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java的注释" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java的注释" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:综合应用举例" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:综合应用举例" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java的命名规范; +\end_layout + +\begin_layout Enumerate +加强了Java循环表达式; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +加强了Java循环表达式; +\end_layout + +\begin_layout Enumerate +Java的不定长参数; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +能够和C语言对照,快速掌握Java的基本语法和关键词; +\end_layout + +\begin_layout Enumerate +熟练掌握Java语言的条件判断、循环的用法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +列出Java和C语言在数据类型、表达式等方面的异同点; +\end_layout + +\begin_layout Enumerate +Java在哪些方面加强了C语言的数据类型、表达式? +\end_layout + +\begin_layout Enumerate +作业: +\begin_inset CommandInset ref +LatexCommand vref +reference "exer:编写一个程序,寻找一组整数中的最大值和最小值。输入格式:首先输入" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +Java的基础语法 +\begin_inset CommandInset label +LatexCommand label +name "chap:Java的基础语法" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +附录增加一个quick reference card +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/verybasic/data-type.png + width 70col% + +\end_inset + + +\end_layout + +\begin_layout Section +变量和变量的命名 +\begin_inset CommandInset label +LatexCommand label +name "sec:变量和变量的命名" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java语言中变量的概念和C语言完全一致,这里不再赘述。所不同的是,C语言中一般使用下划线分隔开多个单词,而在Java中,我们一般使用“驼式命名法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +驼式命名法 +\end_layout + +\end_inset + +”(Camel Case Name)来给变量起名字,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:驼峰命名法" + +\end_inset + +所示,多个单词构成了一个变量,除第一个单词之外,其他单词的第一个字母大写。大写的字母很像隆起的驼峰,因此此种命名法被形象的称之为“驼式命名法”。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/verybasic/camel-naming-style.eps + width 40line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +驼式命名法 +\begin_inset CommandInset label +LatexCommand label +name "fig:驼峰命名法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:C语言的变量和Java语言变量对照表" + +\end_inset + +是常见的C语言变量 +\begin_inset Foot +status open + +\begin_layout Plain Layout +摘自Linux内核源代码 +\end_layout + +\end_inset + +和Java语言变量的对照,也是优秀变量命名的典范: +\end_layout + +\begin_layout Standard +\align center +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +C中的常见变量 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Java中的变量表示方法 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boot_info +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +bootInfo +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +cmdline_boot_cpuid +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +cmdlineBootCpuid +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +time_attrs +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +timeAttrs +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +lookup_flags +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +lookupFlag +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +C语言的变量和Java语言变量对照表 +\begin_inset CommandInset label +LatexCommand label +name "tab:C语言的变量和Java语言变量对照表" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +合理的变量命名能够加强代码的可读性,减轻团队沟通的压力,软件后期的维护压力也会缓解。从一开始就要 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +有意识的培养合理命名变量的习惯 +\end_layout + +\end_inset + +。善于合理的命名变量也是一种能力,这种能力不会从天上掉下来,只有多阅读优秀的代码,注意学习高手的编程思路和变量命名习惯,在平时的练习中坚持给变量合理的命名,才能 +逐步培养这种能力。本书坚持以合理的变量命名方式给出示例程序,希望通过此种方式让初学者在 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +潜移默化 +\end_layout + +\end_inset + +中获得这种能力。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +关于C中的__file这样的变量命名,有必要在这里说道一下吗? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +常量和常量的命名 +\begin_inset CommandInset label +LatexCommand label +name "sec:常量和常量的命名" + +\end_inset + + +\end_layout + +\begin_layout Standard +常量是一种特殊的变量:其值不允许改变的变量。在C语言中,我们一般使用全大写字母表示常量,Java也完全遵守这一通用规则。所不同的是,Java语言中的常量通常使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +final +\end_layout + +\end_inset + +final static +\begin_inset Index idx +status open + +\begin_layout Plain Layout +static +\end_layout + +\end_inset + +进行联合修饰:final表示不可修改,static表示类变量,即所有对象共享一个此常量的备份。显然,对于常量而言,这样的修饰是十分合理和必要的,举例 +\begin_inset Foot +status open + +\begin_layout Plain Layout +摘自openjdk源代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/l +ang/Shutdown.java +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +/* Shutdown state */ +\end_layout + +\begin_layout Plain Layout + +public static final int RUNNING = 0; +\end_layout + +\begin_layout Plain Layout + +public static final int HOOKS = 1; +\end_layout + +\begin_layout Plain Layout + +public static final int FINALIZERS = 2; +\end_layout + +\begin_layout Plain Layout + +public static final int MAX_SYSTEM_HOOKS = 10; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Itemize +请暂时忽略例子中的public,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:访问控制" + +\end_inset + +深入学习public的用法。 +\end_layout + +\begin_layout Itemize +我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static常量" + +\end_inset + +深入学习static的用法,这里可以简单理解为和C语言中的static用法类似:在C语言中,static变量表示变量位于静态存储区,因此可以在函数之间共享此变量 +。在Java中使用static修饰变量其实用意很相似:static变量在多个对象中只保存一份,即static变量的目的是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在多个对象中共享变量 +\end_layout + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +简单数据类型 +\begin_inset CommandInset label +LatexCommand label +name "sec:简单数据类型" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +简单数据类型 +\end_layout + +\end_inset + +简单数据类型(又称为基本数据类型)和C语言几乎完全一致,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Java的数据类型" + +\end_inset + +所示。 +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类别 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +字节数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +取值范围 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +举例 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +整数类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +byte +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-128~127 +\end_layout + +\begin_layout Plain Layout +(-2 +\begin_inset script superscript + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset + +~2 +\begin_inset script superscript + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset + +-1) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +byte minor; +\end_layout + +\begin_layout Plain Layout +\align left +byte[] image; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +short +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-32768~32767 +\end_layout + +\begin_layout Plain Layout +-2 +\begin_inset script superscript + +\begin_layout Plain Layout +15 +\end_layout + +\end_inset + +~2 +\begin_inset script superscript + +\begin_layout Plain Layout +15 +\end_layout + +\end_inset + +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +short state; +\end_layout + +\begin_layout Plain Layout +\align left +short index = indexArray[i]; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +int +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2147483648~2147483647 +\end_layout + +\begin_layout Plain Layout +-2 +\begin_inset script superscript + +\begin_layout Plain Layout +31 +\end_layout + +\end_inset + +~2 +\begin_inset script superscript + +\begin_layout Plain Layout +31 +\end_layout + +\end_inset + +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +int searchOffset; +\end_layout + +\begin_layout Plain Layout +\align left +int nextComma; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +long +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-9223372036854775808~9223372036854775807 +\end_layout + +\begin_layout Plain Layout +-2 +\begin_inset script superscript + +\begin_layout Plain Layout +63 +\end_layout + +\end_inset + +~2 +\begin_inset script superscript + +\begin_layout Plain Layout +63 +\end_layout + +\end_inset + +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +long timeout; +\end_layout + +\begin_layout Plain Layout +\align left +long remaining = 100L; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +浮点类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +float +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Formula $\pm1.4E-45f$ +\end_inset + +~ +\begin_inset Formula $\pm3.4028235E+38f$ +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +float loadFactor; +\end_layout + +\begin_layout Plain Layout +\align left +float f = 2.5F; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +double +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Formula $\pm4.9E-324$ +\end_inset + +~ +\begin_inset Formula $\pm1.796931348623157E+308$ +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +double scaledFractional; +\end_layout + +\begin_layout Plain Layout +\align left +double approxMax; +\end_layout + +\begin_layout Plain Layout +\align left +double myNumber = -1234.56; +\end_layout + +\begin_layout Plain Layout +\align left +double[] limits = {1,2,3,4,5,6,7}; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +字符类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +char +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +u0000~ +\backslash +uffff +\end_layout + +\begin_layout Plain Layout +(0~65535) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +char c = 'a'; +\end_layout + +\begin_layout Plain Layout +\align left +char[] text; +\end_layout + +\begin_layout Plain Layout +\align left +char trailChar; +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +布尔类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +boolean +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +true,false +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\align left +boolean isDefaultLevel; +\end_layout + +\begin_layout Plain Layout +\align left +boolean isInverse; +\end_layout + +\begin_layout Plain Layout +\align left +boolean mayAllocateText; +\end_layout + +\begin_layout Plain Layout +\align left +boolean first = true; +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的数据类型 +\begin_inset CommandInset label +LatexCommand label +name "tab:Java的数据类型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "SimpleDataType.java" + +\end_inset + +演示了Java中的简单数据类型: +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/SimpleDataType.java" +lstparams "caption={SimpleDataType.java},label={SimpleDataType.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +执行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +c(char) = a,size of c = 2 +\end_layout + +\begin_layout Plain Layout +b(byte) = 20,size of n = 1 +\end_layout + +\begin_layout Plain Layout +n(int) = 10,size of n = 4 +\end_layout + +\begin_layout Plain Layout +s(short) = 2,size of s = 2 +\end_layout + +\begin_layout Plain Layout +l(long) = 100,size of l = 8 +\end_layout + +\begin_layout Plain Layout +f(float) = 2.5,size of f = 4 +\end_layout + +\begin_layout Plain Layout +d(double) = 2.5,size of d = 8 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +C语言中没有字符串数据类型,Java语言中同样没有字符串这种简单数据类型。不过,Java是面向对象的程序设计语言,允许通过定义类来无限扩展数据类型,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:字符串处理" + +\end_inset + +讨论使用JDK中提供的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +String +\end_layout + +\end_inset + +String类来表示字符串以及字符串的相关操作。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这部分内容可以删除?在openjdk中long/double/float没有采用此种方式来表示数字。 +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +注意到,我们在Java中采用了和C中类似的方法,往往在数字的末尾使用不同的字母表示不同的数据类型: +\end_layout + +\begin_layout Itemize +L表示long; +\end_layout + +\begin_layout Itemize +F表示float; +\end_layout + +\begin_layout Itemize +D表示double; +\end_layout + +\begin_layout Plain Layout +当然,不这样表示在语法上也是正确的。但是,通过这种方式可以明确告诉Java编译器数字的类型,编译器能够帮助检查数字类型是否匹配。 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +实际上,Java的数据类型分为基本数据类型和引用数据类型,我们在这里只讨论基本数据类型,引用数据类型延迟到 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:引用类型" + +\end_inset + +讨论。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +运算符 +\begin_inset CommandInset label +LatexCommand label +name "sec:运算符" + +\end_inset + + +\end_layout + +\begin_layout Standard +参见表 +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java中的运算符" + +\end_inset + +,除了 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +instanceof +\end_layout + +\end_inset + +instanceof和 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + +new运算符外,Java的运算符及其优先级规则和C是一样的: +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +运算符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +算术运算符 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout ++,-,*,/,%,++,-- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +关系运算符 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +<,<=,>,>=,==,!= +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +逻辑运算符 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +&&,||,! +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +位运算符 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +&,|,~,^,<<,>>,>>> +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +赋值运算符 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +=,*=,+=,-=,/=,%=,<<=,>>=,>>>=,&=,^=,|= +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象运算符 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +instanceof +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java中的运算符 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java中的运算符" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里有一个综合的运算符示例程序 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +表达式 +\begin_inset CommandInset label +LatexCommand label +name "sec:表达式" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们说“C语言是一种表达式语 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +表达式语 +\end_layout + +\end_inset + +言”,可见表达式的概念是多么的重要!实际上,现代的程序设计语言,包括Java都可以称作“表达式语言”,表达式由参与运算的元素(称为运算数 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +运算数 +\end_layout + +\end_inset + +)和运算符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +运算符 +\end_layout + +\end_inset + +的不同组合而成,即: +\end_layout + +\begin_layout Definition +表达式=运算数 + 运算符 +\end_layout + +\begin_layout Definition +要特别强调的是,每一个表达式都一定有一个确定的值,即“表达式的值 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +表达式的值 +\end_layout + +\end_inset + +”。举例说明: +\end_layout + +\begin_layout Definition +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +表达式类型 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +表达式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +表达式的值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +算术表达式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 + 2 - (3 * 4) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-9 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +关系表达式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 > 2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +逻辑表达式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 && 2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +true +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +赋值表达式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +a = 3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +true +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +表达式和表达式的值 +\begin_inset CommandInset label +LatexCommand label +name "fig:表达式和表达式的值" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Definition +我们经常在条件判断语句中使用表达式及表达式的值,请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:条件判断和分支" + +\end_inset + +。 +\end_layout + +\begin_layout Example +输入圆的半径,求圆的面积和周长 +\begin_inset CommandInset label +LatexCommand label +name "exa:输入圆的半径,求圆的面积" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +增加圆的周长计算,说明如何避免魔幻数字 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CircleArea.java" + +\end_inset + +中,我们将综合运用Java的输入输出和算术表达式。也请注意Java常量的定义和使用方式。 +\end_layout + +\begin_layout Example +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/CircleArea.java" +lstparams "caption={CircleArea.java},label={CircleArea.java}" + +\end_inset + + +\end_layout + +\begin_layout Example +执行结果如下: +\end_layout + +\begin_layout Example +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +请输入半径:10.3 +\end_layout + +\begin_layout Plain Layout +面积=333.12261233749405 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +请结合 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:输入圆的半径,求圆的面积" + +\end_inset + +,阐述什么是魔幻数字 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里似乎应该解释什么是魔幻数字? +\end_layout + +\end_inset + +(魔幻字符串)?常量在消除魔幻数字中起到怎样的作用? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +从键盘输入球体的半径,求球体的体积 +\begin_inset CommandInset label +LatexCommand label +name "exer:从键盘输入球体的半径,求球体的体积。" + +\end_inset + +。 +\end_layout + +\begin_layout Section +数组 +\begin_inset CommandInset label +LatexCommand label +name "sec:数组" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java数组的意义、用法和C语言几乎完全一致,只是定义方式有两点不同: +\end_layout + +\begin_layout Itemize +Java定义数组不需要指定数组大小,Java虚拟机能够自动“推断”数组的大小。 +\end_layout + +\begin_layout Itemize +通常,Java将定义数组时的[]放到数据类型的右边,而不是变量的右边,即如:int[] array,这样能够更明确表示array是数组的名字。 +\end_layout + +\begin_layout Standard +Java的数组示例请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "exa:遍历数组" + +\end_inset + +。 +\end_layout + +\begin_layout Section +条件判断和分支 +\begin_inset CommandInset label +LatexCommand label +name "sec:条件判断和分支" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java中的条件判断语句用法和C语言完全一致,不再赘述,通过一个例子看一下在Java中条件判断语句的基本用法。 +\end_layout + +\begin_layout Example +输入成绩,输出成绩的等级(优秀、良好、及格、不及格) +\begin_inset CommandInset label +LatexCommand label +name "exa:输入成绩,输出成绩的等级(优秀、良好、及格、不及格)" + +\end_inset + + +\end_layout + +\begin_layout Example +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/ShowGrade.java" +lstparams "caption={ShowGrade.java},label={ShowGrade.java}" + +\end_inset + + +\end_layout + +\begin_layout Example +执行结果为: +\end_layout + +\begin_layout Example +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +请输入成绩:87 +\end_layout + +\begin_layout Plain Layout +成绩87.0的等级为:优秀 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +Java加强了的switch分支结构 +\begin_inset CommandInset label +LatexCommand label +name "subsec:Java加强了的switch分支结构" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java中的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +switch +\end_layout + +\end_inset + +switch语句,不仅可以接受一个整数表达式(即表达式的值为整数),也可以接受一个字符串表达式(即表达式的值为字符串)和Enum类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +Enum以及Emum用于Switch请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:switch中的enum" + +\end_inset + +。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +输入月份的英文缩写,输出月份的天数 +\begin_inset CommandInset label +LatexCommand label +name "exa:输入月份的英文缩写,输出月份的天数" + +\end_inset + + +\end_layout + +\begin_layout Example +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/Month.java" +lstparams "caption={Month.java},label={Month.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +请使用switch-case结构重新实现 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "exa:输入成绩,输出成绩的等级(优秀、良好、及格、不及格)" + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "exer:请使用switch-case结构重新实现。" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +改进 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "exa:输入成绩,输出成绩的等级(优秀、良好、及格、不及格)" + +\end_inset + +,使得可以录入任意多的成绩并给出相应的等级分。录入-1表示录入结束 +\begin_inset CommandInset label +LatexCommand label +name "exer:改进,使得可以录入任意多的成绩并给出相应的等级分。录入-1表示录" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +尝试使用C语言的思路重新实现 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "exa:输入月份的英文缩写,输出月份的天数" + +\end_inset + +,即switch中的表达式只允许为整数,应该如何改写? +\begin_inset CommandInset label +LatexCommand label +name "exer:尝试使用C语言的思路重新实现,即switch中的表达式只允许为整" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "exa:输入成绩,输出成绩的等级(优秀、良好、及格、不及格)" + +\end_inset + +中并没有考虑闰月问题,请补充完整 +\begin_inset CommandInset label +LatexCommand label +name "exer:在中并没有考虑闰月问题,请补充完整。" + +\end_inset + +。 +\end_layout + +\begin_layout Section +循环 +\begin_inset CommandInset label +LatexCommand label +name "sec:循环" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +三大循环结构 +\end_layout + +\begin_layout Standard +Java中的三大循环结构( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +for +\end_layout + +\end_inset + +for循环、while +\begin_inset Index idx +status open + +\begin_layout Plain Layout +while +\end_layout + +\end_inset + +循环、do-while +\begin_inset Index idx +status open + +\begin_layout Plain Layout +do-while +\end_layout + +\end_inset + +循环)以及break +\begin_inset Index idx +status open + +\begin_layout Plain Layout +break +\end_layout + +\end_inset + +、continue +\begin_inset Index idx +status open + +\begin_layout Plain Layout +continue +\end_layout + +\end_inset + +的用法和C语言完全一致,不再赘述。 +\end_layout + +\begin_layout Paragraph* +Java加强了的循环结构 +\end_layout + +\begin_layout Standard +Java提供了一种加强了的for循环语句,可以很方便的遍历集合(包括数组),其基本结构为: +\end_layout + +\begin_layout Standard +\begin_inset Box Boxed +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +for(元素类型T 循环变量t:集合s) {...} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +此加强了的for循环会自动从集合s中取出每一个元素赋值给“:”前面定义的循环变量t,这样在循环体中就可以使用这个变量t了。 +\end_layout + +\begin_layout Example +遍历数组 +\begin_inset CommandInset label +LatexCommand label +name "exa:遍历数组" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/EnhancedFor.java" +lstparams "caption={EnhancedFor.java},label={EnhancedFor.java}" + +\end_inset + + +\end_layout + +\begin_layout Section +方法的不定长参数 +\begin_inset CommandInset label +LatexCommand label +name "sec:方法的不定长参数" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java方法的参数可以是不定长的,即任意个数的参数。 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +不定长参数 +\end_layout + +\end_inset + +不定长参数的表示方法是在参数类型和参数名之间使用...隔开,当实参和形参匹配时,实参列表会保存到一个指定的 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +数组 +\end_layout + +\end_inset + +中(即不定长参数名),在方法体内可以遍历这个数组访问每一个参数。 +\end_layout + +\begin_layout Standard +比如将任意多个整数相加的方法,可以如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "VarargsTest.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/VarargsTest.java" +lstparams "float,caption={VarargsTest.java},label={VarargsTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +作为单独的一节介绍main方法及其参数 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Java的注释 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的注释" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java支持两种方式的注 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +注 +\end_layout + +\end_inset + +释: +\end_layout + +\begin_layout Enumerate +C语言风格的注释:即/*...*/方式的注释。 +\end_layout + +\begin_layout Enumerate +C++语言风格的注释:即//...方式的注释。 +\end_layout + +\begin_layout Standard +通常,多行的注释采用C语言风格比较方便,单行注释采用C++语言风格比较方便。习惯上,多行的注释使用/**开头,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +/** +\end_layout + +\begin_layout Plain Layout + + * 方法的功能描述. +\end_layout + +\begin_layout Plain Layout + + * @param param1 参数1的描述 +\end_layout + +\begin_layout Plain Layout + + * @param param2 参数2的描述 +\end_layout + +\begin_layout Plain Layout + + * @return 返回值的描述 +\end_layout + +\begin_layout Plain Layout + + */ +\end_layout + +\begin_layout Plain Layout + +public String method(String param1, int param2) {...} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在上面的例子中,@param, @return分别用于描述方法的参数和返回值,javadoc +\begin_inset Foot +status open + +\begin_layout Plain Layout +javadoc是Java提供的API文档生成工具,位于SDK的bin目录下,即和java、java在同一个目录下。Java SDK的API文档就是通过javad +oc工具生成的,简单的用法是运行:javadoc 包名(类名列表),即可在当前目录下生成HTML格式的标准API文档,读者可自行尝试和体会。详细了解javado +c可以参考: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://en.wikipedia.org/wiki/Javadoc +\end_layout + +\end_inset + +和 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://www.oracle.com/technetwork/articles/java/index-137868.html +\end_layout + +\end_inset + +,使用Linux的读者也可以执行man javadoc。 +\end_layout + +\end_inset + +可以根据这些标签自动生成API文档,建议读者在阅读优秀的源代码时注意学习注释的写法,养成写规范注释的习惯。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +大多数IDE都支持自动插入注释框架,比如在Idea中,只要在方法(函数)的上一行输入/**(注意是两个*)再按回车,然后在空白处补充描述即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +Java的基本语法结构中,哪些方面和C语言一致?Java增加了哪些新特性? +\end_layout + +\begin_layout Section +综合应用举例 +\begin_inset CommandInset label +LatexCommand label +name "sec:综合应用举例" + +\end_inset + + +\end_layout + +\begin_layout Example +利用下面的公式计算 +\begin_inset Formula $\pi$ +\end_inset + +的近似值,要求精确到 +\begin_inset Formula $10^{-6}$ +\end_inset + +为止。 +\begin_inset CommandInset label +LatexCommand label +name "exa:利用下面的公式计算的近似值,要求精确到为止。" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Formula +\[ +\pi/4\approx1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\cdots +\] + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +问题分析 +\end_layout + +\begin_layout Standard +这是利用级数公式近似计算某个特定值的典型应用,计算结果的精确度取决于累加的项数多少,累加的项数越多,精度越好。 +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "CalculatePi.java" + +\end_inset + +中,设计了一个计算 +\begin_inset Formula $\pi$ +\end_inset + +近似值的方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本书大多数地方把C语言中的函数(function)称作“方法”(method),这是面向对象程序设计语言中对函数的称呼。其实,这两者没有差别,只是叫法不同而已。 +也就是说,在面向过程的语言中,通常称作函数;在面向对象的语言中,通常称作方法。 +\end_layout + +\end_inset + +,这样在main方法中调用这个方法即可。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/verybasic/src/CalculatePi.java" +lstparams "caption={CalculatePi.java},label={CalculatePi.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +显示结果 +\end_layout + +\begin_layout Standard +运行例 +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:利用下面的公式计算的近似值,要求精确到为止。" + +\end_inset + +后,输出结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +pai = 3.141591 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序说明 +\end_layout + +\begin_layout Standard +本例的主要内容是计算 +\begin_inset ERT +status open + +\begin_layout Plain Layout + +$ +\backslash +pi$ +\end_layout + +\end_inset + +近似值的方法pi()。其设计思路很直接,利用变量item保存每个迭代项的数值,然后累加到result中即可。注意到sign的用法很常见,在每次迭代的时候实现了符 +号的变换。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写一个程序,寻找一组整数中的最大值和最小值。输入格式:首先输入N,表示这组整数的个数,然后依次输入这组整数 +\begin_inset CommandInset label +LatexCommand label +name "exer:编写一个程序,寻找一组整数中的最大值和最小值。输入格式:首先输入" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写字符界面版计算器程序,运行时提示输入两个操作数,然后输出加减乘除运行结果。 +\begin_inset CommandInset label +LatexCommand label +name "exer:编写字符界面版计算器程序,运行时提示输入两个操作数,然后输出加减" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写一个程序,从键盘输入x,利用下面公式计算的近似值,要求精度到10 +\begin_inset script superscript + +\begin_layout Plain Layout +-6 +\end_layout + +\end_inset + +: +\begin_inset CommandInset label +LatexCommand label +name "exer:编写一个程序,从键盘输入x,利用下面公式计算的近似值,要求精度到" + +\end_inset + + +\end_layout + +\begin_layout Exercise +\begin_inset Formula +\[ +\cos(x)=1-\frac{x^{2}}{2!}+\frac{x^{4}}{4!}-\frac{x^{6}}{6!}+\frac{x^{8}}{8!}-\cdots +\] + +\end_inset + + +\end_layout + +\begin_layout Exercise + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture3.lyx b/guide/lecture_guide/lecture3.lyx new file mode 100644 index 0000000..cec0e70 --- /dev/null +++ b/guide/lecture_guide/lecture3.lyx @@ -0,0 +1,9340 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +theorems-bytype +theorems-chap-bytype +coderemarks +note-inset +tip-inset +warning-inset +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #d8daeb +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第三次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:再说C语言的struct" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:再说C语言的struct" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:类和对象的初步概念" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:类和对象的初步概念" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:对象的创建过程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:对象的创建过程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:类的组织:包" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:类的组织:包" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +类和对象的概念; +\end_layout + +\begin_layout Enumerate +Java对象的创建过程; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +类和对象在现实中的类比; +\end_layout + +\begin_layout Enumerate +对象的创建过程; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +能把Java的类和对象的概念,在现实世界中找到丰富的案例; +\end_layout + +\begin_layout Enumerate +掌握Java对象的创建过程,熟悉构造方法的各种常见情形; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +通过类和对象的概念的学习,学会用面向对象的角度思考和看待现实世界:比如如何通过面向对象的方法表达学校的组织机构? +\end_layout + +\begin_layout Enumerate +Java为什么要设计“构造方法”这个概念? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +面向对象编程基础 +\begin_inset CommandInset label +LatexCommand label +name "chap:面向对象的基本概念" + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/oop.png + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Section +再说C语言的struct +\begin_inset CommandInset label +LatexCommand label +name "sec:再说C语言的struct" + +\end_inset + + +\end_layout + +\begin_layout Standard +C语言以简练、灵活、高效著称,但是C语言本身提供的基本数据类型有限,描述现实世界的能力自然也有限。比如要求输入班级同学的英语和数学成绩并按照平均成绩排序 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这个例子不恰当,排序任务脱离了对象本身,是否换成画图 or animal,涉及到各种图形和图形的操作? +\end_layout + +\end_inset + +,如果我们仅使用C的基本数据类型来设计的话,大概能想到的策略有如下几种: +\end_layout + +\begin_layout Enumerate +每个同学都用三个变量来表示:zhangsan_name, zhangsan_english, zhangsan_math, wangwu_name, + wangwu_english, wangwu_english......。如果班级有40位同学,这需要120个变量来表达,不仅容易写错,还不胜其烦!这个思路显然值得商榷, +为下策。 +\end_layout + +\begin_layout Enumerate +使用数组来分别存储同学的名字、英语成绩和数学成绩,比如下面的代码片段: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +char* name[40]; +\end_layout + +\begin_layout Plain Layout + +float english_score[40]; +\end_layout + +\begin_layout Plain Layout + +float math_score[40]; +\end_layout + +\end_inset + +使用数组极大减少了变量的数量,但是也存在一个问题,我们其实隐含了这样一条规则:name数组的第i个元素(同学)的英语成绩是english_score数组的第i个 +元素,数学成绩是math_score数组的第i个元素。也就是说,这三个数组的对应元素有一一映射的关系。这个一一映射的关系是需要我们程序员自己维护的,也就是说,如 +果我们破坏了这一隐含的规则,无论有意还是无意,编译器并不能帮助我们发现这个“破坏”,因为从语法上,不符合这个隐含规则也是允许的,这即为程序员带来了负担,也为程序 +埋下了隐患。可以看出,带来这些问题的关键原因是三个数组的一一映射关系不是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +语法级别的映射 +\end_layout + +\end_inset + +,编译器无法 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +从语法上保证和检查 +\end_layout + +\end_inset + +这三个数组是否遵循了一一映射的关系,这就是C语言引入struct概念的原因:将变量之间的映射关系语法化,我们看使用struct如何解决这个问题。 +\end_layout + +\begin_layout Enumerate +使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +struct +\end_layout + +\end_inset + +struct描述同学们的英语和数学成绩,代码片段如下: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +struct score{ +\end_layout + +\begin_layout Plain Layout + + char* name; +\end_layout + +\begin_layout Plain Layout + + float english_score; +\end_layout + +\begin_layout Plain Layout + + float math_score; +\end_layout + +\begin_layout Plain Layout + + float avg_score;/*平均成绩*/ +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\begin_layout Plain Layout + +struct score stu_scores[40]; +\end_layout + +\end_inset + +struct在语法上保证了name、english_score、math_score这三个变量是一一映射的,是score结构体的“成员分量 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +成员分量 +\end_layout + +\end_inset + +”,因此struct在语法上保证了名字和成绩不可能张冠李戴,杜绝了可能存在的隐患,也减轻了程序员的思想负担(不需要时刻提醒自己要维护姓名和成绩的映射关系)。所以 +,struct是C语言的重要组成部分,是C语言描述现实世界的重武器,在大型项目中大量使用struct来表达同类事物的共同特征(属性)。比如打开Linux内核源代 +码的头文件目录,我们随处可见大量的struct定义: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +struct font_desc { +\end_layout + +\begin_layout Plain Layout + + int idx; +\end_layout + +\begin_layout Plain Layout + + const char *name; +\end_layout + +\begin_layout Plain Layout + + int width, height; +\end_layout + +\begin_layout Plain Layout + + const void *data; +\end_layout + +\begin_layout Plain Layout + + int pref; +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\end_inset + +因此,我们可以这样定义struct: +\end_layout + +\begin_layout Definition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +struct +\end_layout + +\end_inset + +struct是对一类事物公共属性的描述。 +\end_layout + +\begin_layout Subsection +struct的局限性 +\begin_inset CommandInset label +LatexCommand label +name "subsec:struct的局限性" + +\end_inset + + +\end_layout + +\begin_layout Standard +C语言通过struct大大扩充了C的数据类型,每一个struct都定义了一种新的数据类型来对应客观世界的某种事物,这样C语言不但描述客观世界的能力大大加强了,C +语言程序的可读性、可维护性也大大提高了。 +\end_layout + +\begin_layout Standard +C语言能够更好的描述客观世界,可以给struct记大功一件。但是,我们描述客观世界的目的是认识世界并进而改造世界,struct仅仅是方便了描述世界,对于改造世界 +并没有多大帮助。比如回到我们本章开头的问题:我们不仅仅要输入同学们的成绩,还要按照平均成绩排序。这里至少包含两个方面的“认识世界”和“改造世界”世界的动作: +\end_layout + +\begin_layout Enumerate +计算平均成绩:这是属于进一步认识世界的范畴:根据已有的事物属性,我们可以计算和推断出新的属性。 +\end_layout + +\begin_layout Enumerate +按照平均成绩排序:这是属于改造世界的范畴:对已有事物重新组合排序。 +\end_layout + +\begin_layout Standard +struct帮助我们很好的描述了同学们的名字和成绩的对应关系,但是计算平均成绩和按照成绩排序这两个“动作”,在C语言中是通过独立的函数来实现的,比如下面的代码片 +段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void calculate_avg_score(struct score* score) { +\end_layout + +\begin_layout Plain Layout + + /*按照某种权重算法计算平均成绩并保存到score.avg_score中*/ +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +struct score[] sort_score(struct score* scores[]) { +\end_layout + +\begin_layout Plain Layout + + /* 将数组scores排序后返回新的struct score数组*/ +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,calculate_avg_score函数和sort_score函数虽然都和struct score有关系(作为参数或者返回值),但是这种关系是“弱关 +系”,因为calcuate_avg_score、sort_score可以没有定义,可以存在于另外的文件中,可以被定义为另外的名称等等。也就是说,在语法上,str +uct score和这两个函数并没有必然的联系,编译器没有办法帮助程序员检查这两个函数和struct score的映射关系,一切还需要程序员人工的 +\begin_inset Quotes erd +\end_inset + +细心 +\begin_inset Quotes erd +\end_inset + +照料。显然,struct一定程度上解决了描述世界的问题,但是没有解决认识世界和改造世界的问题。 +\end_layout + +\begin_layout Section +类和对象的初步概念 +\begin_inset CommandInset label +LatexCommand label +name "sec:类和对象的初步概念" + +\end_inset + + +\end_layout + +\begin_layout Subsection +类是struct概念的自然延伸 +\end_layout + +\begin_layout Standard +C中的struct实现了对客观事物属性的分组描述,即同一类型的客观事物的属性可以用一个struct来表达。正如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:struct的局限性" + +\end_inset + +所述,struct有其局限性,只能描述客观事物的属性,不能表达对客观事物的进一步认知动作和改造利用的动作,于是在面向对象的程序设计语言中引入“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类 +\end_layout + +\end_inset + +类”的概念弥补struct的这一缺陷。 +\end_layout + +\begin_layout Definition +类是对一类客观事物公共 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + +和 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +动作 +\end_layout + +\end_inset + +的描述。 +\end_layout + +\begin_layout Standard +对比struct我们可以看出,类比struct多了“动作”的描述,也就是说,类即可以描述事物的属性,也可以描述我们可以对(用)这类事物“做什么”,是对客观世界的 +完整的描述。Java使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +class +\end_layout + +\end_inset + +关键字来定义类,一个简单的只包含属性的类和struct非常相似,比如二维坐标中的“点”,一开始可以这样定义(右边作为对照,列出了C中point结构体的定义): +\end_layout + +\begin_layout Standard +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "40line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的Point类定义 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +class Point { +\end_layout + +\begin_layout Plain Layout + + int x; // 点的x坐标 +\end_layout + +\begin_layout Plain Layout + + int y; // 点的y坐标 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的point结构体定义 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +struct point { +\end_layout + +\begin_layout Plain Layout + + int x; /*点的x坐标*/ +\end_layout + +\begin_layout Plain Layout + + int y; /*点的y坐标*/ +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +但是如果只是使用class替换了struct关键字,显然没有发挥类描述客观事物的最大威力,因此一个更合理的Point类如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Point.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub321/Point.java" +lstparams "caption={Point.java},label={Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,在这个版本的Point类定义中,“点”的属性(x,y)和对点的操作moveTo封装在一起了。 +\end_layout + +\begin_layout Subsection* +定义Java类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:定义Java类" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +为了满足李震梅老师的审美观,修改为star form section +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +完整的定义Java类的语法是: +\end_layout + +\begin_layout Standard +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +[public] class ClassName { ...} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这里有几个要点: +\end_layout + +\begin_layout Itemize +大部分情况下需要将类定义为 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public的,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:类的访问控制" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +类名的常规命名遵循驼式命名法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +驼式命名法 +\end_layout + +\end_inset + +,并且第一个字母是大写的。 +\end_layout + +\begin_layout Itemize +一个Java源代码文件中只能有一个类是public的,且这个public的类名必须和文件名完全一致,包括大小写。 +\end_layout + +\begin_layout Itemize +在Java源代码文件中可以定义多个类,只要保证只有一个public类即可。 +\end_layout + +\begin_layout Subsection +对象的概念 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +画图说明更清晰 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "30line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/point-monitor.eps + lyxscale 20 + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +类和实例的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:类和实例的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +类是对一类事物的抽象描述,比如Point类是对二维坐标“点”的抽象描述,它表达了屏幕上的一个点所具有的公共属性:x坐标和y坐标,以及我们可以对“点”的操作,比如 +moveTo操作。但是,Point类并没有和屏幕上的实体点绑在一起,屏幕上的每一个实体点,可以看作Point类的一个具体 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例 +\end_layout + +\end_inset + +实例 +\end_layout + +\end_inset + +,都具有Point类给出的一些属性,在这里就是屏幕上的每一个实体点都有相应的x、y坐标。我们把实体点叫做类Point的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +实例(instance) +\end_layout + +\end_inset + +,或者叫做类Point的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +对象 +\end_layout + +\end_inset + +对象 +\end_layout + +\end_inset + +。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象就是实例,实例就是对象 +\end_layout + +\end_inset + +。可以看出,一个类可以创建若干实例,所有实例(对象)都具有类中定义的属性,只是属性的值各不相同而已,一般称作对象的状态不同。比如,点(1,2),(3,5),(1 +0,50)都是Point的实例。 +\end_layout + +\begin_layout Standard +在这里有必要进一步澄清一下常见的几种说法: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +类(class) +\end_layout + +\end_inset + +就是类型的意思,定义了一个类,就是定义了一个新的数据类型,表达某种事物的公共属性和方法,我们可以根据类创建多个实例(对象)。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象(object)即类的实例 +\end_layout + +\end_inset + +。如果把类看作数据类型,则对象可以看作变量。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象的属性 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + +(property)即为类的“成员分量” +\end_layout + +\end_inset + +(借用struct的叫法),即类中定义的变量。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象的方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + +(method)即为类中定义的函数 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +函数 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + 。由于这些函数往往是操作类的属性的某种方法,因此大家习惯上称为对象的方法。 +\end_layout + +\begin_layout Standard +在java中,通过 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + +new操作符创建类的实例(对象),比如new Point()创建了一个“点”的实例(对象)。和C语言中访问struct的成员变量类似,访问Java对象的属性和方 +法是通过 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +. +\end_layout + +\end_inset + +运算符实现的 +\begin_inset Foot +status open + +\begin_layout Plain Layout +和C语言不同的是,由于Java中没有提供指针,在Java中不存在->运算符。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub321/Draw.java" +lstparams "caption={Draw.java},label={sub311-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在程序中,我们通过new操作符创建了2个Point类的对象one和two,并设置了两个对象的状态(即x、y坐标),然后打印出两个对象的状态。 +\end_layout + +\begin_layout Example +根据已有的Point类,编写一个Rectangle和Circle类,并能够计算Rectangle和Circle的面积 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub322 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +问题分析 +\end_layout + +\begin_layout Standard +矩形(Rectangle)是由一个点和长、宽决定的,圆形(Circle)是由一个点和半径决定的,因此我们可以在Point类的基础上定义Rectangle和Cir +cle类。 +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Rectangle.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Circle.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Rectangle.java" +lstparams "caption={Rectangle.java},label={sub322-Rectangle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Circle.java" +lstparams "caption={Circle.java},label={sub322-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +主类Draw.java的设计参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Draw.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Draw.java" +lstparams "float,caption={Draw.java},label={sub322-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +显示结果 +\end_layout + +\begin_layout Standard +执行文件Draw.java的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1's area=100 +\end_layout + +\begin_layout Plain Layout +circle1's area=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序说明 +\end_layout + +\begin_layout Standard +注意到我们在Rectangle中使用Point类定义一个startPoint对象的同时 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +初始化 +\end_layout + +\end_inset + +初始化了这个对象,即通过new Point()创建了一个空的Point对象。这是必要的,因为我们在Draw.java中创建一个Rectangle对象rect1后, +通过rect1.startPoint.x设置startPoint的x坐标。如果不在Rectangle中创建空的Point对象,则rect1.startPoint.x操作 +会报告著名的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +NPE +\end_layout + +\end_inset + +NPE +\end_layout + +\end_inset + +(NullPointException:空指针)异常: +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Exception in thread "main" java.lang.NullPointerException +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.oopbasic.sub322.Draw.main(Draw.java:7) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +对象的创建过程 +\begin_inset CommandInset label +LatexCommand label +name "sec:对象的创建过程" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + +new Point()创建一个Point类的对象时,Java是如何创建这个对象的呢? +\begin_inset Note Note +status open + +\begin_layout Plain Layout +画图表示类的创建过程 +\end_layout + +\end_inset + +实际上,Java创建对象的过程如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:对象的构造过程" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +实际上,为了理解方便,这是一个简化了的对象创建过程,对象的完整创建过程可参考JVM Specification +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-se8-specification" +literal "true" + +\end_inset + +。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/object-creation.eps + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +对象的构造过程 +\begin_inset CommandInset label +LatexCommand label +name "fig:对象的构造过程" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在这里我们暂且不讨论“递归的构造父类对象”这个话题(留待 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:再说构造方法" + +\end_inset + +再讨论),其他的几个步骤是指: +\end_layout + +\begin_layout Itemize +步骤1:分配空间。我们已经看到,相对于简单的数据类型,Java的对象往往是个复杂的数据结构,其中除了一些基本的数据类型的属性之外,还可能包含其他的对象(比如Re +ctangle中包含了Point)以及方法代码,因此创建Java对象的第一步是为这些数据和方法分配内存空间。分配内存空间后,类中的基本数据类型属性会被自动设置为 +默认值:数字类型的属性默认值为0(或者0.0),boolean类型的默认为false,字符类型的默认为''(这里是两个单引号,和C语言中的用法一样,表示空字符) +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这些需要验证或者查证: 如何通过示例验证? +\end_layout + +\end_inset + +。如果使用类作为属性,则默认为null。 +\end_layout + +\begin_layout Itemize +步骤3:初始化本类属性。如果本类的属性在定义时由初始化表达式,则使用该表达式初始化属性。比如 +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +int x = 10; +\end_layout + +\begin_layout Plain Layout + +Point startPoint = new Point(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +步骤4:调用本类的构造方法,这是本节的重点。 +\end_layout + +\begin_layout Subsubsection* +构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + +构造方法的用途,我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:对象的构造过程" + +\end_inset + +中已经看到了,那么如何定义构造方法呢?简单的说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +构造方法就是和类同名并且没有返回值的方法 +\end_layout + +\end_inset + +。这里有两个关键点:一是构造方法的方法名必须和类名完全相同,包括大小写。二是构造方法不需要返回值,也不允许有返回值。 +\end_layout + +\begin_layout Subsubsection* +默认的构造方法 +\end_layout + +\begin_layout Standard +可是,我们在以前的类中,并没有看到构造方法,是怎么回事呢?原来,如果一个类没有定义任何的构造方法,java编译器会自动增加(插入)一个“默认的构造方法”,即不带 +任何参数的空的构造方法。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要验证在类继承环境下,默认构造方法是否自动调用父类的构造方法? +\end_layout + +\end_inset + +也就是说,我们new Point()创建一个对象的时候,最后一步会调用Point类的无参构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +无参构造方法 +\end_layout + +\end_inset + +。如果Point类没有提供这样的构造方法,则调用Point类的默认构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认构造方法 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +当然,我们也可以“主动”为Point编写一个无参的构造方法,这样new Point()的最后一步就是调用我们自己编写的构造方法而非默认构造方法了。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +重新起一个包,实现所有的无参构造方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +无参构造方法 +\end_layout + +\end_inset + +无参构造方法和 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认构造方法 +\end_layout + +\end_inset + +默认构造方法的区别:默认构造方法一定是无参的构造方法,但是无参的构造方法不一定是默认构造方法。当一个类没有显式的定义任何构造方法时,编译器自动添加默认构造方法; +当一个类有任何的构造方法时,编译器都不会自动添加默认构造方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写程序,覆盖Point类的默认构造方法,为Point对象提供默认的(x,y)坐标为(10,10) +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub332 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +这里只列出Point.java和Draw.java两个文件,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub332-Point.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Draw.java" + +\end_inset + +,Circle.java和Rectangle.java没有变化。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub332/Point.java" +lstparams "float,caption={Point.java},label={sub332-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub332/Draw.java" +lstparams "float,caption={Draw.java},label={sub331-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java文件结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(10,10),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(10,10),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序分析 +\end_layout + +\begin_layout Standard +在本例中,Draw.java创建Circle对象circle1的时候,并没有设置原点的坐标,但是从运行结果可以看出,原点坐标的值为(10,10),这就是Point +类的无参构造方法的作用:当我们使用new Point()创建对象时,最后会调用Point的无参构造方法初始化对象的状态。 +\end_layout + +\begin_layout Subsubsection* +带参数的构造方法 +\end_layout + +\begin_layout Standard +很多时候,我们希望在创建对象的时候就设置对象的初始状态,比如是否可以通过new Point(10,20)这样的方式,创建Point对象的同时,设置Point对象 +的x坐标为10,y坐标为20呢?这可以通过带参数的构造方法来实现。也就是说,当我们通过new Point(10,20)这样的形式创建Point对象时,最后会调用 +Point类中带两个参数的构造方法。 +\end_layout + +\begin_layout Example +编写程序,使用带参数的构造方法创建Point对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写程序,使用带参数的构造方法创建Point对象" + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub333 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +主类Draw.java没有变化,这里就不列出了。其他类参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Point.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Circle.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Rectangle.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Point.java" +lstparams "float,caption={Point.java},label={sub333-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Circle.java" +lstparams "float,caption={Circle.java},label={sub333-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Rectangle.java" +lstparams "float,caption={Rectangle.java},label={sub333-Rectangle.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(20,20),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(0,0),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +当一个类中定义了任何的构造方法后,编译器就不会自动创建默认的构造方法了。比如Point类中,如果定义了Point的有参构造方法而没有定义无参构造方法,此时Poi +nt类没有默认构造方法,自然new Point()方式创建Point对象时会因为找不到无参的构造方法而报错。如何解决这个问题呢?请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:多个构造方法" + +\end_inset + +。 +\end_layout + +\begin_layout Subsubsection* +多个构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:多个构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java允许在类中定义多个构造方法,以便根据不同的情况初始化对象为不同状态。 +\end_layout + +\begin_layout Example +编写程序,给Point类定义两个构造方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub334 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +主类Draw.java和Rectangle.java和例 +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:编写程序,使用带参数的构造方法创建Point对象" + +\end_inset + +相同,这里仅列出Point.java和Circle.java,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub334-Point.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub334-Circle.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub334/Point.java" +lstparams "float,caption={Point.java},label={sub334-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub334/Circle.java" +lstparams "float,caption={Circle.java},label={sub334-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(10,10),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(0,0),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序说明 +\end_layout + +\begin_layout Standard +Point类现在有两个构造方法,我们在Circle.java调用了Point的有参构造方法,在Rectangle.java中调用了Point的无参构造方法。 +\end_layout + +\begin_layout Subsection +再说对象的初始化 +\end_layout + +\begin_layout Standard +通过以上分析我们可以看出,构造方法的目的是为了 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +创建对象时设置对象的初始状态 +\end_layout + +\end_inset + +,因此一个类需要多少个构造方法并没有一定之规,需要根据实际情况来确定。通常,在一开始设计一个类的时候,建议覆盖默认的构造方法即无参构造方法,提供一个默认的对象状 +态。随着开发的深入,可以根据实际情况添加更多的构造方法。 +\end_layout + +\begin_layout Standard +除了通过构造方法设置对象的初始状态外,也可以通过以下的方式进行对象的初始化操作: +\end_layout + +\begin_layout Itemize +在创建对象后,直接访问对象的属性并设置希望的值。 +\end_layout + +\begin_layout Itemize +在创建对象后通过setter方法设置对象的状态。所谓setter方法,往往是一系列setX,setY方法,其中的X、Y为对象的属性。 +\end_layout + +\begin_layout Itemize +在JavaEE环境下,可以提供一个初始化方法,比如void init(),然后通过注解@PostConstruct的方式实现对象的初始化。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +定义有参构造方法时,要注意参数的个数不要太多,一般不要超过10个。太多的参数往往给使用者带来记忆和匹配的负担。如果需要大量的对象初始化操作,建议编写专门的方法初 +始化对象(比如init()方法就是一个很好的方法名字),然后在创建对象后调用这个init方法即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +Java的构造方法有哪些特点? +\begin_inset CommandInset label +LatexCommand label +name "exer:Java的构造方法有哪些特点?" + +\end_inset + + +\end_layout + +\begin_layout Section +类的组织:包 +\begin_inset CommandInset label +LatexCommand label +name "sec:类的组织:包" + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的概念 +\end_layout + +\begin_layout Standard +在进行文件管理时,我们使用文件夹来组织不同类型的文件。在Java中,我们使用“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +包 +\end_layout + +\end_inset + +包”( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +package +\end_layout + +\end_inset + +package)来管理不同类型的Java源文件,其实“包”就是文件夹,我们说包cn.edu.sdut.softlab.oopbasic.sub332中的Point.java +时,其实是说,位于目录cn/edu/sdut/softlab/oopbasic/sub332目录下的Point.java。也就是说,把目录的分隔符换成“.”,目录名 +就变成了包名。 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:本章示例代码的目录层级结构" + +\end_inset + +是本章的主要示例代码的目录层级结构: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/package-tree.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +本章示例代码的目录层级结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:本章示例代码的目录层级结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的导入和声明 +\end_layout + +\begin_layout Standard +有了包的概念后,我们就可以使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +import +\end_layout + +\end_inset + +导入其他包中的Java源代码,这很像C语言中的include关键字的作用。比如下面的代码片段,我们导入了java.util包中的Date类(时间处理类): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +import java.util.Date; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +public class DateTest { +\end_layout + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + Date today = new Date(); +\end_layout + +\begin_layout Plain Layout + + System.out.println("today is " + today); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +关于包的导入(import),需要注意以下几个方面: +\end_layout + +\begin_layout Itemize +如果一个Java源代码在一个包中,则这个Java源代码应该首先使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +package +\end_layout + +\end_inset + +声明自己所在的包,正如本章所有的例子一样,在代码的开头几乎都一句package语句声明了包。建议回顾一下本章学过的例子,重点放在包的命名上面,了解如何在Java +源代码文件中声明包。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +只有声明(package)了包的Java源代码,才能够被导入进来 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +如果Java源代码中没有package声明语句,则编译器认为Java文件在 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +默认包 +\end_layout + +\end_inset + +中,即src根目录下,这通常不是一个好的习惯。 +\end_layout + +\begin_layout Itemize +显然,import应该放在class的定义前面。 +\end_layout + +\begin_layout Itemize +在同一个包下的Java源代码不需要导入(import)。 +\end_layout + +\begin_layout Itemize +Java的核心API,即java.lang包的类,Java编译器会自动导入,也不需要我们手工导入。 +\end_layout + +\begin_layout Itemize +可以通过*实现批量导入,比如: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +import com.company.lab.* +\end_layout + +\end_inset + +表示导入 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +com.company.lab +\end_layout + +\end_inset + +包中的所有类。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea IDE环境下,在使用到一个其他包的Java类时,有两种方式自动导入相应的包: +\end_layout + +\begin_layout Itemize +使用菜单:code->optimize imports,让Idea自动导入需要的包。 +\end_layout + +\begin_layout Itemize +鼠标移动到未识别的类上面,Idea会给出导入的提示,选择合适的包导入即可。注意,如果Idea给出了多个选择(意味着在多个包中都有这个类),此时要认真甄别要导入的 +包。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +根据Google编码规范(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:不使用通配符import" + +\end_inset + +),尽量避免import package.*这样的用法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的命名原则 +\end_layout + +\begin_layout Standard +我们使用包的目的是把Java文件按照逻辑组织起来 +\begin_inset Foot +status open + +\begin_layout Plain Layout +形式上看是这样,但是包的真正意义和Java虚拟机的类加载机制有关,这里不深入探讨,有兴趣的读者可以参考ClassLoader的相关资料。 +\end_layout + +\end_inset + +,同时也起到了“隔离”的作用,即不同包中的类即使名字相同也是可以的。或者说,以后我们提到一个类,应该连同它的包一起来考虑,即某某包的某某类。因此,当我们给包起名 +字的时候就要谨慎考虑,最好能够做到你起的包名是全球唯一的,这样你的包里面的类也就是全球唯一的了。而全球唯一的资源,很容易就想到了“域名”,于是通用的和建议的包命 +名规则 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见JLS:http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.1 +\end_layout + +\end_inset + +是按照域名的反向 +\begin_inset Foot +status open + +\begin_layout Plain Layout +为什么要将通常的域名反向排列形成包名呢?我们阅读的顺序是从左向右的,当谈到一个组织结构时,习惯上也是按照从左向右降序排列的,比如山东省淄博市张店区。因此,在命名 +包时把域名的顺序反向过来,更符合人们的阅读和理解习惯。当然,这不是Java的语法规定,只是“约定俗成”,入乡随俗也体现了一个程序员的素质。 +\end_layout + +\end_inset + +来命名,比如你的域名是lab.company.com,则包的命名可以是: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +com.company.lab +\end_layout + +\end_inset + +。下面是一些典型的包命名示范: +\end_layout + +\begin_layout Standard +\begin_inset Box Boxed +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +com.google.android +\end_layout + +\begin_layout Plain Layout +cn.edu.sdut.java.lesson +\end_layout + +\begin_layout Plain Layout +org.apache.log4j +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +根据Google的编码规范(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:包名" + +\end_inset + +),包的名字应该都使用小写字母,并避免使用下划线。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +类的继承 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +消除冗余,代码复用 +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "sec:类的继承" + +\end_inset + + +\end_layout + +\begin_layout Standard +在编程实践中,我们应该力求消除冗余,即不存在两片相同的代码。比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void method1() { +\end_layout + +\begin_layout Plain Layout + + doSomething(); +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void method2() { +\end_layout + +\begin_layout Plain Layout + + doSomeOtherThing(); +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们应该这样消除冗余: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void method1() { +\end_layout + +\begin_layout Plain Layout + + doSomething(); +\end_layout + +\begin_layout Plain Layout + + fun(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void method2() { +\end_layout + +\begin_layout Plain Layout + + doSomeOtherThing(); +\end_layout + +\begin_layout Plain Layout + + fun(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void fun() { +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +虽然后一种方式多定义了一个方法fun(),但是好处显而易见:软件的逻辑性(可读性)和可维护性提高了。如果需要对fun()的流程做任何修改,我们现在只需要在fun +()方法中修改即可。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +\begin_inset Flex Tip +status collapsed + +\begin_layout Plain Layout +主流的IDE现在都支持对代码进行类似的“重构”(refactor)。比如在Idea中,可以选择一段“重复”的代码,然后通过菜单Refactor->Introdu +ce->Method...让IDE自动寻找这段重复的代码,一次性抽象出一个方法,这样就消除了代码的冗余。 +\end_layout + +\end_inset + +增加Idea使用refactor的方法 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +上面代码消除冗余是建立在方法层面上的,在类的层面上应该如何消除冗余呢?比如有如下的两个类:BankCard.java和CreditBandCard.java。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step1/BankCard.java" +lstparams "float,caption={BankCard.java},label={step1-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step1/CreditCard.java" +lstparams "float,caption={未使用继承的CreditCard.java},label={step1-CreditBankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +很明显,CreditBankCard具有BankCard的大部分属性和方法,从尽力消除冗余的角度看,这样的代码太“丑陋”了!java提供了“继承”机制解决了这个 +问题,先看一下代码的实现:BankCard.java的代码没有变化,这里只列出CreditCard.java的代码,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "step2-CreditBankCard.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step2/CreditCard.java" +lstparams "float,caption={使用了继承的CreditCard.java},label={step2-CreditBankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,CreditBankCard扩展(extends)了BankCard类:CreditCard自动具有BankCard的属性和方法,只需要在Credit +Card中定义专属的属性和方法即可。 +\end_layout + +\begin_layout Standard +这就是Java等面向对象程序设计语言的“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +继承 +\end_layout + +\end_inset + +继承”机制。简单的说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +继承机制消除了代码的冗余,提高了代码的复用水平 +\end_layout + +\end_inset + +。继承是面向对象程序设计的重要手段,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:单继承" + +\end_inset + +进一步分析继承在编程实践中的应用和注意事项。 +\end_layout + +\begin_layout Subsection +单继承 +\begin_inset CommandInset label +LatexCommand label +name "subsec:单继承" + +\end_inset + + +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:BankCard的类层次结构" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +这样表示类层次关系的图叫做 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +UML +\end_layout + +\end_inset + +UML的类图。UML(Universal Model Language,统一建模语言)是IT行业中通用的描述需求和系统设计的建模工具,其中常用的图形有:类图、用 +例图、顺序图、活动图等,本书中只涉及到类图,用来表达类的继承和接口的实现。类图的意义应该是一目了然的,箭头表示类继承的方向,比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BankCard的类层次结构" + +\end_inset + +中,CreditCard指向了BankCard即表示CreditCard是从BankCard继承下来的。绘制UML图的工具有很多,本书采用的是umbrello和 +dia,参见本书前言部分的说明。 +\end_layout + +\end_inset + +的继承关系中,我们把BankCard类称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +父类 +\end_layout + +\end_inset + +父类 +\end_layout + +\end_inset + +,或者超类,把CreditCard、DebitCard类称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +子类 +\end_layout + +\end_inset + +子类 +\end_layout + +\end_inset + +。CreditCard和DebitCard继承了BankCard的属性和方法,并各自扩展了相应的属性和方法(DebitCard只扩展了属性,并没有扩展方法)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/bankcard-hirarchy.eps + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BankCard的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:BankCard的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Java只支持单继承,即一个类只允许有一个父类。绕过这个限制的办法是使用接口,请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的用法是正确的: +\end_layout + +\begin_layout LyX-Code +public class CreditCard extends BandCard{...} +\end_layout + +\begin_layout LyX-Code +public class DebitCard extends BandCard{...} +\end_layout + +\begin_layout Standard +下面的用法是错误的: +\end_layout + +\begin_layout LyX-Code +public class CreditCard extend BandCard{...} +\end_layout + +\begin_layout LyX-Code +public class CreditCard extends BandCard, Card{...} +\end_layout + +\begin_layout Standard +在Java中, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +类是所有类的基类(父类),即在Java的类树结构中, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +是“根”。因此,Java中的所有类都继承了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类中定义的属性和方法,具体请参见JDK API中关于 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的介绍。特别的, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的以下方法在(初级)编程实践中经常用到: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法 +\end_layout + +\end_inset + + 输出当前对象的字符串表达,一般用于调式输出。实际上,当直接输出一个对象时,即调用了该对象的 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法,也就是说, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +System.out.println(aObject +\end_layout + +\end_inset + +)和 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +System.out.println(aObject.toString()) +\end_layout + +\end_inset + +的结果是一样的。通常情况下,子类需要覆盖 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法,以便更好的描述类的内部结构。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +equals +\end_layout + +\end_inset + +方法 +\end_layout + +\end_inset + + 比较两个对象是否相等。不像简单数据类型的比较,对象的比较复杂,这里不展开阐述,详情可参见以下资料:https://dzone.com/articles/obje +ct-identity-and-equality-in-java,或者:https://stackoverflow.com/questions/13387742/ +compare-two-objects-with-equals-and-operator。 +\end_layout + +\begin_layout Subsection +再说构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:再说构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:对象的创建过程" + +\end_inset + +中,我们已经看到创建对象的第二步是递归的构造父类对象。我们仍然以银行卡为例来看一下所谓的“递归的构造父类对象”的含义。为了清楚期间,我们增加了一个类的层级结构, +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:银行卡的类层级结构" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +银行卡的程序示例代码较多,作为一个例子处理如何? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/bankcard-full-hirarchy.eps + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +银行卡的类层级结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:银行卡的类层级结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "step3-Card.java" + +\end_inset + +可以看出,Card类只定义了所有卡都有的基本属性:卡号。另外,显式定义了无参的构造方法,如果被调用的话,只是打印出一条提示信息。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/Card.java" +lstparams "float,caption={增加无参构造方法的Card.java},label={step3-Card.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +BankCard、CreditCard、DebitCard的设计思路类似,都是增加了一个无参的构造方法,打印出一条提示信息,如果被调用到的话。在Client类中 +,我们分别创建了CreditCard和DebitCard对象,注意观察构造方法的调用顺序。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/BankCard.java" +lstparams "float,caption={带有无参构造方法的BankCard.java},label={step3-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/CreditCard.java" +lstparams "float,caption={带有无参构造方法的CreditCard.java},label={step3-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/DebitCard.java" +lstparams "float,caption={带有无参构造方法的DebitCard.java},label={step3-DebitCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/Client.java" +lstparams "float,caption={Client.java},label={step3-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +执行Client.java的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called +\end_layout + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,所谓的“递归的构造父类对象”是指: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +当初始化子类对象时,从上往下依次调用父类的同名构造方法 +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:构造方法的递归调用" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/object/constructor-chain.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +构造方法的递归调用 +\begin_inset CommandInset label +LatexCommand label +name "fig:构造方法的递归调用" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +在递归构造父类对象的“链条”中,如果其中一环缺失会怎样?请读者自行练习找到此问题的答案:将导致语法错误。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里应该有习题 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +方法的覆盖和重载 +\end_layout + +\begin_layout Standard +方法的覆盖(override)和重载(overload)是面向对象编程中两个重要且容易混淆的概念,因此这里单独拿出来讨论一下。 +\end_layout + +\begin_layout Subsubsection* +方法重载 +\end_layout + +\begin_layout Standard +Java中的方法重载(overload)是指在一个类中允许存在 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +多个名字相同但是参数不同的方法 +\end_layout + +\end_inset + +。这里所谓的“参数不同”有如下的几种情形: +\end_layout + +\begin_layout Itemize +参数个数不同 +\end_layout + +\begin_layout Itemize +参数类型不同 +\end_layout + +\begin_layout Itemize +参数个数和类型都不相同 +\end_layout + +\begin_layout Standard +如果我们把方法的参数看做一个控制系统的“输入条件”,那么方法的重载意味着同一个动作在不同的输入条件下的表现如何? +\end_layout + +\begin_layout Example +使用方法重载设计一个计算器类。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Caculator.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/Caculator.java" +lstparams "caption={Caculator.java},label={Caculator.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java中典型的方法重载场合: +\end_layout + +\begin_layout Itemize +构造方法的重载:我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:多个构造方法" + +\end_inset + +中看到,可以编写类的多个构造方法,实际上就是方法的重载的具体体现。构造方法的名字都是相同的(和类名一致),不同的构造方法(参数不同)表示在不同的条件下如何创建对 +象。 +\end_layout + +\begin_layout Itemize +运算符重载:Java的“+”运算符是被重载了的。我们前面已经看到,“+”运算符在不同的表达式中意义不同,用于算数表达式时表示数学运算的加法,用于两个字符串时表示 +首尾相接连接两个字符串。 +\end_layout + +\begin_layout Itemize +String.valueOf方法可以接收的参数有boolean, char, char[], double, float, int, long等 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:字符串处理" + +\end_inset + +详细讨论String类的用法,String.value方法的形式可参考JDK API,这里暂不详细讨论。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +需要注意的是,只是参数的顺序不同以及参数的名字不同不能构成方法的重载,原因很简单,我们调用方法的时候进行形参和实参的匹配,顺序和名字并不能唯一决定形参和实参的组 +合。比如方法method(String a, String b) 和method (String c, String d)不能构成方法的重载,在Java编译器看 +来,这是两个相同的方法,因而会报告编译错误。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +TODO:需要实例验证 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "30line%" +status collapsed + +\begin_layout Plain Layout +\noindent +\align center +\begin_inset Graphics + filename ../imgs/object/socket-plug.eps + lyxscale 25 + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +生活中的各种插座和多用插座示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:生活中的各种插座和多用插座" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +举个生活中的例子可能更容易理解方法重载的概念和用途,比如我们知道插座有各种规格以便适用不同的电器,有的电器使用两孔插头,有的电器使用三孔插头,插头还可能分为圆形 +插头和扁平插头等等。正如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:生活中的各种插座和多用插座" + +\end_inset + +所示,生活中我们经常安装一种所谓的“多用插座”,即一个插座可以使用多种不同的插头,这样就免去安装很多个不同的插座的麻烦,也不需要大家记住插头和插座的对应关系,直 +接拿来用就可以了。这种“多用插座”的设计移植到程序设计上,就叫做“方法重载”(overload),即方法的名字相同(多用插座),但是参数各不相同(适用不同的插头 +),在具体使用时,程序员只需要记住少量的方法的名字,参数类型和个数由IDE自动提示即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +方法覆盖 +\end_layout + +\begin_layout Standard +方法覆盖(override)是指子类中重新实现了父类中的同名方法,即子类方法覆盖了父类方法。这样,当调用子类对象的这个方法时,就是使用子类重新实现的方法了。否则 +,就会调用父类中的方法。因此,方法覆盖的主要用意是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在子类中提供父类方法的加强版,或者使用不同的逻辑重新实现 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +方法覆盖示例。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Dog.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/Dog.java" +lstparams "caption={Dog.java},label={Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +方法覆盖是Java多态的基础,具体请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:多态" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意到从JDK 1.5开始,Java允许子类覆盖父类方法时,返回值可以是父类方法返回值的子类。比如: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +class A{ +\end_layout + +\begin_layout Plain Layout + + Father get(){ return null;} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +public class B extends A{ +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + Son get(){ return null;} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +class Father{} +\end_layout + +\begin_layout Plain Layout + +class Son extends Father{} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +在类B中,方法get返回值类型是Son,而其父类A的get方法的返回值类型是Father,由于Son是Father的子类,因此类B的方法get也属于方法的覆盖( +override)。 +\end_layout + +\begin_layout Plain Layout +Java是如何做到这一点的呢?我们反编译B.class会发现: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// Decompiled by Jad v1.5.8e. + Copyright 2001 Pavel Kouznetsov. + +\end_layout + +\begin_layout Plain Layout + +// Jad home page: http://www.geocities.com/kpdus/jad.html +\end_layout + +\begin_layout Plain Layout + +// Decompiler options: packimports(3) +\end_layout + +\begin_layout Plain Layout + +// Source File Name: B.java +\end_layout + +\begin_layout Plain Layout + +public class B extends A{ +\end_layout + +\begin_layout Plain Layout + + public B() { +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + Son get(){ +\end_layout + +\begin_layout Plain Layout + + return null; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + volatile Father get(){ // 桥接方法 +\end_layout + +\begin_layout Plain Layout + + return get(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +可以看出,编译器自动增加了一个所谓的“桥接方法”实现了标准的方法覆盖。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +在覆盖父类方法时,可以通过super关键字引用父类的同名方法。 +\end_layout + +\begin_layout Plain Layout +构造方法中的覆盖问题 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +访问控制 +\begin_inset CommandInset label +LatexCommand label +name "sec:访问控制" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们说到面向对象程序设计的封装时,不仅仅是指把对象的属性和方法“捏合”在了一起,也指从使用者的角度看,访问对象是受到限制的,即对象内部的状态和方法并不总是需要 +暴露给使用者的。推而广之,甚至对类的访问也可以加以限制。 +\end_layout + +\begin_layout Subsection +属性和方法的访问控制 +\end_layout + +\begin_layout Standard +为什么需要对属性和方法进行访问控制呢?从面向对象的设计角度看,一个对象完成了特定的功能,对象的使用者其实并不关心这个特定功能是如何实现的,只要这个功能能够正常工 +作就可以了,这就是所谓的“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +松耦合 +\end_layout + +\end_inset + +松耦合”(loose coupling principle)原则。考虑 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:松耦合原则" + +\end_inset + +所示的情形。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/loose-coupling-model.png + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +松耦合原则示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:松耦合原则" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +当Client使用Bean组件(对象)提供的功能时,并不需要知晓Bean组件内部是如何实现的,也就是时说,Bean组件在后续进行算法完善、性能改进或者界面优化...时 +,Client的代码不需要做任何改动。Bean组件只需要对外(Client)暴露必须的调用接口(如何暴露,我们会在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + +讨论),其内部实现及只在内部实现中用到的一些对象状态,应该想办法隐藏起来。换句话说,Bean组件如果对外暴露的调用接口越多,则后续改进时要考虑的因素就越多,困难 +也越大。 +\end_layout + +\begin_layout Standard +Java提供了完善的访问控制策略来保护属性和方法,如表所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +也参见:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html +\end_layout + +\end_inset + +(形成了一个三角形排列)。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的访问控制修饰符 +\begin_inset CommandInset label +LatexCommand label +name "tab:Java的访问控制修饰符" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +修饰词 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Class(类) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Package(包) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Subclass(子类) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +World(其他) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +protected +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +(default) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +private +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +default修饰符 +\begin_inset CommandInset label +LatexCommand label +name "subsec:default修饰符" + +\end_inset + + +\end_layout + +\begin_layout Standard +在之前我们的代码中,属性和方法前面没有使用任何修饰符,即默认修饰符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认修饰符 +\end_layout + +\end_inset + +。对照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Java的访问控制修饰符" + +\end_inset + +可以看出,default修饰的(即不使用任何修饰符)的属性和方法对同一个包内的其他类是可见的:即可以读,也可以修改。因此,default修饰符也被称为“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +包范围 +\end_layout + +\end_inset + +”的修饰符,它以包为限界定了访问权限,这是一种很自然的权限划分,因此被Java确定为“default”(默认)情形。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +default的意思是默认修饰符,即没有在属性和方法前面指定修饰符的情形,并非要显式的指定一个“default”的修饰符。实际上,java中不存在一个名字叫做“ +default”的修饰符。因此,下文中的default均指: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在属性、方法、类前面不使用任何访问控制修饰符 +\end_layout + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ac-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ac-Client.java" + +\end_inset + +中,BankCard类中的username和password属性以及withdraw方法都是default的,因此同一个包中的Client类可以随意修改密码,随 +意取钱: +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +这太不安全了! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/BankCard.java" +lstparams "float,caption={演示default修饰符的BankCard.java},label={ac-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/Client.java" +lstparams "float,caption={Client.java},label={ac-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +执行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +钱被取走啦! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +default修饰符意味着同一个包内的其他类都可以随意操纵你的属性和方法,这是一个危险的设置!设想一下,黑客把一个自己写的破坏性Java文件放到你的包里面,然后 +修改你的银行卡密码,盗取你的钱财...因此,default修饰符给软件的安全留了一个后门,并不是一个好的“默认值”! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +private修饰符 +\end_layout + +\begin_layout Standard +default给了同一个包下的其他类“篡改”本类的机会, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +private +\end_layout + +\end_inset + +private修饰符则完全杜绝了这个问题:从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Java的访问控制修饰符" + +\end_inset + +可以看出,private修饰过的属性和方法只有本类可以访问,即只有本类可以读取和修改,对同一个包下的其他类、子类以及所有其他的类都不可见。正如private的名 +字所宣示的, 这是一个完全隐私的保护性设置,特别适合于本节开头所述的“松耦合原则”中组件(对象)内部属性、方法的表达。实际上, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在绝大多数情况下,我们应该将类的属性和方法设置为private +\end_layout + +\end_inset + +,然后根据需要或者设计要求逐步放开限制,以达到对组件(对象)最大程度的封装和保护。 +\end_layout + +\begin_layout Standard +有时我们希望对外一定程度上暴露私有的属性,即不直接暴露私有(private)属性,而是通过一个公有(public)的方法间接的访问私有属性。这样如果需要的话,我 +们可以在这个方法中对属性修改做合法性检查,避免任意的篡改私有属性。这些能够读取和设置私有属性的方法往往以get和set开头,一般称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +getter/setter方法 +\end_layout + +\end_inset + +,比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Person { +\end_layout + +\begin_layout Plain Layout + + private String username; +\end_layout + +\begin_layout Plain Layout + + private String password; +\end_layout + +\begin_layout Plain Layout + + private String email; +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public void setUsername(String newUsername) { +\end_layout + +\begin_layout Plain Layout + + username = newUsername; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public String getUsername() { +\end_layout + +\begin_layout Plain Layout + + return username; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + // setPassword/getPassword等方法和getUsername/setUsername类似 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +大多数IDE开发环境可以帮助我们自动生成这些getter/setter方法:在类中右键选择“Insert Code... +\begin_inset Quotes erd +\end_inset + +,然后选择“Getter and Setter...”,选中希望自动生成getter/setter方法的私有属性,可以多选,然后点击“Generate”按钮即可。自动 +产生的getter/setter代码中使用了this关键字,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:对象的存储模型" + +\end_inset + +讨论它。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +改造 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:default修饰符" + +\end_inset + +中的例子,使得BankCard类中的username和password都是private的。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acPrivate-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acPrivate-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprivate/BankCard.java" +lstparams "float,caption={演示private修饰符的BankCard.java},label={acPrivate-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprivate/Client.java" +lstparams "float,caption={Client.java},label={acPrivate-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +可以看出,我们在Client中无法直接修改密码了,否则会报告语法错误。 +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +BankCard类的两个属性使用private修饰符后,Client类无法直接访问这两个属性了。可以通过提供getter/setter方法,方便Client访问 +BankCard的这两个属性。请读者试着在BankCard中加上getter/setter方法,并在Client中调用getter/setter修改用户名和密码 +。 +\end_layout + +\begin_layout Problem +构造方法是私有的会怎样?为什么? +\end_layout + +\begin_layout Problem +我们在Client类中使用new BankCard()创建对象时会试图调用BankCard的构造方法,但是此时BankCard的构造方法是私有的,意味着对同一个 +包下面的Client不可见!因此,如果使用private修饰构造方法,意味着你不希望别人直接通过new操作符创建对象。那么这个类还有啥用处呢?实际上,在这种情况 +下,可以通过提供一个方法来创建对象,比如下面的代码片段: +\end_layout + +\begin_layout Problem +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class BankCard { +\end_layout + +\begin_layout Plain Layout + + .... +\end_layout + +\begin_layout Plain Layout + + private BankCard () {} +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public static BankCard getInstance() { +\end_layout + +\begin_layout Plain Layout + + new BankCard(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Problem +在本类中new BankCard()当然是没有问题的了,所以通过一个公有的方法getInstance()来创建对象,则Client就可以这样使用: +\end_layout + +\begin_layout Problem +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Client { +\end_layout + +\begin_layout Plain Layout + + .... +\end_layout + +\begin_layout Plain Layout + + BankCard card = BankCard.getInstance(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Problem +此种用法常见于工厂模式 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +、单例模式 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +等。 +\end_layout + +\begin_layout Subsubsection +protected修饰符 +\end_layout + +\begin_layout Standard +private修饰过的属性和方法只有本类可以访问,default修饰过的属性和方法本类和本包其他类可以访问, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +protected +\end_layout + +\end_inset + +protected修饰过的属性和方法则进一步放宽了限制:除了本类、本包之外,子类也可以访问。或者说,我们使用protected修饰属性和方法的唯一目的就是: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +子类可见 +\end_layout + +\end_inset + +,这也是protected这个修饰符的本意:受保护的本意大概就是家族内无本质纷争的意思,所谓“兄弟阋于墙,外御其辱”,可以理解为一家人不见外,不是一家人就对不起 +了,不可见。因此,protected修饰的属性和方法本人可见(这个很自然),同包内的其他类(同胞)可见,子类(对自己的下一代不隐瞒,即使下一代不在同一个包内)可 +见,其他外族(其他包中的类)则不可见。当然, +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:public修饰符" + +\end_inset + +的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public修饰过的属性和方法在子类也是可见的,但是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public往往太宽泛,实际应用的时候应该严格限制。 +\end_layout + +\begin_layout Example +使用protected改造银行卡的例子,观察protected是如何保护属性和方法的 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/acprotected/other +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-CreditCard.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/BankCard.java" +lstparams "float,caption={演示protected修饰符的BankCard.java},label={acprotected-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/other/CreditCard.java" +lstparams "float,caption={演示protected修饰符的CreditCard.java},label={acprotected-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/other/Test.java" +lstparams "float,caption={Test.java},label={acprotected-Test.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client.java得到如下结果: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +钱被取走啦! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在BankCard中,我们将两个属性和两个方法均使用protected修饰,因此其子类CreditCard能够直接访问这两个属性和方法。注意到CreditCar +d和BankCard不在一个包内,这并不影响CreditCard访问父类BankCard中protected修饰过的属性和方法,也就是说,Java首先根据“父子 +”关系检查访问权限,然后再根据包内还是包外检查访问权限。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-Test.java" + +\end_inset + +中创建了一个BankCard对象,但是由于Test类和BankCard不在同一包内,也不是BankCard的子类,因此Test中创建的BankCard对象无法直 +接访问protected修饰过的属性和方法。 +\end_layout + +\begin_layout Subsubsection +public修饰符 +\begin_inset CommandInset label +LatexCommand label +name "subsec:public修饰符" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public修饰符当然就是无限制的意思了,在属性和方法的访问控制中,public修饰符应该谨慎使用,只有确定需要公开的情形才使用public修饰属性和方法,否则 +和C语言有啥区别呢?请记住,public意味着公开的承诺,一旦你使用了public修饰属性和方法,就意味着你失去了后续修改这部分代码的机会。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +虽然在属性和方法上要谨慎使用pubic修饰符,但是构造方法往往是public的,这是因为绝大多数情况下,我们编写了一个类是希望任何人都能够创建相应的对象的。试想 +,如果构造方法是protected、default甚至是private的,会怎样?这里列出四种修饰符修饰构造方法的情形: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +public的构造方法 +\end_layout + +\end_inset + +:任何人都可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +protected的构造方法 +\end_layout + +\end_inset + +:只有本类、子类和同一个包内的类可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +default的构造方法 +\end_layout + +\end_inset + +:只有本类、同一个包内的类可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +private的构造方法 +\end_layout + +\end_inset + +:只有本类可以通过new创建对象 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +属性和方法的访问控制小结 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:访问控制保护范围示意" + +\end_inset + +可以帮助我们理解public/protected/private修饰符的保护范围。一般的,可以根据 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Java的访问控制修饰符" + +\end_inset + +按照从左向右的顺序推断修饰符在当前语境中的保护作用。比如,如果父类中的属性是default的,并且子类和父类不在同一个包中,则子类是无法访问父类中该属性的。但是 +如果子类和父类在同一个包中,则子类可以访问父类中这个default修饰的属性—此时default修饰符允许同一包中的类访问这个条件起了作用。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/access-control-overview.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +访问控制保护范围示意 +\begin_inset CommandInset label +LatexCommand label +name "fig:访问控制保护范围示意" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在编程实践中,我们往往根据以下的原则来确定使用什么修饰符控制属性和方法的访问权限: +\end_layout + +\begin_layout Itemize +首先考虑使用最严格的访问控制策略,即优先考虑使用private修饰属性和方法,除非你有足够的理由,比如希望子类可见,则选择使用protected修饰符。 +\end_layout + +\begin_layout Itemize +尽量避免default修饰符,即不使用任何修饰符,这是一个危险和不好的编程习惯。 +\end_layout + +\begin_layout Itemize +尽量避免public修饰符,这比default更危险!有两个例外:一是构造方法一般是public的,理由在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:public修饰符" + +\end_inset + +已经讲过了。二是常量一般也是public的。 +\end_layout + +\begin_layout Subsection +类的访问控制 +\begin_inset CommandInset label +LatexCommand label +name "subsec:类的访问控制" + +\end_inset + + +\end_layout + +\begin_layout Standard +属性和方法的访问控制有4个级别,类的访问控制则简单的多,只有两个级别: +\end_layout + +\begin_layout Enumerate +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public:public修饰的类,在任何包中都可见。 +\end_layout + +\begin_layout Enumerate +\begin_inset Index idx +status open + +\begin_layout Plain Layout +default +\end_layout + +\end_inset + +default:default修饰(即没有任何修饰符)的类,只在本包中可见。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +在一个Java源文件中,只有一个类可以是public的,而且这个public的类的类名和文件名要严格一致。在这个Java源文件中,除了这个public的类之外, +依然可以定义其他的default修饰(即没有使用任何修饰符)的类。但是一般情况下不建议这样做,应该每个类建立单独的Java源文件。原因是我们一般是通过浏览这个包 +(目录)了解这个包中包含了哪些类,如果在一个源文件中包含了多个类,一方面我们无法从文件的目录了解包的内容,另一方面,这些隐藏在其他类文件中的类就只能限于包内访问 +了。一个例外是内部类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:内部类" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:内部类" + +\end_inset + + +\end_layout + +\begin_layout Standard +有的时候,我们为了防止命名冲突,或者为了安全起见,定义一个类只希望局限在某个类内使用,这样的类就是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +内部类 +\end_layout + +\end_inset + +内部类(Inner Class): +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +定义在一个类内部的类 +\end_layout + +\end_inset + +,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +class OuterClass { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + class InnerClass() { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + +可以把内部类理解为在类内部定义的第三种资源,其他两种是属性和方法,因此类比属性和方法的用法,我们可以这样使用内部类: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +OuterClass.InnerClass innerObject = outerObject.new InnerClass(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:内部类的创建过程" + +\end_inset + +形象的表示了内部类的创建过程。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/new-innerclass.png + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +内部类的创建过程 +\begin_inset CommandInset label +LatexCommand label +name "fig:内部类的创建过程" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写NotePad类,使用内部类Editor实现编辑功能 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/ac/innerclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "NotePad.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "innerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/innerclass/NotePad.java" +lstparams "float,caption={NotePad.java},label={NotePad.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/innerclass/Client.java" +lstparams "float,caption={Client.java},label={innerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +parsing:test string +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +通过这个例子我们要注意到两点: +\end_layout + +\begin_layout Itemize +如何创建一个内部类对象:首先要创建一个外部类对象,然后才能创建一个内部类对象。 +\end_layout + +\begin_layout Itemize +内部类对象可以访问外部包围类(即内部类是在这个外部包围类中定义的)的属性和方法,即使这个外部类的属性和方法是private的(请读者试着把content属性设置 +为private看看会怎样?试着把parseContent方法设置为private看看会怎样?)。这个很容易理解:内部类和外部类的属性和方法是平等的, +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +就像是本类的方法可以无限制访问本类的属性一样 +\end_layout + +\end_inset + +,本类的内部类当然可以无限制访问本类的属性和方法。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status collapsed + +\begin_layout Plain Layout +也许你会说,NotePad这个例子中,使用内部类Editor实现parseContent这个功能太矫情,根本没有必要!是的,在这种简单的情况下确实没有必要绕道使 +用内部类。但是设想NotePad不仅仅需要提供文本编辑,还需要文本搜索、格式转换等等其他功能,而且每类功能不止包含一个方法,那么为了逻辑上清晰起见,使用内部类将 +文本编辑相关的方法组织为内部类NotePad.Editor,将文本搜索相关的方法组织为内部类NotePad.Search,将格式转换相关的方法组织为内部类NoteP +ad.Transfer就容易理解了。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +引用类型 +\begin_inset CommandInset label +LatexCommand label +name "sec:引用类型" + +\end_inset + + +\end_layout + +\begin_layout Standard +很多人会说,Java语言比C语言更“进步”或者“安全”的一个原因是Java没有指针数据类型,其实这是不确切的。Java的确没有像C语言那样提供“指针 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +指针 +\end_layout + +\end_inset + +”这种基本数据类型,但是Java确实使用了指针,而且指针的正确使用同样很重要。Java中的指针叫做“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +引用 +\end_layout + +\end_inset + +引用”。 +\end_layout + +\begin_layout Standard +和C语言一样,我们可以从变量在内存中的存储来理解Java的引用(指针)。Java的基本数据类型所形成的变量不是引用,变量的名字直接代表了变量所在存储单元的内容, +这和C语言中的非指针变量是一样的。除此之外,Java中的数组、对象、Enum等的名字,都是引用(指针),如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java中的引用" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/reference-object.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java中的引用 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java中的引用" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比如下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Person person = new Person(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +之前我们把person叫做“Person”类型的对象,其实这是不严谨的,应该叫做“Peron”类型对象的名字。也就是说,person仅仅是一个对象的名字,这个名 +字其实是指向person对象的一个引用(指针)。因此下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Person person; +\end_layout + +\begin_layout Plain Layout + +person.goHome(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +就会报“NullPointException +\begin_inset Quotes erd +\end_inset + +错误,即“空指针异常”。这里只是声明了一个person类型的引用,但是并没有初始化,也就是说,person并没有指向任何实质的Person类型的对象。因此在初始 +化之前,任何对象的引用都是null,这和C语言的指针含义完全一样:在C语言中,任何指针在初始化之前都是null指针,直接使用null指针是有风险的。而在Java +中,Java虚拟机会自动侦测空指针,任何对空指针 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +空指针 +\end_layout + +\end_inset + +(未初始化的对象引用)都会报告NullPointException异常。NullPointException异常如此常见,通常大家都把NullPoinitExc +eption异常简称为“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +NPE +\begin_inset Index idx +status open + +\begin_layout Plain Layout +NPE +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +”。 +\end_layout + +\begin_layout Standard +在C语言中,指针作为函数的参数是一个强大的特性,即可以帮助把大量的数据传入函数(输入参数),也可以帮助函数返回大量的数据(输出参数)。在Java中,我们也要区分 +方法的参数为简单数据类型和对象(引用)两种情况。 +\end_layout + +\begin_layout Example +使用对象作为方法的参数 +\begin_inset CommandInset label +LatexCommand label +name "exa:使用对象作为方法的参数。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们首先定义一个简单的Person类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Person.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Person.java" +lstparams "float,caption={Person.java},label={objref-Person.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +测试类Client.java的代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Client.java" +lstparams "float,caption={Client.java},label={objref-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +Client的运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\align left +Person[username=zhangsan,password=123456,seniority = 20,salary = 5000.0] +\end_layout + +\begin_layout Plain Layout +\align left +Person[username=zhangsan,password=123456,seniority = 20,salary = 6000.0] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +可以看出,adjustSalary方法中改变了person对象的属性slary的值, +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +这和C语言中使用指针作为函数参数的作用如出一辙 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +两个引用指向同一个对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:两个引用指向同一个对象。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们借用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用对象作为方法的参数。" + +\end_inset + +中定义的Person类设计一个测试类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Client1.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Client1.java" +lstparams "caption={Client1.java},label={Client1.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client1的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +zhangsan1 == zhangsan2 ? false +\end_layout + +\begin_layout Plain Layout +zhangsan3 == zhangsan1 ? true +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:两个引用指向同一个对象。" + +\end_inset + +中,看起来zhangsan1和zhangsan2两个对象是一样的,有相同的名字和密码设置。但是,这是两个不同的对象,即不同的引用,在内存中有不同的地址。而zha +ngsan3指向了zhangsan1,即zhangsan3和zhangsan1指向了同一个对象,因此zhangsan1和zhangsan3是相等的,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:对象的引用示意图" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/object-ref-model.eps + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +对象的引用示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:对象的引用示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Subsection* +this +\begin_inset Note Note +status open + +\begin_layout Plain Layout +满足李震梅老师的要求 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +this +\end_layout + +\end_inset + +this关键字表示“对象本身”,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +指向当前对象的引用 +\end_layout + +\end_inset + +。比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Person.java" + +\end_inset + +中,构造方法是这样写的: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public Person(String username, String password) { +\end_layout + +\begin_layout Plain Layout + + this.username = username; +\end_layout + +\begin_layout Plain Layout + + this.password = password; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其中,this.username即指当前对象的username属性,这样就把作为参数的username和作为对象属性的username区分开来了。 +\end_layout + +\begin_layout Subsection* +super +\begin_inset Note Note +status open + +\begin_layout Plain Layout +满足李震梅老师的要求 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:对象的创建过程" + +\end_inset + +中已经看到,对象在创建时会“递归的构造父类对象”,也就是说,递归的调用父类的构造方法,这并不需要我们在子类的构造方法中做什么。但是,有时候我们希望能够控制对象的 +构造过程,也就是说,打破java默认的对象构造过程,在构造对象的链条中加入自定义的成分,这个时候我们可以使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +super +\end_layout + +\end_inset + +super关键字:指向父类对象的引用。我们通过一个例子来说明 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +super +\end_layout + +\end_inset + +super在对象的构造过程中是如何起作用的。 +\end_layout + +\begin_layout Example +使用super自定义对象的构造过程 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/inherit/step4 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +限于篇幅,这里只列出了CreditCard.java的完整代码,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "inherit-step4-CreditCard.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step4/CreditCard.java" +lstparams "float,caption={CreditCard.java},label={inherit-step4-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果和分析 +\end_layout + +\begin_layout Standard +我们可以分三种情况运行此例,分别在CreditCard类的构造方法CreditCard(String cardNo)中: +\end_layout + +\begin_layout Enumerate +调用super()时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,调用super()会触发“递归的构造父类对象”。 +\end_layout + +\begin_layout Enumerate +调用super(cardNo)时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,调用super(cardNo)后,就不会再调用父类的无参构造方法。 +\end_layout + +\begin_layout Enumerate +不调用父类的构造方法时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,不显式调用父类的构造方法,实际上也会默认调用父类的无参构造方法,和显式调用super()效果是一样的。也就是说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +我们在创建子类对象时,要么通过明确调用父类的有参构造方法递归的创建父类对象,要么java会递归的调用父类的无参构造方法来初始化各级父类对象 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Section +static +\begin_inset CommandInset label +LatexCommand label +name "sec:static" + +\end_inset + + +\end_layout + +\begin_layout Standard +一个典型的面向对象的设计如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:面向对象编程的基本思路" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/book-nostatic.eps + width 80col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +面向对象编程的基本思路 +\begin_inset CommandInset label +LatexCommand label +name "fig:面向对象编程的基本思路" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,我们在抽象出一类事物的共同特性后,编写相应于这类事物的一个类,在这里是Book;然后根据Book类再创建若干个Book类型的对象,book1、book +2等等。有了book对象后,就可以访问book对象的属性和方法了,比如调用:book.edit()。总之,原则上我们只有 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +持有一个对象后(其实是持有一个指向对象的引用),才能操作这个对象 +\end_layout + +\end_inset + +。由 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:面向对象编程的基本思路" + +\end_inset + +可以看出,不同对象的状态(属性值)往往是不同的。 +\end_layout + +\begin_layout Standard +考虑下面的情形: +\end_layout + +\begin_layout Itemize +比如无论书籍的类型、开张等,书籍的“章”一般都定义为“第一章”、“第二章”,因此可以将CHAPTER_ONE定义为常量,而且不随Book对象的变化而变化,即无论 +有多少个Book对象,也无论Book对象的其他属性如何,CHAPTER_ONE,CHAPTER_TWO的值都不会变化。在这种情况下,每个Book对象都保存一份C +HAPTER_ONE,CHAPTER_TWO属性是没有必要的。解决这个问题的方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static常量" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +比如给每个Book对象一个id,要求这个id能够自动增长,即假设第一个Book对象的id为1,第二个Book对象的id自动设置为2,以此类推。解决这个问题的方法 +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static属性" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +比如我们要设计一个方法usage(),当调用这个方法时打印出Book类的用法。可以看出这个方法和对象的状态没有任何关系,也就是说,usage方法没有必要读取对象 +的状态,因此也没有必要每个对象都保存一个usage方法。解决这个问题的方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static方法" + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +static常量 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static常量" + +\end_inset + + +\end_layout + +\begin_layout Standard +显然,常量没有必要在每个对象中都保存一份,只需要在类的定义中保存一份即可。因此,正如我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:常量和常量的命名" + +\end_inset + +中提到的,常量一般的命名方式都是public static final的,其中的static表示静态变量,即只在类定义中保存一份的变量,或者说,所有对象共享一份 +的变量。由于是常量,也通常使用final修饰符限定此变量不可修改,即常量(常数变量)。由于静态常量只和类有关而和具体对象无关,因此静态常量 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +静态常量 +\end_layout + +\end_inset + +又称为 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类常量 +\end_layout + +\end_inset + +类常量 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +在类中定义常量后,我们有两种方式使用(引用)这个常量: +\end_layout + +\begin_layout Enumerate +直接使用类名引用类常量。也就是说,不需要创建一个此类的对象,可以直接通过类名引用类常量。 +\end_layout + +\begin_layout Enumerate +使用对象引用类常量。如果已经创建了对象,通过对象引用类常量也是可以的。 +\end_layout + +\begin_layout Example +在Book中定义常量CHAPTER_ONE,CHAPTER_TWO,并使用两种方法引用此常量。 +\begin_inset CommandInset label +LatexCommand label +name "exa:在Book中定义常量CHAPTER_ONE,CHAPTER_TW" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticcontant-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticconstant-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticconstant/Book.java" +lstparams "float,caption={使用了static常量的Book.java},label={staticcontant-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticconstant/Client.java" +lstparams "float,caption={Client.java},label={staticconstant-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果和分析 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +第一章 +\end_layout + +\begin_layout Plain Layout +第一章 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +虽然两种方式都打印出了正确的结果,但是第二种引用static常量的方式是不建议的:即不经济,也没必要。 +\end_layout + +\begin_layout Exercise +在JDK源代码中找到一些常量的定义,认真体会: +\end_layout + +\begin_layout Itemize +常量的惯用命名方式,。 +\end_layout + +\begin_layout Itemize +常量的使用(引用)方式。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +JDK源代码可以从 +\begin_inset CommandInset href +LatexCommand href +name "https://github.com/dmlloyd/openjdk" +target "https://github.com/dmlloyd/openjdk" +literal "false" + +\end_inset + +下载。在openjdk的源代码目录下执行如下命令可以找到非常多的常量定义: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +$ grep -ri +\begin_inset Quotes eld +\end_inset + +public static final +\begin_inset Quotes erd +\end_inset + + * +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +static属性 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static属性" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们用static修饰类的属性时,这个属性就成为“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类属性 +\end_layout + +\end_inset + +类属性”。相对于“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例属性 +\end_layout + +\end_inset + +实例属性”(每个对象都有一份独立的拷贝), +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +类属性在此类的所有对象之间共享一份拷贝 +\end_layout + +\end_inset + +。对于类属性,我们需要注意到三点: +\end_layout + +\begin_layout Itemize +类属性的引用。我们一般采用Book.nextId的方式,即直接使用类来引用类属性,这也是类属性设计的本意。 +\end_layout + +\begin_layout Itemize +类属性相当于在对象之间共享的变量,因此一个对象修改了类属性,会影响另外对象的状态,因此使用类属性实际上导致了对象之间的“紧耦合”,造成了系统模块之间的界面不清晰 +,这是现代软件设计中力图规避的地方。因此,在软件设计实践中要尽量避免使用类属性,除非你有足够的理由。 +\end_layout + +\begin_layout Itemize +类属性的初始化问题。类属性的默认值和普通属性没有任何区别,但是由于类属性和具体对象没有关联,因此无法在对象的构造方法中初始化。Java提供了“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +static块 +\end_layout + +\end_inset + +”的方式初始化类属性,比如在Book中这样初始化nextId类属性: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + // 初始化静态属性,这里设置id的起点值 +\end_layout + +\begin_layout Plain Layout + + static { +\end_layout + +\begin_layout Plain Layout + + nextId = 100; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + +和对象的构造方法不同的是,static代码块在整个应用程序运行期间只会执行一次,而对象的构造方法在创建对象时都会执行一次。 +\end_layout + +\begin_layout Example +编写一个Book类,book对象使用自动增长的id作为对象的标识。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticvariable-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticvariable-Client.java" + +\end_inset + + 。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticvariable/Book.java" +lstparams "float,caption={Book.java},label={staticvariable-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticvariable/Client.java" +lstparams "float,caption={Client.java},label={staticvariable-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Book{id=100, title=Thinking in Java, author=null, price=0.0} +\end_layout + +\begin_layout Plain Layout +Book{id=101, title=Design Patterns, author=null, price=0.0} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +static方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +和类属性 +\begin_inset Foot +status open + +\begin_layout Plain Layout +需要澄清的是,下面两种说法是等价的,我们可能在不同的场合交替使用不同的名称: +\end_layout + +\begin_layout Itemize +类属性=静态属性 +\end_layout + +\begin_layout Itemize +类方法=静态方法 +\end_layout + +\begin_layout Itemize +实例属性=实例变量=非静态属性=非静态变量 +\end_layout + +\begin_layout Itemize +实例方法=实例函数=对象方法=对象函数=非静态方法 +\end_layout + +\end_inset + +一样, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类方法 +\end_layout + +\end_inset + +类方法指使用static修饰的方法,类方法在所有对象之间共享一个拷贝。类方法通常用于一些工具类的定义,比如JDK中的Math类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html +\end_layout + +\end_inset + +里面的方法都是类方法。 +\end_layout + +\begin_layout Standard +类方法是在对象创建之前就存在的,因此在类方法中不能访问实例属性(对象还没有创建,实例属性根本不存在),只能访问类属性(使用static修饰的属性),见下面的代码 +片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Test { +\end_layout + +\begin_layout Plain Layout + + string name; +\end_layout + +\begin_layout Plain Layout + + static int nextId; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + static void testStaticMethod() { +\end_layout + +\begin_layout Plain Layout + + nextId++; // 这是可以的 +\end_layout + +\begin_layout Plain Layout + + //name = "zhangsan"; // 这是不允许的,语法错误 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +在Book类中增加一个类方法usage(),调用这个方法显示一段文字,说明这个类的用途。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +设计一个字符串处理工具类,给出如下的方法实现: +\end_layout + +\begin_layout Itemize +能够方便的删除字符串的最后一个字母; +\end_layout + +\begin_layout Itemize +能够自动将字符串转化为网址形式,即自动增加 +\begin_inset Quotes erd +\end_inset + +http:// +\begin_inset Quotes erd +\end_inset + +前缀; +\end_layout + +\begin_layout Subsection +*内部类回头看 +\end_layout + +\begin_layout Standard +在 +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:内部类" + +\end_inset + +中,我们看到内部类就像是定义在类内部的方法一样。类的方法分为静态方法和非静态方法,静态方法只能访问类的静态属性,那么内部类是不是也可以使用static修饰呢? +\end_layout + +\begin_layout Standard +实际上,java的内部类分为四种类型: +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +成员内部类(member inner class) +\end_layout + +\end_inset + +,即我们在 +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:内部类" + +\end_inset + +中讨论的,和实例方法用法类似的内部类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +静态内部类(static inner class) +\end_layout + +\end_inset + +,使用static修饰的内部类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +局部内部类(local inner class) +\end_layout + +\end_inset + +,定义在方法内部的类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +匿名内部类(anonymous inner class) +\end_layout + +\end_inset + +,只使用一次的内部类。 +\end_layout + +\begin_layout Standard +内部类的第一种形式:成员内部类我们已经讨论过了,这里不再赘述,下面我们分别看一下其他三种内部类: +\end_layout + +\begin_layout Subsubsection +静态内部类 +\end_layout + +\begin_layout Standard +静态内部类即使用static修饰的内部类,也常叫做“嵌套类”(Nested Class)。静态内部类有两个重要的意义: +\end_layout + +\begin_layout Enumerate +正如静态方法一样,使用静态内部类可以限制内部类对外部包围类属性和方法的访问。对比成员内部类, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +静态内部类只能访问外部包围类的静态属性和静态方法 +\end_layout + +\end_inset + +。使用静态内部类的好处是,如果我们在外部包围类中不定义静态属性和方法,实际上就切断了静态内部类和外部包围类的联系,使得静态内部类成为一个独立的模块,符合“松耦合 +”的现代软件设计理念。因此可以看到在实际的软件开发中,内部类很多都定义为静态内部类,比如Android程序设计中,大量使用到静态内部类。 +\end_layout + +\begin_layout Enumerate +静态内部类对象的创建不需要首先创建外部包围类对象,比如Outer.Inner innerObj = new Outer.Inner();这实际上让静态内部类成为了一 +个受限的顶级类 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要展开说明顶级类和受限的含义吗? +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +编写一个静态内部类,演示静态内部类访问外部包围类的静态属性和静态方法 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/nestedclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "nestedclass-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "nestedclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/nestedclass/Book.java" +lstparams "caption={Book.java},label={nestedclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/nestedclass/Client.java" +lstparams "caption={Client.java},label={nestedclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book[version=1] by someone +\end_layout + +\begin_layout Plain Layout +publish the book[Learning Java based on C] +\end_layout + +\begin_layout Plain Layout +Book.Editor.usage() called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +局部内部类 +\end_layout + +\begin_layout Standard +局部内部类定义在方法内部,可以认为是方法的局部变量。就像方法的局部变量一样,局部内部类的作用范围仅限于方法内部,即在方法外部是无法创建局部内部类的对象的。局部内 +部类可以使用所在方法中的属性,也可以访问类的实例属性和类属性。 +\end_layout + +\begin_layout Standard +局部内部类的使用场合较少,通常在组织复杂方法代码时使用。但是,由于在方法内部定义类,可能导致方法体臃肿,使得方法的逻辑层次不清晰,在使用局部内部类时要适当取舍。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举个在openjdk中的例子?或者实际项目中的例子 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写一个局部内部类,演示局部内部类对方法属性的访问和局部内部类对象的创建方式 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/localinnerclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "localninnerclass-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "localninnerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/localinnerclass/Book.java" +lstparams "float,caption={Book.java},label={localninnerclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/localinnerclass/Client.java" +lstparams "float,caption={Client.java},label={localninnerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book before publish +\end_layout + +\begin_layout Plain Layout +publish book[version=1,id=0 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:匿名内部类" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:JAVA图形用户界面的事件机制" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:接口上的匿名内部类" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:使用匿名内部类" + +\end_inset + +中,我们还会看到匿名内部类的使用。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果一个内部类只使用一次的话,就没有必要非要给这个内部类起个名字了,这就是匿名内部类的使用场合。匿名内部类由于没有名字,必须从父类继承下来(在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:接口上的匿名内部类" + +\end_inset + +中我们可以看到,也可以实现一个接口)。 +\end_layout + +\begin_layout Example +使用匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "exa:使用匿名内部类" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annonymousinnerclass-Book.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annonymousinnerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/annnoymousinnerclass/Book.java" +lstparams "float,caption={Book.java},label={annonymousinnerclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/annnoymousinnerclass/Client.java" +lstparams "float,caption={Client.java},label={annonymousinnerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book before publishing +\end_layout + +\begin_layout Plain Layout +publish the book[Learning Java Based on C] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用匿名内部类" + +\end_inset + +中,我们组合使用了匿名对象和匿名内部类,这是由于在这种情况下,创建的匿名内部类对象也只使用一次,就没有必要起个名字了。我们给对象一个名字的目的不就是在重复使用这 +个对象的时候方便引用吗? +\end_layout + +\begin_layout Exercise +还原 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用匿名内部类" + +\end_inset + +为不使用匿名内部类的情形,对比一下说明匿名内部类的优点和缺点。 +\end_layout + +\begin_layout Subsection +*内部类的进一步讨论 +\begin_inset CommandInset label +LatexCommand label +name "subsec:内部类的进一步讨论" + +\end_inset + + +\end_layout + +\begin_layout Standard +在前面的讨论中,内部类都是没有父类的。但是,内部类其实也可以是一个子类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:实现多个接口" + +\end_inset + +中,我们可以看到,内部类也可以实现(多个)接口,从而更好的实现Java的多继承。 +\end_layout + +\end_inset + +,这样我们在外部包围类中定义多个内部类,每个内部类继承自一个父类,就巧妙的绕过了Java没有多继承的限制,曲线的实现了多继承。 +\end_layout + +\begin_layout Example +编写程序,使用内部类达到多继承的目的。 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写程序,使用内部类达到多继承的目的。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-Printer.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-Copier.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-SmartPrinter.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-SmartPrinterClient.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/Printer.java" +lstparams "float,caption={Printer.java},label={multiinherit-Printer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/Copier.java" +lstparams "float,caption={Copier.java},label={multiinherit-Copier.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/SmartPrinter.java" +lstparams "float,caption={SmartPrinter.java},label={multiinherit-SmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/SmartPrinterClient.java" +lstparams "float,caption={SmartPrinter.java},label={multiinherit-SmartPrinterClient.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +basic print +\end_layout + +\begin_layout Plain Layout +SmartPrinter print +\end_layout + +\begin_layout Plain Layout +basic copy +\end_layout + +\begin_layout Plain Layout +SmartPrinter copy +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,在SmartPrinterTest中,我们只是使用SmartPrinter对象即可同时获得print和copy两个功能,好像同时从Printer和Co +pier继承下来一样。SmartPrinter类其实是一个Facade类 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +,当我们希望在一个类中融合多项功能时,为了代码逻辑清晰起见,借用内部类实现多继承是常见的策略。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举一个在switch中使用Enum的例子 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +内部类的作用范围 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section* +思考和练习 +\end_layout + +\begin_layout Exercise +编写一个default修饰的类,尝试在其他包中创建该类的对象,结果会怎样? +\begin_inset CommandInset label +LatexCommand label +name "exer:编写一个default修饰的类,尝试在其他包中创建该类的对象,结" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +考虑下面的代码,指出哪些是类属性,哪些是实例属性? +\begin_inset CommandInset label +LatexCommand label +name "exer:考虑下面的代码,指出哪些是类属性,哪些是实例属性?" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +http://docs.oracle.com/javase/tutorial/java/javaOO/QandE/creating-questions.html +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture_guide.lyx b/guide/lecture_guide/lecture_guide.lyx new file mode 100644 index 0000000..12c53b3 --- /dev/null +++ b/guide/lecture_guide/lecture_guide.lyx @@ -0,0 +1,233 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{book-preamble.tex} +\usepackage[printwatermark]{xwatermark} +\newwatermark[allpages,fontfamily=bch,color=gray!25,angle=45,scale=3, +xpos=0,ypos=0]{DRAFT} +\end_preamble +\options openany,schema=chinese,heading=true +\use_default_options true +\begin_modules +logicalmkup +tip-inset +warning-inset +note-inset +shapepar +theorems-bytype +theorems-chap-bytype +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Serif" +\font_sans "default" "DejaVu Sans" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered true +\pdf_bookmarksopen true +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks false +\pdf_pdfborder true +\pdf_colorlinks false +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\paperwidth 185mm +\paperheight 260mm +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle empty +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +前言部分 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +\begin_inset CommandInset toc +LatexCommand tableofcontents + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Newpage cleardoublepage +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +建立一个怎样的教学模型?类似于Mehran Sahami的karel如何?游戏,有趣,富有变化是重点。 +\end_layout + +\begin_layout Plain Layout +坦克大战也是一个很好的场景,对战对学生是很有吸引力的。 +\end_layout + +\begin_layout Plain Layout +CS呢?角色扮演。Mud? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +AddLabels +\end_layout + +\end_inset + + +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +在页边使用章序号导航 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture1.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture2.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture3.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage cleardoublepage +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/readme.MD b/guide/lecture_guide/readme.MD new file mode 100644 index 0000000..1c6e89e --- /dev/null +++ b/guide/lecture_guide/readme.MD @@ -0,0 +1 @@ +教案 diff --git a/guide/tests-guide.lyx b/guide/tests-guide.lyx index dc417d6..7b56ffe 100644 --- a/guide/tests-guide.lyx +++ b/guide/tests-guide.lyx @@ -1047,8 +1047,8 @@ status open \begin_layout Plain Layout \align center \begin_inset Graphics - filename imgs/tests/oop-model.svg - scale 60 + filename imgs/tests/oop-model.eps + width 80line% \end_inset From dce6f53d8cee78f87279f4a41088a5c455871fd1 Mon Sep 17 00:00:00 2001 From: subaochen Date: Sun, 30 Aug 2020 19:46:06 +0800 Subject: [PATCH 4/8] new lectures --- guide/lecture_guide/lecture4.lyx | 9374 +++++++++++++++++++++++++ guide/lecture_guide/lecture5.lyx | 3395 +++++++++ guide/lecture_guide/lecture6.lyx | 3415 +++++++++ guide/lecture_guide/lecture7.lyx | 7179 +++++++++++++++++++ guide/lecture_guide/lecture_guide.lyx | 49 + 5 files changed, 23412 insertions(+) create mode 100644 guide/lecture_guide/lecture4.lyx create mode 100644 guide/lecture_guide/lecture5.lyx create mode 100644 guide/lecture_guide/lecture6.lyx create mode 100644 guide/lecture_guide/lecture7.lyx diff --git a/guide/lecture_guide/lecture4.lyx b/guide/lecture_guide/lecture4.lyx new file mode 100644 index 0000000..21b9703 --- /dev/null +++ b/guide/lecture_guide/lecture4.lyx @@ -0,0 +1,9374 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +theorems-bytype +theorems-chap-bytype +coderemarks +note-inset +tip-inset +warning-inset +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #d8daeb +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第四次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:类的继承" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:类的继承" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:访问控制" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:访问控制" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:引用类型" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:引用类型" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:static" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:static" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +继承的概念和使用场合; +\end_layout + +\begin_layout Enumerate +Java访问控制的层次; +\end_layout + +\begin_layout Enumerate +内部类的概念和使用场合; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java的访问控制; +\end_layout + +\begin_layout Enumerate +内部类; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握继承的概念和用法,能够在面向对象的设计中熟练使用继承设计合适的类层次结构; +\end_layout + +\begin_layout Enumerate +熟练掌握Java的访问控制机制,知道在什么情况下使用什么样的访问控制手段; +\end_layout + +\begin_layout Enumerate +了解内部类的概念和用法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +结合访问控制,说一下继承在类的层次设计中如何使用? +\end_layout + +\begin_layout Enumerate +为什么要使用内部类? +\end_layout + +\begin_layout Enumerate +\begin_inset CommandInset ref +LatexCommand vref +reference "exer:编写一个default修饰的类,尝试在其他包中创建该类的对象,结" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Enumerate +\begin_inset CommandInset ref +LatexCommand vref +reference "exer:考虑下面的代码,指出哪些是类属性,哪些是实例属性?" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +面向对象编程基础 +\begin_inset CommandInset label +LatexCommand label +name "chap:面向对象的基本概念" + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/oop.png + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Section +再说C语言的struct +\begin_inset CommandInset label +LatexCommand label +name "sec:再说C语言的struct" + +\end_inset + + +\end_layout + +\begin_layout Standard +C语言以简练、灵活、高效著称,但是C语言本身提供的基本数据类型有限,描述现实世界的能力自然也有限。比如要求输入班级同学的英语和数学成绩并按照平均成绩排序 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这个例子不恰当,排序任务脱离了对象本身,是否换成画图 or animal,涉及到各种图形和图形的操作? +\end_layout + +\end_inset + +,如果我们仅使用C的基本数据类型来设计的话,大概能想到的策略有如下几种: +\end_layout + +\begin_layout Enumerate +每个同学都用三个变量来表示:zhangsan_name, zhangsan_english, zhangsan_math, wangwu_name, + wangwu_english, wangwu_english......。如果班级有40位同学,这需要120个变量来表达,不仅容易写错,还不胜其烦!这个思路显然值得商榷, +为下策。 +\end_layout + +\begin_layout Enumerate +使用数组来分别存储同学的名字、英语成绩和数学成绩,比如下面的代码片段: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +char* name[40]; +\end_layout + +\begin_layout Plain Layout + +float english_score[40]; +\end_layout + +\begin_layout Plain Layout + +float math_score[40]; +\end_layout + +\end_inset + +使用数组极大减少了变量的数量,但是也存在一个问题,我们其实隐含了这样一条规则:name数组的第i个元素(同学)的英语成绩是english_score数组的第i个 +元素,数学成绩是math_score数组的第i个元素。也就是说,这三个数组的对应元素有一一映射的关系。这个一一映射的关系是需要我们程序员自己维护的,也就是说,如 +果我们破坏了这一隐含的规则,无论有意还是无意,编译器并不能帮助我们发现这个“破坏”,因为从语法上,不符合这个隐含规则也是允许的,这即为程序员带来了负担,也为程序 +埋下了隐患。可以看出,带来这些问题的关键原因是三个数组的一一映射关系不是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +语法级别的映射 +\end_layout + +\end_inset + +,编译器无法 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +从语法上保证和检查 +\end_layout + +\end_inset + +这三个数组是否遵循了一一映射的关系,这就是C语言引入struct概念的原因:将变量之间的映射关系语法化,我们看使用struct如何解决这个问题。 +\end_layout + +\begin_layout Enumerate +使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +struct +\end_layout + +\end_inset + +struct描述同学们的英语和数学成绩,代码片段如下: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +struct score{ +\end_layout + +\begin_layout Plain Layout + + char* name; +\end_layout + +\begin_layout Plain Layout + + float english_score; +\end_layout + +\begin_layout Plain Layout + + float math_score; +\end_layout + +\begin_layout Plain Layout + + float avg_score;/*平均成绩*/ +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\begin_layout Plain Layout + +struct score stu_scores[40]; +\end_layout + +\end_inset + +struct在语法上保证了name、english_score、math_score这三个变量是一一映射的,是score结构体的“成员分量 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +成员分量 +\end_layout + +\end_inset + +”,因此struct在语法上保证了名字和成绩不可能张冠李戴,杜绝了可能存在的隐患,也减轻了程序员的思想负担(不需要时刻提醒自己要维护姓名和成绩的映射关系)。所以 +,struct是C语言的重要组成部分,是C语言描述现实世界的重武器,在大型项目中大量使用struct来表达同类事物的共同特征(属性)。比如打开Linux内核源代 +码的头文件目录,我们随处可见大量的struct定义: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +struct font_desc { +\end_layout + +\begin_layout Plain Layout + + int idx; +\end_layout + +\begin_layout Plain Layout + + const char *name; +\end_layout + +\begin_layout Plain Layout + + int width, height; +\end_layout + +\begin_layout Plain Layout + + const void *data; +\end_layout + +\begin_layout Plain Layout + + int pref; +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\end_inset + +因此,我们可以这样定义struct: +\end_layout + +\begin_layout Definition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +struct +\end_layout + +\end_inset + +struct是对一类事物公共属性的描述。 +\end_layout + +\begin_layout Subsection +struct的局限性 +\begin_inset CommandInset label +LatexCommand label +name "subsec:struct的局限性" + +\end_inset + + +\end_layout + +\begin_layout Standard +C语言通过struct大大扩充了C的数据类型,每一个struct都定义了一种新的数据类型来对应客观世界的某种事物,这样C语言不但描述客观世界的能力大大加强了,C +语言程序的可读性、可维护性也大大提高了。 +\end_layout + +\begin_layout Standard +C语言能够更好的描述客观世界,可以给struct记大功一件。但是,我们描述客观世界的目的是认识世界并进而改造世界,struct仅仅是方便了描述世界,对于改造世界 +并没有多大帮助。比如回到我们本章开头的问题:我们不仅仅要输入同学们的成绩,还要按照平均成绩排序。这里至少包含两个方面的“认识世界”和“改造世界”世界的动作: +\end_layout + +\begin_layout Enumerate +计算平均成绩:这是属于进一步认识世界的范畴:根据已有的事物属性,我们可以计算和推断出新的属性。 +\end_layout + +\begin_layout Enumerate +按照平均成绩排序:这是属于改造世界的范畴:对已有事物重新组合排序。 +\end_layout + +\begin_layout Standard +struct帮助我们很好的描述了同学们的名字和成绩的对应关系,但是计算平均成绩和按照成绩排序这两个“动作”,在C语言中是通过独立的函数来实现的,比如下面的代码片 +段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void calculate_avg_score(struct score* score) { +\end_layout + +\begin_layout Plain Layout + + /*按照某种权重算法计算平均成绩并保存到score.avg_score中*/ +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +struct score[] sort_score(struct score* scores[]) { +\end_layout + +\begin_layout Plain Layout + + /* 将数组scores排序后返回新的struct score数组*/ +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,calculate_avg_score函数和sort_score函数虽然都和struct score有关系(作为参数或者返回值),但是这种关系是“弱关 +系”,因为calcuate_avg_score、sort_score可以没有定义,可以存在于另外的文件中,可以被定义为另外的名称等等。也就是说,在语法上,str +uct score和这两个函数并没有必然的联系,编译器没有办法帮助程序员检查这两个函数和struct score的映射关系,一切还需要程序员人工的 +\begin_inset Quotes erd +\end_inset + +细心 +\begin_inset Quotes erd +\end_inset + +照料。显然,struct一定程度上解决了描述世界的问题,但是没有解决认识世界和改造世界的问题。 +\end_layout + +\begin_layout Section +类和对象的初步概念 +\begin_inset CommandInset label +LatexCommand label +name "sec:类和对象的初步概念" + +\end_inset + + +\end_layout + +\begin_layout Subsection +类是struct概念的自然延伸 +\end_layout + +\begin_layout Standard +C中的struct实现了对客观事物属性的分组描述,即同一类型的客观事物的属性可以用一个struct来表达。正如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:struct的局限性" + +\end_inset + +所述,struct有其局限性,只能描述客观事物的属性,不能表达对客观事物的进一步认知动作和改造利用的动作,于是在面向对象的程序设计语言中引入“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类 +\end_layout + +\end_inset + +类”的概念弥补struct的这一缺陷。 +\end_layout + +\begin_layout Definition +类是对一类客观事物公共 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + +和 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +动作 +\end_layout + +\end_inset + +的描述。 +\end_layout + +\begin_layout Standard +对比struct我们可以看出,类比struct多了“动作”的描述,也就是说,类即可以描述事物的属性,也可以描述我们可以对(用)这类事物“做什么”,是对客观世界的 +完整的描述。Java使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +class +\end_layout + +\end_inset + +关键字来定义类,一个简单的只包含属性的类和struct非常相似,比如二维坐标中的“点”,一开始可以这样定义(右边作为对照,列出了C中point结构体的定义): +\end_layout + +\begin_layout Standard +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "40line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的Point类定义 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +class Point { +\end_layout + +\begin_layout Plain Layout + + int x; // 点的x坐标 +\end_layout + +\begin_layout Plain Layout + + int y; // 点的y坐标 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "45line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的point结构体定义 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +struct point { +\end_layout + +\begin_layout Plain Layout + + int x; /*点的x坐标*/ +\end_layout + +\begin_layout Plain Layout + + int y; /*点的y坐标*/ +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +但是如果只是使用class替换了struct关键字,显然没有发挥类描述客观事物的最大威力,因此一个更合理的Point类如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Point.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub321/Point.java" +lstparams "caption={Point.java},label={Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,在这个版本的Point类定义中,“点”的属性(x,y)和对点的操作moveTo封装在一起了。 +\end_layout + +\begin_layout Subsection* +定义Java类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:定义Java类" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +为了满足李震梅老师的审美观,修改为star form section +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +完整的定义Java类的语法是: +\end_layout + +\begin_layout Standard +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +[public] class ClassName { ...} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这里有几个要点: +\end_layout + +\begin_layout Itemize +大部分情况下需要将类定义为 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public的,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:类的访问控制" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +类名的常规命名遵循驼式命名法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +驼式命名法 +\end_layout + +\end_inset + +,并且第一个字母是大写的。 +\end_layout + +\begin_layout Itemize +一个Java源代码文件中只能有一个类是public的,且这个public的类名必须和文件名完全一致,包括大小写。 +\end_layout + +\begin_layout Itemize +在Java源代码文件中可以定义多个类,只要保证只有一个public类即可。 +\end_layout + +\begin_layout Subsection +对象的概念 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +画图说明更清晰 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "30line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/point-monitor.eps + lyxscale 20 + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +类和实例的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:类和实例的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +类是对一类事物的抽象描述,比如Point类是对二维坐标“点”的抽象描述,它表达了屏幕上的一个点所具有的公共属性:x坐标和y坐标,以及我们可以对“点”的操作,比如 +moveTo操作。但是,Point类并没有和屏幕上的实体点绑在一起,屏幕上的每一个实体点,可以看作Point类的一个具体 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例 +\end_layout + +\end_inset + +实例 +\end_layout + +\end_inset + +,都具有Point类给出的一些属性,在这里就是屏幕上的每一个实体点都有相应的x、y坐标。我们把实体点叫做类Point的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +实例(instance) +\end_layout + +\end_inset + +,或者叫做类Point的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +对象 +\end_layout + +\end_inset + +对象 +\end_layout + +\end_inset + +。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象就是实例,实例就是对象 +\end_layout + +\end_inset + +。可以看出,一个类可以创建若干实例,所有实例(对象)都具有类中定义的属性,只是属性的值各不相同而已,一般称作对象的状态不同。比如,点(1,2),(3,5),(1 +0,50)都是Point的实例。 +\end_layout + +\begin_layout Standard +在这里有必要进一步澄清一下常见的几种说法: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +类(class) +\end_layout + +\end_inset + +就是类型的意思,定义了一个类,就是定义了一个新的数据类型,表达某种事物的公共属性和方法,我们可以根据类创建多个实例(对象)。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象(object)即类的实例 +\end_layout + +\end_inset + +。如果把类看作数据类型,则对象可以看作变量。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象的属性 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + +(property)即为类的“成员分量” +\end_layout + +\end_inset + +(借用struct的叫法),即类中定义的变量。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +对象的方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + +(method)即为类中定义的函数 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +函数 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + 。由于这些函数往往是操作类的属性的某种方法,因此大家习惯上称为对象的方法。 +\end_layout + +\begin_layout Standard +在java中,通过 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + +new操作符创建类的实例(对象),比如new Point()创建了一个“点”的实例(对象)。和C语言中访问struct的成员变量类似,访问Java对象的属性和方 +法是通过 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +. +\end_layout + +\end_inset + +运算符实现的 +\begin_inset Foot +status open + +\begin_layout Plain Layout +和C语言不同的是,由于Java中没有提供指针,在Java中不存在->运算符。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub321/Draw.java" +lstparams "caption={Draw.java},label={sub311-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在程序中,我们通过new操作符创建了2个Point类的对象one和two,并设置了两个对象的状态(即x、y坐标),然后打印出两个对象的状态。 +\end_layout + +\begin_layout Example +根据已有的Point类,编写一个Rectangle和Circle类,并能够计算Rectangle和Circle的面积 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub322 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +问题分析 +\end_layout + +\begin_layout Standard +矩形(Rectangle)是由一个点和长、宽决定的,圆形(Circle)是由一个点和半径决定的,因此我们可以在Point类的基础上定义Rectangle和Cir +cle类。 +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Rectangle.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Circle.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Rectangle.java" +lstparams "caption={Rectangle.java},label={sub322-Rectangle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Circle.java" +lstparams "caption={Circle.java},label={sub322-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +主类Draw.java的设计参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Draw.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub322/Draw.java" +lstparams "float,caption={Draw.java},label={sub322-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +显示结果 +\end_layout + +\begin_layout Standard +执行文件Draw.java的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1's area=100 +\end_layout + +\begin_layout Plain Layout +circle1's area=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序说明 +\end_layout + +\begin_layout Standard +注意到我们在Rectangle中使用Point类定义一个startPoint对象的同时 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +初始化 +\end_layout + +\end_inset + +初始化了这个对象,即通过new Point()创建了一个空的Point对象。这是必要的,因为我们在Draw.java中创建一个Rectangle对象rect1后, +通过rect1.startPoint.x设置startPoint的x坐标。如果不在Rectangle中创建空的Point对象,则rect1.startPoint.x操作 +会报告著名的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +NPE +\end_layout + +\end_inset + +NPE +\end_layout + +\end_inset + +(NullPointException:空指针)异常: +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Exception in thread "main" java.lang.NullPointerException +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.oopbasic.sub322.Draw.main(Draw.java:7) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +对象的创建过程 +\begin_inset CommandInset label +LatexCommand label +name "sec:对象的创建过程" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +new +\end_layout + +\end_inset + +new Point()创建一个Point类的对象时,Java是如何创建这个对象的呢? +\begin_inset Note Note +status open + +\begin_layout Plain Layout +画图表示类的创建过程 +\end_layout + +\end_inset + +实际上,Java创建对象的过程如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:对象的构造过程" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +实际上,为了理解方便,这是一个简化了的对象创建过程,对象的完整创建过程可参考JVM Specification +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-se8-specification" +literal "true" + +\end_inset + +。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/object-creation.eps + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +对象的构造过程 +\begin_inset CommandInset label +LatexCommand label +name "fig:对象的构造过程" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在这里我们暂且不讨论“递归的构造父类对象”这个话题(留待 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:再说构造方法" + +\end_inset + +再讨论),其他的几个步骤是指: +\end_layout + +\begin_layout Itemize +步骤1:分配空间。我们已经看到,相对于简单的数据类型,Java的对象往往是个复杂的数据结构,其中除了一些基本的数据类型的属性之外,还可能包含其他的对象(比如Re +ctangle中包含了Point)以及方法代码,因此创建Java对象的第一步是为这些数据和方法分配内存空间。分配内存空间后,类中的基本数据类型属性会被自动设置为 +默认值:数字类型的属性默认值为0(或者0.0),boolean类型的默认为false,字符类型的默认为''(这里是两个单引号,和C语言中的用法一样,表示空字符) +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这些需要验证或者查证: 如何通过示例验证? +\end_layout + +\end_inset + +。如果使用类作为属性,则默认为null。 +\end_layout + +\begin_layout Itemize +步骤3:初始化本类属性。如果本类的属性在定义时由初始化表达式,则使用该表达式初始化属性。比如 +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +int x = 10; +\end_layout + +\begin_layout Plain Layout + +Point startPoint = new Point(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +步骤4:调用本类的构造方法,这是本节的重点。 +\end_layout + +\begin_layout Subsubsection* +构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + +构造方法的用途,我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:对象的构造过程" + +\end_inset + +中已经看到了,那么如何定义构造方法呢?简单的说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +构造方法就是和类同名并且没有返回值的方法 +\end_layout + +\end_inset + +。这里有两个关键点:一是构造方法的方法名必须和类名完全相同,包括大小写。二是构造方法不需要返回值,也不允许有返回值。 +\end_layout + +\begin_layout Subsubsection* +默认的构造方法 +\end_layout + +\begin_layout Standard +可是,我们在以前的类中,并没有看到构造方法,是怎么回事呢?原来,如果一个类没有定义任何的构造方法,java编译器会自动增加(插入)一个“默认的构造方法”,即不带 +任何参数的空的构造方法。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要验证在类继承环境下,默认构造方法是否自动调用父类的构造方法? +\end_layout + +\end_inset + +也就是说,我们new Point()创建一个对象的时候,最后一步会调用Point类的无参构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +无参构造方法 +\end_layout + +\end_inset + +。如果Point类没有提供这样的构造方法,则调用Point类的默认构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认构造方法 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +当然,我们也可以“主动”为Point编写一个无参的构造方法,这样new Point()的最后一步就是调用我们自己编写的构造方法而非默认构造方法了。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +重新起一个包,实现所有的无参构造方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +无参构造方法 +\end_layout + +\end_inset + +无参构造方法和 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认构造方法 +\end_layout + +\end_inset + +默认构造方法的区别:默认构造方法一定是无参的构造方法,但是无参的构造方法不一定是默认构造方法。当一个类没有显式的定义任何构造方法时,编译器自动添加默认构造方法; +当一个类有任何的构造方法时,编译器都不会自动添加默认构造方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写程序,覆盖Point类的默认构造方法,为Point对象提供默认的(x,y)坐标为(10,10) +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub332 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +这里只列出Point.java和Draw.java两个文件,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub332-Point.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Draw.java" + +\end_inset + +,Circle.java和Rectangle.java没有变化。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub332/Point.java" +lstparams "float,caption={Point.java},label={sub332-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub332/Draw.java" +lstparams "float,caption={Draw.java},label={sub331-Draw.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java文件结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(10,10),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(10,10),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序分析 +\end_layout + +\begin_layout Standard +在本例中,Draw.java创建Circle对象circle1的时候,并没有设置原点的坐标,但是从运行结果可以看出,原点坐标的值为(10,10),这就是Point +类的无参构造方法的作用:当我们使用new Point()创建对象时,最后会调用Point的无参构造方法初始化对象的状态。 +\end_layout + +\begin_layout Subsubsection* +带参数的构造方法 +\end_layout + +\begin_layout Standard +很多时候,我们希望在创建对象的时候就设置对象的初始状态,比如是否可以通过new Point(10,20)这样的方式,创建Point对象的同时,设置Point对象 +的x坐标为10,y坐标为20呢?这可以通过带参数的构造方法来实现。也就是说,当我们通过new Point(10,20)这样的形式创建Point对象时,最后会调用 +Point类中带两个参数的构造方法。 +\end_layout + +\begin_layout Example +编写程序,使用带参数的构造方法创建Point对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写程序,使用带参数的构造方法创建Point对象" + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub333 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +主类Draw.java没有变化,这里就不列出了。其他类参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Point.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Circle.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub333-Rectangle.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Point.java" +lstparams "float,caption={Point.java},label={sub333-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Circle.java" +lstparams "float,caption={Circle.java},label={sub333-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub333/Rectangle.java" +lstparams "float,caption={Rectangle.java},label={sub333-Rectangle.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(20,20),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(0,0),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +当一个类中定义了任何的构造方法后,编译器就不会自动创建默认的构造方法了。比如Point类中,如果定义了Point的有参构造方法而没有定义无参构造方法,此时Poi +nt类没有默认构造方法,自然new Point()方式创建Point对象时会因为找不到无参的构造方法而报错。如何解决这个问题呢?请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:多个构造方法" + +\end_inset + +。 +\end_layout + +\begin_layout Subsubsection* +多个构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:多个构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java允许在类中定义多个构造方法,以便根据不同的情况初始化对象为不同状态。 +\end_layout + +\begin_layout Example +编写程序,给Point类定义两个构造方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/sub334 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +设计说明 +\end_layout + +\begin_layout Standard +主类Draw.java和Rectangle.java和例 +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:编写程序,使用带参数的构造方法创建Point对象" + +\end_inset + +相同,这里仅列出Point.java和Circle.java,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub334-Point.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub334-Circle.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub334/Point.java" +lstparams "float,caption={Point.java},label={sub334-Point.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/sub334/Circle.java" +lstparams "float,caption={Circle.java},label={sub334-Circle.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Draw.java结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +rect1的左上角坐标:(10,10),width=10,height=10,面积=100 +\end_layout + +\begin_layout Plain Layout +circle1的原点坐标:(0,0),radius=10.0面积=314.159 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +程序说明 +\end_layout + +\begin_layout Standard +Point类现在有两个构造方法,我们在Circle.java调用了Point的有参构造方法,在Rectangle.java中调用了Point的无参构造方法。 +\end_layout + +\begin_layout Subsection +再说对象的初始化 +\end_layout + +\begin_layout Standard +通过以上分析我们可以看出,构造方法的目的是为了 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +创建对象时设置对象的初始状态 +\end_layout + +\end_inset + +,因此一个类需要多少个构造方法并没有一定之规,需要根据实际情况来确定。通常,在一开始设计一个类的时候,建议覆盖默认的构造方法即无参构造方法,提供一个默认的对象状 +态。随着开发的深入,可以根据实际情况添加更多的构造方法。 +\end_layout + +\begin_layout Standard +除了通过构造方法设置对象的初始状态外,也可以通过以下的方式进行对象的初始化操作: +\end_layout + +\begin_layout Itemize +在创建对象后,直接访问对象的属性并设置希望的值。 +\end_layout + +\begin_layout Itemize +在创建对象后通过setter方法设置对象的状态。所谓setter方法,往往是一系列setX,setY方法,其中的X、Y为对象的属性。 +\end_layout + +\begin_layout Itemize +在JavaEE环境下,可以提供一个初始化方法,比如void init(),然后通过注解@PostConstruct的方式实现对象的初始化。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +定义有参构造方法时,要注意参数的个数不要太多,一般不要超过10个。太多的参数往往给使用者带来记忆和匹配的负担。如果需要大量的对象初始化操作,建议编写专门的方法初 +始化对象(比如init()方法就是一个很好的方法名字),然后在创建对象后调用这个init方法即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +Java的构造方法有哪些特点? +\begin_inset CommandInset label +LatexCommand label +name "exer:Java的构造方法有哪些特点?" + +\end_inset + + +\end_layout + +\begin_layout Section +类的组织:包 +\begin_inset CommandInset label +LatexCommand label +name "sec:类的组织:包" + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的概念 +\end_layout + +\begin_layout Standard +在进行文件管理时,我们使用文件夹来组织不同类型的文件。在Java中,我们使用“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +包 +\end_layout + +\end_inset + +包”( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +package +\end_layout + +\end_inset + +package)来管理不同类型的Java源文件,其实“包”就是文件夹,我们说包cn.edu.sdut.softlab.oopbasic.sub332中的Point.java +时,其实是说,位于目录cn/edu/sdut/softlab/oopbasic/sub332目录下的Point.java。也就是说,把目录的分隔符换成“.”,目录名 +就变成了包名。 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:本章示例代码的目录层级结构" + +\end_inset + +是本章的主要示例代码的目录层级结构: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/package-tree.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +本章示例代码的目录层级结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:本章示例代码的目录层级结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的导入和声明 +\end_layout + +\begin_layout Standard +有了包的概念后,我们就可以使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +import +\end_layout + +\end_inset + +导入其他包中的Java源代码,这很像C语言中的include关键字的作用。比如下面的代码片段,我们导入了java.util包中的Date类(时间处理类): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +import java.util.Date; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +public class DateTest { +\end_layout + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + Date today = new Date(); +\end_layout + +\begin_layout Plain Layout + + System.out.println("today is " + today); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +关于包的导入(import),需要注意以下几个方面: +\end_layout + +\begin_layout Itemize +如果一个Java源代码在一个包中,则这个Java源代码应该首先使用 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +package +\end_layout + +\end_inset + +声明自己所在的包,正如本章所有的例子一样,在代码的开头几乎都一句package语句声明了包。建议回顾一下本章学过的例子,重点放在包的命名上面,了解如何在Java +源代码文件中声明包。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +只有声明(package)了包的Java源代码,才能够被导入进来 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +如果Java源代码中没有package声明语句,则编译器认为Java文件在 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +默认包 +\end_layout + +\end_inset + +中,即src根目录下,这通常不是一个好的习惯。 +\end_layout + +\begin_layout Itemize +显然,import应该放在class的定义前面。 +\end_layout + +\begin_layout Itemize +在同一个包下的Java源代码不需要导入(import)。 +\end_layout + +\begin_layout Itemize +Java的核心API,即java.lang包的类,Java编译器会自动导入,也不需要我们手工导入。 +\end_layout + +\begin_layout Itemize +可以通过*实现批量导入,比如: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +import com.company.lab.* +\end_layout + +\end_inset + +表示导入 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +com.company.lab +\end_layout + +\end_inset + +包中的所有类。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea IDE环境下,在使用到一个其他包的Java类时,有两种方式自动导入相应的包: +\end_layout + +\begin_layout Itemize +使用菜单:code->optimize imports,让Idea自动导入需要的包。 +\end_layout + +\begin_layout Itemize +鼠标移动到未识别的类上面,Idea会给出导入的提示,选择合适的包导入即可。注意,如果Idea给出了多个选择(意味着在多个包中都有这个类),此时要认真甄别要导入的 +包。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +根据Google编码规范(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:不使用通配符import" + +\end_inset + +),尽量避免import package.*这样的用法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +包的命名原则 +\end_layout + +\begin_layout Standard +我们使用包的目的是把Java文件按照逻辑组织起来 +\begin_inset Foot +status open + +\begin_layout Plain Layout +形式上看是这样,但是包的真正意义和Java虚拟机的类加载机制有关,这里不深入探讨,有兴趣的读者可以参考ClassLoader的相关资料。 +\end_layout + +\end_inset + +,同时也起到了“隔离”的作用,即不同包中的类即使名字相同也是可以的。或者说,以后我们提到一个类,应该连同它的包一起来考虑,即某某包的某某类。因此,当我们给包起名 +字的时候就要谨慎考虑,最好能够做到你起的包名是全球唯一的,这样你的包里面的类也就是全球唯一的了。而全球唯一的资源,很容易就想到了“域名”,于是通用的和建议的包命 +名规则 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见JLS:http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.1 +\end_layout + +\end_inset + +是按照域名的反向 +\begin_inset Foot +status open + +\begin_layout Plain Layout +为什么要将通常的域名反向排列形成包名呢?我们阅读的顺序是从左向右的,当谈到一个组织结构时,习惯上也是按照从左向右降序排列的,比如山东省淄博市张店区。因此,在命名 +包时把域名的顺序反向过来,更符合人们的阅读和理解习惯。当然,这不是Java的语法规定,只是“约定俗成”,入乡随俗也体现了一个程序员的素质。 +\end_layout + +\end_inset + +来命名,比如你的域名是lab.company.com,则包的命名可以是: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +com.company.lab +\end_layout + +\end_inset + +。下面是一些典型的包命名示范: +\end_layout + +\begin_layout Standard +\begin_inset Box Boxed +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +com.google.android +\end_layout + +\begin_layout Plain Layout +cn.edu.sdut.java.lesson +\end_layout + +\begin_layout Plain Layout +org.apache.log4j +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +根据Google的编码规范(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:包名" + +\end_inset + +),包的名字应该都使用小写字母,并避免使用下划线。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +类的继承 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +消除冗余,代码复用 +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "sec:类的继承" + +\end_inset + + +\end_layout + +\begin_layout Standard +在编程实践中,我们应该力求消除冗余,即不存在两片相同的代码。比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void method1() { +\end_layout + +\begin_layout Plain Layout + + doSomething(); +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void method2() { +\end_layout + +\begin_layout Plain Layout + + doSomeOtherThing(); +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们应该这样消除冗余: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +void method1() { +\end_layout + +\begin_layout Plain Layout + + doSomething(); +\end_layout + +\begin_layout Plain Layout + + fun(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void method2() { +\end_layout + +\begin_layout Plain Layout + + doSomeOtherThing(); +\end_layout + +\begin_layout Plain Layout + + fun(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void fun() { +\end_layout + +\begin_layout Plain Layout + + foo(); +\end_layout + +\begin_layout Plain Layout + + bar(); +\end_layout + +\begin_layout Plain Layout + + foobar(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +虽然后一种方式多定义了一个方法fun(),但是好处显而易见:软件的逻辑性(可读性)和可维护性提高了。如果需要对fun()的流程做任何修改,我们现在只需要在fun +()方法中修改即可。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +\begin_inset Flex Tip +status collapsed + +\begin_layout Plain Layout +主流的IDE现在都支持对代码进行类似的“重构”(refactor)。比如在Idea中,可以选择一段“重复”的代码,然后通过菜单Refactor->Introdu +ce->Method...让IDE自动寻找这段重复的代码,一次性抽象出一个方法,这样就消除了代码的冗余。 +\end_layout + +\end_inset + +增加Idea使用refactor的方法 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +上面代码消除冗余是建立在方法层面上的,在类的层面上应该如何消除冗余呢?比如有如下的两个类:BankCard.java和CreditBandCard.java。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step1/BankCard.java" +lstparams "float,caption={BankCard.java},label={step1-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step1/CreditCard.java" +lstparams "float,caption={未使用继承的CreditCard.java},label={step1-CreditBankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +很明显,CreditBankCard具有BankCard的大部分属性和方法,从尽力消除冗余的角度看,这样的代码太“丑陋”了!java提供了“继承”机制解决了这个 +问题,先看一下代码的实现:BankCard.java的代码没有变化,这里只列出CreditCard.java的代码,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "step2-CreditBankCard.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step2/CreditCard.java" +lstparams "float,caption={使用了继承的CreditCard.java},label={step2-CreditBankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,CreditBankCard扩展(extends)了BankCard类:CreditCard自动具有BankCard的属性和方法,只需要在Credit +Card中定义专属的属性和方法即可。 +\end_layout + +\begin_layout Standard +这就是Java等面向对象程序设计语言的“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +继承 +\end_layout + +\end_inset + +继承”机制。简单的说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +继承机制消除了代码的冗余,提高了代码的复用水平 +\end_layout + +\end_inset + +。继承是面向对象程序设计的重要手段,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:单继承" + +\end_inset + +进一步分析继承在编程实践中的应用和注意事项。 +\end_layout + +\begin_layout Subsection +单继承 +\begin_inset CommandInset label +LatexCommand label +name "subsec:单继承" + +\end_inset + + +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:BankCard的类层次结构" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +这样表示类层次关系的图叫做 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +UML +\end_layout + +\end_inset + +UML的类图。UML(Universal Model Language,统一建模语言)是IT行业中通用的描述需求和系统设计的建模工具,其中常用的图形有:类图、用 +例图、顺序图、活动图等,本书中只涉及到类图,用来表达类的继承和接口的实现。类图的意义应该是一目了然的,箭头表示类继承的方向,比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BankCard的类层次结构" + +\end_inset + +中,CreditCard指向了BankCard即表示CreditCard是从BankCard继承下来的。绘制UML图的工具有很多,本书采用的是umbrello和 +dia,参见本书前言部分的说明。 +\end_layout + +\end_inset + +的继承关系中,我们把BankCard类称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +父类 +\end_layout + +\end_inset + +父类 +\end_layout + +\end_inset + +,或者超类,把CreditCard、DebitCard类称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +子类 +\end_layout + +\end_inset + +子类 +\end_layout + +\end_inset + +。CreditCard和DebitCard继承了BankCard的属性和方法,并各自扩展了相应的属性和方法(DebitCard只扩展了属性,并没有扩展方法)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/bankcard-hirarchy.eps + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BankCard的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:BankCard的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Java只支持单继承,即一个类只允许有一个父类。绕过这个限制的办法是使用接口,请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的用法是正确的: +\end_layout + +\begin_layout LyX-Code +public class CreditCard extends BandCard{...} +\end_layout + +\begin_layout LyX-Code +public class DebitCard extends BandCard{...} +\end_layout + +\begin_layout Standard +下面的用法是错误的: +\end_layout + +\begin_layout LyX-Code +public class CreditCard extend BandCard{...} +\end_layout + +\begin_layout LyX-Code +public class CreditCard extends BandCard, Card{...} +\end_layout + +\begin_layout Standard +在Java中, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +类是所有类的基类(父类),即在Java的类树结构中, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +是“根”。因此,Java中的所有类都继承了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类中定义的属性和方法,具体请参见JDK API中关于 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的介绍。特别的, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的以下方法在(初级)编程实践中经常用到: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法 +\end_layout + +\end_inset + + 输出当前对象的字符串表达,一般用于调式输出。实际上,当直接输出一个对象时,即调用了该对象的 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法,也就是说, +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +System.out.println(aObject +\end_layout + +\end_inset + +)和 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +System.out.println(aObject.toString()) +\end_layout + +\end_inset + +的结果是一样的。通常情况下,子类需要覆盖 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Object +\end_layout + +\end_inset + +类的 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +toString +\end_layout + +\end_inset + +方法,以便更好的描述类的内部结构。 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +equals +\end_layout + +\end_inset + +方法 +\end_layout + +\end_inset + + 比较两个对象是否相等。不像简单数据类型的比较,对象的比较复杂,这里不展开阐述,详情可参见以下资料:https://dzone.com/articles/obje +ct-identity-and-equality-in-java,或者:https://stackoverflow.com/questions/13387742/ +compare-two-objects-with-equals-and-operator。 +\end_layout + +\begin_layout Subsection +再说构造方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:再说构造方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:对象的创建过程" + +\end_inset + +中,我们已经看到创建对象的第二步是递归的构造父类对象。我们仍然以银行卡为例来看一下所谓的“递归的构造父类对象”的含义。为了清楚期间,我们增加了一个类的层级结构, +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:银行卡的类层级结构" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +银行卡的程序示例代码较多,作为一个例子处理如何? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/bankcard-full-hirarchy.eps + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +银行卡的类层级结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:银行卡的类层级结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "step3-Card.java" + +\end_inset + +可以看出,Card类只定义了所有卡都有的基本属性:卡号。另外,显式定义了无参的构造方法,如果被调用的话,只是打印出一条提示信息。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/Card.java" +lstparams "float,caption={增加无参构造方法的Card.java},label={step3-Card.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +BankCard、CreditCard、DebitCard的设计思路类似,都是增加了一个无参的构造方法,打印出一条提示信息,如果被调用到的话。在Client类中 +,我们分别创建了CreditCard和DebitCard对象,注意观察构造方法的调用顺序。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/BankCard.java" +lstparams "float,caption={带有无参构造方法的BankCard.java},label={step3-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/CreditCard.java" +lstparams "float,caption={带有无参构造方法的CreditCard.java},label={step3-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/DebitCard.java" +lstparams "float,caption={带有无参构造方法的DebitCard.java},label={step3-DebitCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step3/Client.java" +lstparams "float,caption={Client.java},label={step3-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +执行Client.java的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called +\end_layout + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,所谓的“递归的构造父类对象”是指: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +当初始化子类对象时,从上往下依次调用父类的同名构造方法 +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:构造方法的递归调用" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/object/constructor-chain.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +构造方法的递归调用 +\begin_inset CommandInset label +LatexCommand label +name "fig:构造方法的递归调用" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +在递归构造父类对象的“链条”中,如果其中一环缺失会怎样?请读者自行练习找到此问题的答案:将导致语法错误。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里应该有习题 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +方法的覆盖和重载 +\end_layout + +\begin_layout Standard +方法的覆盖(override)和重载(overload)是面向对象编程中两个重要且容易混淆的概念,因此这里单独拿出来讨论一下。 +\end_layout + +\begin_layout Subsubsection* +方法重载 +\end_layout + +\begin_layout Standard +Java中的方法重载(overload)是指在一个类中允许存在 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +多个名字相同但是参数不同的方法 +\end_layout + +\end_inset + +。这里所谓的“参数不同”有如下的几种情形: +\end_layout + +\begin_layout Itemize +参数个数不同 +\end_layout + +\begin_layout Itemize +参数类型不同 +\end_layout + +\begin_layout Itemize +参数个数和类型都不相同 +\end_layout + +\begin_layout Standard +如果我们把方法的参数看做一个控制系统的“输入条件”,那么方法的重载意味着同一个动作在不同的输入条件下的表现如何? +\end_layout + +\begin_layout Example +使用方法重载设计一个计算器类。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Caculator.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/Caculator.java" +lstparams "caption={Caculator.java},label={Caculator.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java中典型的方法重载场合: +\end_layout + +\begin_layout Itemize +构造方法的重载:我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:多个构造方法" + +\end_inset + +中看到,可以编写类的多个构造方法,实际上就是方法的重载的具体体现。构造方法的名字都是相同的(和类名一致),不同的构造方法(参数不同)表示在不同的条件下如何创建对 +象。 +\end_layout + +\begin_layout Itemize +运算符重载:Java的“+”运算符是被重载了的。我们前面已经看到,“+”运算符在不同的表达式中意义不同,用于算数表达式时表示数学运算的加法,用于两个字符串时表示 +首尾相接连接两个字符串。 +\end_layout + +\begin_layout Itemize +String.valueOf方法可以接收的参数有boolean, char, char[], double, float, int, long等 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:字符串处理" + +\end_inset + +详细讨论String类的用法,String.value方法的形式可参考JDK API,这里暂不详细讨论。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +需要注意的是,只是参数的顺序不同以及参数的名字不同不能构成方法的重载,原因很简单,我们调用方法的时候进行形参和实参的匹配,顺序和名字并不能唯一决定形参和实参的组 +合。比如方法method(String a, String b) 和method (String c, String d)不能构成方法的重载,在Java编译器看 +来,这是两个相同的方法,因而会报告编译错误。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +TODO:需要实例验证 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "30line%" +status collapsed + +\begin_layout Plain Layout +\noindent +\align center +\begin_inset Graphics + filename ../imgs/object/socket-plug.eps + lyxscale 25 + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +生活中的各种插座和多用插座示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:生活中的各种插座和多用插座" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +举个生活中的例子可能更容易理解方法重载的概念和用途,比如我们知道插座有各种规格以便适用不同的电器,有的电器使用两孔插头,有的电器使用三孔插头,插头还可能分为圆形 +插头和扁平插头等等。正如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:生活中的各种插座和多用插座" + +\end_inset + +所示,生活中我们经常安装一种所谓的“多用插座”,即一个插座可以使用多种不同的插头,这样就免去安装很多个不同的插座的麻烦,也不需要大家记住插头和插座的对应关系,直 +接拿来用就可以了。这种“多用插座”的设计移植到程序设计上,就叫做“方法重载”(overload),即方法的名字相同(多用插座),但是参数各不相同(适用不同的插头 +),在具体使用时,程序员只需要记住少量的方法的名字,参数类型和个数由IDE自动提示即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +方法覆盖 +\end_layout + +\begin_layout Standard +方法覆盖(override)是指子类中重新实现了父类中的同名方法,即子类方法覆盖了父类方法。这样,当调用子类对象的这个方法时,就是使用子类重新实现的方法了。否则 +,就会调用父类中的方法。因此,方法覆盖的主要用意是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在子类中提供父类方法的加强版,或者使用不同的逻辑重新实现 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +方法覆盖示例。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Dog.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/Dog.java" +lstparams "caption={Dog.java},label={Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +方法覆盖是Java多态的基础,具体请参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:多态" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意到从JDK 1.5开始,Java允许子类覆盖父类方法时,返回值可以是父类方法返回值的子类。比如: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +class A{ +\end_layout + +\begin_layout Plain Layout + + Father get(){ return null;} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +public class B extends A{ +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + Son get(){ return null;} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +class Father{} +\end_layout + +\begin_layout Plain Layout + +class Son extends Father{} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +在类B中,方法get返回值类型是Son,而其父类A的get方法的返回值类型是Father,由于Son是Father的子类,因此类B的方法get也属于方法的覆盖( +override)。 +\end_layout + +\begin_layout Plain Layout +Java是如何做到这一点的呢?我们反编译B.class会发现: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// Decompiled by Jad v1.5.8e. + Copyright 2001 Pavel Kouznetsov. + +\end_layout + +\begin_layout Plain Layout + +// Jad home page: http://www.geocities.com/kpdus/jad.html +\end_layout + +\begin_layout Plain Layout + +// Decompiler options: packimports(3) +\end_layout + +\begin_layout Plain Layout + +// Source File Name: B.java +\end_layout + +\begin_layout Plain Layout + +public class B extends A{ +\end_layout + +\begin_layout Plain Layout + + public B() { +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + Son get(){ +\end_layout + +\begin_layout Plain Layout + + return null; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + volatile Father get(){ // 桥接方法 +\end_layout + +\begin_layout Plain Layout + + return get(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +可以看出,编译器自动增加了一个所谓的“桥接方法”实现了标准的方法覆盖。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +在覆盖父类方法时,可以通过super关键字引用父类的同名方法。 +\end_layout + +\begin_layout Plain Layout +构造方法中的覆盖问题 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +访问控制 +\begin_inset CommandInset label +LatexCommand label +name "sec:访问控制" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们说到面向对象程序设计的封装时,不仅仅是指把对象的属性和方法“捏合”在了一起,也指从使用者的角度看,访问对象是受到限制的,即对象内部的状态和方法并不总是需要 +暴露给使用者的。推而广之,甚至对类的访问也可以加以限制。 +\end_layout + +\begin_layout Subsection +属性和方法的访问控制 +\end_layout + +\begin_layout Standard +为什么需要对属性和方法进行访问控制呢?从面向对象的设计角度看,一个对象完成了特定的功能,对象的使用者其实并不关心这个特定功能是如何实现的,只要这个功能能够正常工 +作就可以了,这就是所谓的“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +松耦合 +\end_layout + +\end_inset + +松耦合”(loose coupling principle)原则。考虑 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:松耦合原则" + +\end_inset + +所示的情形。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/loose-coupling-model.png + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +松耦合原则示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:松耦合原则" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +当Client使用Bean组件(对象)提供的功能时,并不需要知晓Bean组件内部是如何实现的,也就是时说,Bean组件在后续进行算法完善、性能改进或者界面优化...时 +,Client的代码不需要做任何改动。Bean组件只需要对外(Client)暴露必须的调用接口(如何暴露,我们会在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + +讨论),其内部实现及只在内部实现中用到的一些对象状态,应该想办法隐藏起来。换句话说,Bean组件如果对外暴露的调用接口越多,则后续改进时要考虑的因素就越多,困难 +也越大。 +\end_layout + +\begin_layout Standard +Java提供了完善的访问控制策略来保护属性和方法,如表所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +也参见:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html +\end_layout + +\end_inset + +(形成了一个三角形排列)。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的访问控制修饰符 +\begin_inset CommandInset label +LatexCommand label +name "tab:Java的访问控制修饰符" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +修饰词 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Class(类) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Package(包) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Subclass(子类) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +World(其他) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +protected +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +(default) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +private +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +√ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +X +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +default修饰符 +\begin_inset CommandInset label +LatexCommand label +name "subsec:default修饰符" + +\end_inset + + +\end_layout + +\begin_layout Standard +在之前我们的代码中,属性和方法前面没有使用任何修饰符,即默认修饰符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +默认修饰符 +\end_layout + +\end_inset + +。对照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Java的访问控制修饰符" + +\end_inset + +可以看出,default修饰的(即不使用任何修饰符)的属性和方法对同一个包内的其他类是可见的:即可以读,也可以修改。因此,default修饰符也被称为“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +包范围 +\end_layout + +\end_inset + +”的修饰符,它以包为限界定了访问权限,这是一种很自然的权限划分,因此被Java确定为“default”(默认)情形。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +default的意思是默认修饰符,即没有在属性和方法前面指定修饰符的情形,并非要显式的指定一个“default”的修饰符。实际上,java中不存在一个名字叫做“ +default”的修饰符。因此,下文中的default均指: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在属性、方法、类前面不使用任何访问控制修饰符 +\end_layout + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ac-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ac-Client.java" + +\end_inset + +中,BankCard类中的username和password属性以及withdraw方法都是default的,因此同一个包中的Client类可以随意修改密码,随 +意取钱: +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +这太不安全了! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/BankCard.java" +lstparams "float,caption={演示default修饰符的BankCard.java},label={ac-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/Client.java" +lstparams "float,caption={Client.java},label={ac-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +执行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +钱被取走啦! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +default修饰符意味着同一个包内的其他类都可以随意操纵你的属性和方法,这是一个危险的设置!设想一下,黑客把一个自己写的破坏性Java文件放到你的包里面,然后 +修改你的银行卡密码,盗取你的钱财...因此,default修饰符给软件的安全留了一个后门,并不是一个好的“默认值”! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +private修饰符 +\end_layout + +\begin_layout Standard +default给了同一个包下的其他类“篡改”本类的机会, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +private +\end_layout + +\end_inset + +private修饰符则完全杜绝了这个问题:从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Java的访问控制修饰符" + +\end_inset + +可以看出,private修饰过的属性和方法只有本类可以访问,即只有本类可以读取和修改,对同一个包下的其他类、子类以及所有其他的类都不可见。正如private的名 +字所宣示的, 这是一个完全隐私的保护性设置,特别适合于本节开头所述的“松耦合原则”中组件(对象)内部属性、方法的表达。实际上, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +在绝大多数情况下,我们应该将类的属性和方法设置为private +\end_layout + +\end_inset + +,然后根据需要或者设计要求逐步放开限制,以达到对组件(对象)最大程度的封装和保护。 +\end_layout + +\begin_layout Standard +有时我们希望对外一定程度上暴露私有的属性,即不直接暴露私有(private)属性,而是通过一个公有(public)的方法间接的访问私有属性。这样如果需要的话,我 +们可以在这个方法中对属性修改做合法性检查,避免任意的篡改私有属性。这些能够读取和设置私有属性的方法往往以get和set开头,一般称作 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +getter/setter方法 +\end_layout + +\end_inset + +,比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Person { +\end_layout + +\begin_layout Plain Layout + + private String username; +\end_layout + +\begin_layout Plain Layout + + private String password; +\end_layout + +\begin_layout Plain Layout + + private String email; +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public void setUsername(String newUsername) { +\end_layout + +\begin_layout Plain Layout + + username = newUsername; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public String getUsername() { +\end_layout + +\begin_layout Plain Layout + + return username; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + // setPassword/getPassword等方法和getUsername/setUsername类似 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +大多数IDE开发环境可以帮助我们自动生成这些getter/setter方法:在类中右键选择“Insert Code... +\begin_inset Quotes erd +\end_inset + +,然后选择“Getter and Setter...”,选中希望自动生成getter/setter方法的私有属性,可以多选,然后点击“Generate”按钮即可。自动 +产生的getter/setter代码中使用了this关键字,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:对象的存储模型" + +\end_inset + +讨论它。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +改造 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:default修饰符" + +\end_inset + +中的例子,使得BankCard类中的username和password都是private的。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acPrivate-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acPrivate-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprivate/BankCard.java" +lstparams "float,caption={演示private修饰符的BankCard.java},label={acPrivate-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprivate/Client.java" +lstparams "float,caption={Client.java},label={acPrivate-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +可以看出,我们在Client中无法直接修改密码了,否则会报告语法错误。 +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +BankCard类的两个属性使用private修饰符后,Client类无法直接访问这两个属性了。可以通过提供getter/setter方法,方便Client访问 +BankCard的这两个属性。请读者试着在BankCard中加上getter/setter方法,并在Client中调用getter/setter修改用户名和密码 +。 +\end_layout + +\begin_layout Problem +构造方法是私有的会怎样?为什么? +\end_layout + +\begin_layout Problem +我们在Client类中使用new BankCard()创建对象时会试图调用BankCard的构造方法,但是此时BankCard的构造方法是私有的,意味着对同一个 +包下面的Client不可见!因此,如果使用private修饰构造方法,意味着你不希望别人直接通过new操作符创建对象。那么这个类还有啥用处呢?实际上,在这种情况 +下,可以通过提供一个方法来创建对象,比如下面的代码片段: +\end_layout + +\begin_layout Problem +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class BankCard { +\end_layout + +\begin_layout Plain Layout + + .... +\end_layout + +\begin_layout Plain Layout + + private BankCard () {} +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + public static BankCard getInstance() { +\end_layout + +\begin_layout Plain Layout + + new BankCard(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Problem +在本类中new BankCard()当然是没有问题的了,所以通过一个公有的方法getInstance()来创建对象,则Client就可以这样使用: +\end_layout + +\begin_layout Problem +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Client { +\end_layout + +\begin_layout Plain Layout + + .... +\end_layout + +\begin_layout Plain Layout + + BankCard card = BankCard.getInstance(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Problem +此种用法常见于工厂模式 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +、单例模式 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +等。 +\end_layout + +\begin_layout Subsubsection +protected修饰符 +\end_layout + +\begin_layout Standard +private修饰过的属性和方法只有本类可以访问,default修饰过的属性和方法本类和本包其他类可以访问, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +protected +\end_layout + +\end_inset + +protected修饰过的属性和方法则进一步放宽了限制:除了本类、本包之外,子类也可以访问。或者说,我们使用protected修饰属性和方法的唯一目的就是: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +子类可见 +\end_layout + +\end_inset + +,这也是protected这个修饰符的本意:受保护的本意大概就是家族内无本质纷争的意思,所谓“兄弟阋于墙,外御其辱”,可以理解为一家人不见外,不是一家人就对不起 +了,不可见。因此,protected修饰的属性和方法本人可见(这个很自然),同包内的其他类(同胞)可见,子类(对自己的下一代不隐瞒,即使下一代不在同一个包内)可 +见,其他外族(其他包中的类)则不可见。当然, +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:public修饰符" + +\end_inset + +的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public修饰过的属性和方法在子类也是可见的,但是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public往往太宽泛,实际应用的时候应该严格限制。 +\end_layout + +\begin_layout Example +使用protected改造银行卡的例子,观察protected是如何保护属性和方法的 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/acprotected/other +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-BankCard.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-CreditCard.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/BankCard.java" +lstparams "float,caption={演示protected修饰符的BankCard.java},label={acprotected-BankCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/other/CreditCard.java" +lstparams "float,caption={演示protected修饰符的CreditCard.java},label={acprotected-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/acprotected/other/Test.java" +lstparams "float,caption={Test.java},label={acprotected-Test.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client.java得到如下结果: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +钱被取走啦! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在BankCard中,我们将两个属性和两个方法均使用protected修饰,因此其子类CreditCard能够直接访问这两个属性和方法。注意到CreditCar +d和BankCard不在一个包内,这并不影响CreditCard访问父类BankCard中protected修饰过的属性和方法,也就是说,Java首先根据“父子 +”关系检查访问权限,然后再根据包内还是包外检查访问权限。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "acprotected-Test.java" + +\end_inset + +中创建了一个BankCard对象,但是由于Test类和BankCard不在同一包内,也不是BankCard的子类,因此Test中创建的BankCard对象无法直 +接访问protected修饰过的属性和方法。 +\end_layout + +\begin_layout Subsubsection +public修饰符 +\begin_inset CommandInset label +LatexCommand label +name "subsec:public修饰符" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public修饰符当然就是无限制的意思了,在属性和方法的访问控制中,public修饰符应该谨慎使用,只有确定需要公开的情形才使用public修饰属性和方法,否则 +和C语言有啥区别呢?请记住,public意味着公开的承诺,一旦你使用了public修饰属性和方法,就意味着你失去了后续修改这部分代码的机会。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +虽然在属性和方法上要谨慎使用pubic修饰符,但是构造方法往往是public的,这是因为绝大多数情况下,我们编写了一个类是希望任何人都能够创建相应的对象的。试想 +,如果构造方法是protected、default甚至是private的,会怎样?这里列出四种修饰符修饰构造方法的情形: +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +public的构造方法 +\end_layout + +\end_inset + +:任何人都可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +protected的构造方法 +\end_layout + +\end_inset + +:只有本类、子类和同一个包内的类可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +default的构造方法 +\end_layout + +\end_inset + +:只有本类、同一个包内的类可以通过new创建对象 +\end_layout + +\begin_layout Itemize +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +private的构造方法 +\end_layout + +\end_inset + +:只有本类可以通过new创建对象 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +属性和方法的访问控制小结 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:访问控制保护范围示意" + +\end_inset + +可以帮助我们理解public/protected/private修饰符的保护范围。一般的,可以根据 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Java的访问控制修饰符" + +\end_inset + +按照从左向右的顺序推断修饰符在当前语境中的保护作用。比如,如果父类中的属性是default的,并且子类和父类不在同一个包中,则子类是无法访问父类中该属性的。但是 +如果子类和父类在同一个包中,则子类可以访问父类中这个default修饰的属性—此时default修饰符允许同一包中的类访问这个条件起了作用。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/access-control-overview.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +访问控制保护范围示意 +\begin_inset CommandInset label +LatexCommand label +name "fig:访问控制保护范围示意" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在编程实践中,我们往往根据以下的原则来确定使用什么修饰符控制属性和方法的访问权限: +\end_layout + +\begin_layout Itemize +首先考虑使用最严格的访问控制策略,即优先考虑使用private修饰属性和方法,除非你有足够的理由,比如希望子类可见,则选择使用protected修饰符。 +\end_layout + +\begin_layout Itemize +尽量避免default修饰符,即不使用任何修饰符,这是一个危险和不好的编程习惯。 +\end_layout + +\begin_layout Itemize +尽量避免public修饰符,这比default更危险!有两个例外:一是构造方法一般是public的,理由在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:public修饰符" + +\end_inset + +已经讲过了。二是常量一般也是public的。 +\end_layout + +\begin_layout Subsection +类的访问控制 +\begin_inset CommandInset label +LatexCommand label +name "subsec:类的访问控制" + +\end_inset + + +\end_layout + +\begin_layout Standard +属性和方法的访问控制有4个级别,类的访问控制则简单的多,只有两个级别: +\end_layout + +\begin_layout Enumerate +\begin_inset Index idx +status open + +\begin_layout Plain Layout +public +\end_layout + +\end_inset + +public:public修饰的类,在任何包中都可见。 +\end_layout + +\begin_layout Enumerate +\begin_inset Index idx +status open + +\begin_layout Plain Layout +default +\end_layout + +\end_inset + +default:default修饰(即没有任何修饰符)的类,只在本包中可见。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +在一个Java源文件中,只有一个类可以是public的,而且这个public的类的类名和文件名要严格一致。在这个Java源文件中,除了这个public的类之外, +依然可以定义其他的default修饰(即没有使用任何修饰符)的类。但是一般情况下不建议这样做,应该每个类建立单独的Java源文件。原因是我们一般是通过浏览这个包 +(目录)了解这个包中包含了哪些类,如果在一个源文件中包含了多个类,一方面我们无法从文件的目录了解包的内容,另一方面,这些隐藏在其他类文件中的类就只能限于包内访问 +了。一个例外是内部类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:内部类" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:内部类" + +\end_inset + + +\end_layout + +\begin_layout Standard +有的时候,我们为了防止命名冲突,或者为了安全起见,定义一个类只希望局限在某个类内使用,这样的类就是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +内部类 +\end_layout + +\end_inset + +内部类(Inner Class): +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +定义在一个类内部的类 +\end_layout + +\end_inset + +,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +class OuterClass { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + class InnerClass() { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + +可以把内部类理解为在类内部定义的第三种资源,其他两种是属性和方法,因此类比属性和方法的用法,我们可以这样使用内部类: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +OuterClass.InnerClass innerObject = outerObject.new InnerClass(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:内部类的创建过程" + +\end_inset + +形象的表示了内部类的创建过程。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/new-innerclass.png + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +内部类的创建过程 +\begin_inset CommandInset label +LatexCommand label +name "fig:内部类的创建过程" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写NotePad类,使用内部类Editor实现编辑功能 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/ac/innerclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "NotePad.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "innerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/innerclass/NotePad.java" +lstparams "float,caption={NotePad.java},label={NotePad.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/ac/innerclass/Client.java" +lstparams "float,caption={Client.java},label={innerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +parsing:test string +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +通过这个例子我们要注意到两点: +\end_layout + +\begin_layout Itemize +如何创建一个内部类对象:首先要创建一个外部类对象,然后才能创建一个内部类对象。 +\end_layout + +\begin_layout Itemize +内部类对象可以访问外部包围类(即内部类是在这个外部包围类中定义的)的属性和方法,即使这个外部类的属性和方法是private的(请读者试着把content属性设置 +为private看看会怎样?试着把parseContent方法设置为private看看会怎样?)。这个很容易理解:内部类和外部类的属性和方法是平等的, +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +就像是本类的方法可以无限制访问本类的属性一样 +\end_layout + +\end_inset + +,本类的内部类当然可以无限制访问本类的属性和方法。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status collapsed + +\begin_layout Plain Layout +也许你会说,NotePad这个例子中,使用内部类Editor实现parseContent这个功能太矫情,根本没有必要!是的,在这种简单的情况下确实没有必要绕道使 +用内部类。但是设想NotePad不仅仅需要提供文本编辑,还需要文本搜索、格式转换等等其他功能,而且每类功能不止包含一个方法,那么为了逻辑上清晰起见,使用内部类将 +文本编辑相关的方法组织为内部类NotePad.Editor,将文本搜索相关的方法组织为内部类NotePad.Search,将格式转换相关的方法组织为内部类NoteP +ad.Transfer就容易理解了。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +引用类型 +\begin_inset CommandInset label +LatexCommand label +name "sec:引用类型" + +\end_inset + + +\end_layout + +\begin_layout Standard +很多人会说,Java语言比C语言更“进步”或者“安全”的一个原因是Java没有指针数据类型,其实这是不确切的。Java的确没有像C语言那样提供“指针 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +指针 +\end_layout + +\end_inset + +”这种基本数据类型,但是Java确实使用了指针,而且指针的正确使用同样很重要。Java中的指针叫做“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +引用 +\end_layout + +\end_inset + +引用”。 +\end_layout + +\begin_layout Standard +和C语言一样,我们可以从变量在内存中的存储来理解Java的引用(指针)。Java的基本数据类型所形成的变量不是引用,变量的名字直接代表了变量所在存储单元的内容, +这和C语言中的非指针变量是一样的。除此之外,Java中的数组、对象、Enum等的名字,都是引用(指针),如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java中的引用" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/reference-object.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java中的引用 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java中的引用" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比如下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Person person = new Person(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +之前我们把person叫做“Person”类型的对象,其实这是不严谨的,应该叫做“Peron”类型对象的名字。也就是说,person仅仅是一个对象的名字,这个名 +字其实是指向person对象的一个引用(指针)。因此下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Person person; +\end_layout + +\begin_layout Plain Layout + +person.goHome(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +就会报“NullPointException +\begin_inset Quotes erd +\end_inset + +错误,即“空指针异常”。这里只是声明了一个person类型的引用,但是并没有初始化,也就是说,person并没有指向任何实质的Person类型的对象。因此在初始 +化之前,任何对象的引用都是null,这和C语言的指针含义完全一样:在C语言中,任何指针在初始化之前都是null指针,直接使用null指针是有风险的。而在Java +中,Java虚拟机会自动侦测空指针,任何对空指针 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +空指针 +\end_layout + +\end_inset + +(未初始化的对象引用)都会报告NullPointException异常。NullPointException异常如此常见,通常大家都把NullPoinitExc +eption异常简称为“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +NPE +\begin_inset Index idx +status open + +\begin_layout Plain Layout +NPE +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +”。 +\end_layout + +\begin_layout Standard +在C语言中,指针作为函数的参数是一个强大的特性,即可以帮助把大量的数据传入函数(输入参数),也可以帮助函数返回大量的数据(输出参数)。在Java中,我们也要区分 +方法的参数为简单数据类型和对象(引用)两种情况。 +\end_layout + +\begin_layout Example +使用对象作为方法的参数 +\begin_inset CommandInset label +LatexCommand label +name "exa:使用对象作为方法的参数。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们首先定义一个简单的Person类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Person.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Person.java" +lstparams "float,caption={Person.java},label={objref-Person.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +测试类Client.java的代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Client.java" +lstparams "float,caption={Client.java},label={objref-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +Client的运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\align left +Person[username=zhangsan,password=123456,seniority = 20,salary = 5000.0] +\end_layout + +\begin_layout Plain Layout +\align left +Person[username=zhangsan,password=123456,seniority = 20,salary = 6000.0] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +可以看出,adjustSalary方法中改变了person对象的属性slary的值, +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +这和C语言中使用指针作为函数参数的作用如出一辙 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +两个引用指向同一个对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:两个引用指向同一个对象。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们借用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用对象作为方法的参数。" + +\end_inset + +中定义的Person类设计一个测试类,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Client1.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/objref/Client1.java" +lstparams "caption={Client1.java},label={Client1.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client1的结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +zhangsan1 == zhangsan2 ? false +\end_layout + +\begin_layout Plain Layout +zhangsan3 == zhangsan1 ? true +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:两个引用指向同一个对象。" + +\end_inset + +中,看起来zhangsan1和zhangsan2两个对象是一样的,有相同的名字和密码设置。但是,这是两个不同的对象,即不同的引用,在内存中有不同的地址。而zha +ngsan3指向了zhangsan1,即zhangsan3和zhangsan1指向了同一个对象,因此zhangsan1和zhangsan3是相等的,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:对象的引用示意图" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/object-ref-model.eps + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +对象的引用示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:对象的引用示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Subsection* +this +\begin_inset Note Note +status open + +\begin_layout Plain Layout +满足李震梅老师的要求 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +this +\end_layout + +\end_inset + +this关键字表示“对象本身”,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +指向当前对象的引用 +\end_layout + +\end_inset + +。比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "objref-Person.java" + +\end_inset + +中,构造方法是这样写的: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public Person(String username, String password) { +\end_layout + +\begin_layout Plain Layout + + this.username = username; +\end_layout + +\begin_layout Plain Layout + + this.password = password; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其中,this.username即指当前对象的username属性,这样就把作为参数的username和作为对象属性的username区分开来了。 +\end_layout + +\begin_layout Subsection* +super +\begin_inset Note Note +status open + +\begin_layout Plain Layout +满足李震梅老师的要求 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:对象的创建过程" + +\end_inset + +中已经看到,对象在创建时会“递归的构造父类对象”,也就是说,递归的调用父类的构造方法,这并不需要我们在子类的构造方法中做什么。但是,有时候我们希望能够控制对象的 +构造过程,也就是说,打破java默认的对象构造过程,在构造对象的链条中加入自定义的成分,这个时候我们可以使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +super +\end_layout + +\end_inset + +super关键字:指向父类对象的引用。我们通过一个例子来说明 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +super +\end_layout + +\end_inset + +super在对象的构造过程中是如何起作用的。 +\end_layout + +\begin_layout Example +使用super自定义对象的构造过程 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/inherit/step4 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +限于篇幅,这里只列出了CreditCard.java的完整代码,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "inherit-step4-CreditCard.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/inherit/step4/CreditCard.java" +lstparams "float,caption={CreditCard.java},label={inherit-step4-CreditCard.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果和分析 +\end_layout + +\begin_layout Standard +我们可以分三种情况运行此例,分别在CreditCard类的构造方法CreditCard(String cardNo)中: +\end_layout + +\begin_layout Enumerate +调用super()时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,调用super()会触发“递归的构造父类对象”。 +\end_layout + +\begin_layout Enumerate +调用super(cardNo)时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,调用super(cardNo)后,就不会再调用父类的无参构造方法。 +\end_layout + +\begin_layout Enumerate +不调用父类的构造方法时,输出如下: +\begin_inset Newline newline +\end_inset + + +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "90col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Card constructor called +\end_layout + +\begin_layout Plain Layout +BankCard constructor called +\end_layout + +\begin_layout Plain Layout +CreditCard constructor called,cardNo=123 +\end_layout + +\begin_layout Plain Layout +============================== +\end_layout + +\begin_layout Plain Layout +Card constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +BankCard constructor called,cardNo=456 +\end_layout + +\begin_layout Plain Layout +DebitCard constuctor called,cardNo=456 +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +可以看出,不显式调用父类的构造方法,实际上也会默认调用父类的无参构造方法,和显式调用super()效果是一样的。也就是说, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +我们在创建子类对象时,要么通过明确调用父类的有参构造方法递归的创建父类对象,要么java会递归的调用父类的无参构造方法来初始化各级父类对象 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Section +static +\begin_inset CommandInset label +LatexCommand label +name "sec:static" + +\end_inset + + +\end_layout + +\begin_layout Standard +一个典型的面向对象的设计如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:面向对象编程的基本思路" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oopbasic/book-nostatic.eps + width 80col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +面向对象编程的基本思路 +\begin_inset CommandInset label +LatexCommand label +name "fig:面向对象编程的基本思路" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,我们在抽象出一类事物的共同特性后,编写相应于这类事物的一个类,在这里是Book;然后根据Book类再创建若干个Book类型的对象,book1、book +2等等。有了book对象后,就可以访问book对象的属性和方法了,比如调用:book.edit()。总之,原则上我们只有 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +持有一个对象后(其实是持有一个指向对象的引用),才能操作这个对象 +\end_layout + +\end_inset + +。由 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:面向对象编程的基本思路" + +\end_inset + +可以看出,不同对象的状态(属性值)往往是不同的。 +\end_layout + +\begin_layout Standard +考虑下面的情形: +\end_layout + +\begin_layout Itemize +比如无论书籍的类型、开张等,书籍的“章”一般都定义为“第一章”、“第二章”,因此可以将CHAPTER_ONE定义为常量,而且不随Book对象的变化而变化,即无论 +有多少个Book对象,也无论Book对象的其他属性如何,CHAPTER_ONE,CHAPTER_TWO的值都不会变化。在这种情况下,每个Book对象都保存一份C +HAPTER_ONE,CHAPTER_TWO属性是没有必要的。解决这个问题的方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static常量" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +比如给每个Book对象一个id,要求这个id能够自动增长,即假设第一个Book对象的id为1,第二个Book对象的id自动设置为2,以此类推。解决这个问题的方法 +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static属性" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +比如我们要设计一个方法usage(),当调用这个方法时打印出Book类的用法。可以看出这个方法和对象的状态没有任何关系,也就是说,usage方法没有必要读取对象 +的状态,因此也没有必要每个对象都保存一个usage方法。解决这个问题的方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:static方法" + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +static常量 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static常量" + +\end_inset + + +\end_layout + +\begin_layout Standard +显然,常量没有必要在每个对象中都保存一份,只需要在类的定义中保存一份即可。因此,正如我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:常量和常量的命名" + +\end_inset + +中提到的,常量一般的命名方式都是public static final的,其中的static表示静态变量,即只在类定义中保存一份的变量,或者说,所有对象共享一份 +的变量。由于是常量,也通常使用final修饰符限定此变量不可修改,即常量(常数变量)。由于静态常量只和类有关而和具体对象无关,因此静态常量 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +静态常量 +\end_layout + +\end_inset + +又称为 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类常量 +\end_layout + +\end_inset + +类常量 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +在类中定义常量后,我们有两种方式使用(引用)这个常量: +\end_layout + +\begin_layout Enumerate +直接使用类名引用类常量。也就是说,不需要创建一个此类的对象,可以直接通过类名引用类常量。 +\end_layout + +\begin_layout Enumerate +使用对象引用类常量。如果已经创建了对象,通过对象引用类常量也是可以的。 +\end_layout + +\begin_layout Example +在Book中定义常量CHAPTER_ONE,CHAPTER_TWO,并使用两种方法引用此常量。 +\begin_inset CommandInset label +LatexCommand label +name "exa:在Book中定义常量CHAPTER_ONE,CHAPTER_TW" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticcontant-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticconstant-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticconstant/Book.java" +lstparams "float,caption={使用了static常量的Book.java},label={staticcontant-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticconstant/Client.java" +lstparams "float,caption={Client.java},label={staticconstant-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果和分析 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +第一章 +\end_layout + +\begin_layout Plain Layout +第一章 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +虽然两种方式都打印出了正确的结果,但是第二种引用static常量的方式是不建议的:即不经济,也没必要。 +\end_layout + +\begin_layout Exercise +在JDK源代码中找到一些常量的定义,认真体会: +\end_layout + +\begin_layout Itemize +常量的惯用命名方式,。 +\end_layout + +\begin_layout Itemize +常量的使用(引用)方式。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +JDK源代码可以从 +\begin_inset CommandInset href +LatexCommand href +name "https://github.com/dmlloyd/openjdk" +target "https://github.com/dmlloyd/openjdk" +literal "false" + +\end_inset + +下载。在openjdk的源代码目录下执行如下命令可以找到非常多的常量定义: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +$ grep -ri +\begin_inset Quotes eld +\end_inset + +public static final +\begin_inset Quotes erd +\end_inset + + * +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +static属性 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static属性" + +\end_inset + + +\end_layout + +\begin_layout Standard +当我们用static修饰类的属性时,这个属性就成为“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类属性 +\end_layout + +\end_inset + +类属性”。相对于“ +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例属性 +\end_layout + +\end_inset + +实例属性”(每个对象都有一份独立的拷贝), +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +类属性在此类的所有对象之间共享一份拷贝 +\end_layout + +\end_inset + +。对于类属性,我们需要注意到三点: +\end_layout + +\begin_layout Itemize +类属性的引用。我们一般采用Book.nextId的方式,即直接使用类来引用类属性,这也是类属性设计的本意。 +\end_layout + +\begin_layout Itemize +类属性相当于在对象之间共享的变量,因此一个对象修改了类属性,会影响另外对象的状态,因此使用类属性实际上导致了对象之间的“紧耦合”,造成了系统模块之间的界面不清晰 +,这是现代软件设计中力图规避的地方。因此,在软件设计实践中要尽量避免使用类属性,除非你有足够的理由。 +\end_layout + +\begin_layout Itemize +类属性的初始化问题。类属性的默认值和普通属性没有任何区别,但是由于类属性和具体对象没有关联,因此无法在对象的构造方法中初始化。Java提供了“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +static块 +\end_layout + +\end_inset + +”的方式初始化类属性,比如在Book中这样初始化nextId类属性: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + // 初始化静态属性,这里设置id的起点值 +\end_layout + +\begin_layout Plain Layout + + static { +\end_layout + +\begin_layout Plain Layout + + nextId = 100; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + +和对象的构造方法不同的是,static代码块在整个应用程序运行期间只会执行一次,而对象的构造方法在创建对象时都会执行一次。 +\end_layout + +\begin_layout Example +编写一个Book类,book对象使用自动增长的id作为对象的标识。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticvariable-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "staticvariable-Client.java" + +\end_inset + + 。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticvariable/Book.java" +lstparams "float,caption={Book.java},label={staticvariable-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/staticvariable/Client.java" +lstparams "float,caption={Client.java},label={staticvariable-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Book{id=100, title=Thinking in Java, author=null, price=0.0} +\end_layout + +\begin_layout Plain Layout +Book{id=101, title=Design Patterns, author=null, price=0.0} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +static方法 +\begin_inset CommandInset label +LatexCommand label +name "subsec:static方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +和类属性 +\begin_inset Foot +status open + +\begin_layout Plain Layout +需要澄清的是,下面两种说法是等价的,我们可能在不同的场合交替使用不同的名称: +\end_layout + +\begin_layout Itemize +类属性=静态属性 +\end_layout + +\begin_layout Itemize +类方法=静态方法 +\end_layout + +\begin_layout Itemize +实例属性=实例变量=非静态属性=非静态变量 +\end_layout + +\begin_layout Itemize +实例方法=实例函数=对象方法=对象函数=非静态方法 +\end_layout + +\end_inset + +一样, +\begin_inset Index idx +status open + +\begin_layout Plain Layout +类方法 +\end_layout + +\end_inset + +类方法指使用static修饰的方法,类方法在所有对象之间共享一个拷贝。类方法通常用于一些工具类的定义,比如JDK中的Math类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html +\end_layout + +\end_inset + +里面的方法都是类方法。 +\end_layout + +\begin_layout Standard +类方法是在对象创建之前就存在的,因此在类方法中不能访问实例属性(对象还没有创建,实例属性根本不存在),只能访问类属性(使用static修饰的属性),见下面的代码 +片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Test { +\end_layout + +\begin_layout Plain Layout + + string name; +\end_layout + +\begin_layout Plain Layout + + static int nextId; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + static void testStaticMethod() { +\end_layout + +\begin_layout Plain Layout + + nextId++; // 这是可以的 +\end_layout + +\begin_layout Plain Layout + + //name = "zhangsan"; // 这是不允许的,语法错误 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +在Book类中增加一个类方法usage(),调用这个方法显示一段文字,说明这个类的用途。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +设计一个字符串处理工具类,给出如下的方法实现: +\end_layout + +\begin_layout Itemize +能够方便的删除字符串的最后一个字母; +\end_layout + +\begin_layout Itemize +能够自动将字符串转化为网址形式,即自动增加 +\begin_inset Quotes erd +\end_inset + +http:// +\begin_inset Quotes erd +\end_inset + +前缀; +\end_layout + +\begin_layout Subsection +*内部类回头看 +\end_layout + +\begin_layout Standard +在 +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:内部类" + +\end_inset + +中,我们看到内部类就像是定义在类内部的方法一样。类的方法分为静态方法和非静态方法,静态方法只能访问类的静态属性,那么内部类是不是也可以使用static修饰呢? +\end_layout + +\begin_layout Standard +实际上,java的内部类分为四种类型: +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +成员内部类(member inner class) +\end_layout + +\end_inset + +,即我们在 +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:内部类" + +\end_inset + +中讨论的,和实例方法用法类似的内部类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +静态内部类(static inner class) +\end_layout + +\end_inset + +,使用static修饰的内部类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +局部内部类(local inner class) +\end_layout + +\end_inset + +,定义在方法内部的类。 +\end_layout + +\begin_layout Enumerate +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +匿名内部类(anonymous inner class) +\end_layout + +\end_inset + +,只使用一次的内部类。 +\end_layout + +\begin_layout Standard +内部类的第一种形式:成员内部类我们已经讨论过了,这里不再赘述,下面我们分别看一下其他三种内部类: +\end_layout + +\begin_layout Subsubsection +静态内部类 +\end_layout + +\begin_layout Standard +静态内部类即使用static修饰的内部类,也常叫做“嵌套类”(Nested Class)。静态内部类有两个重要的意义: +\end_layout + +\begin_layout Enumerate +正如静态方法一样,使用静态内部类可以限制内部类对外部包围类属性和方法的访问。对比成员内部类, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +静态内部类只能访问外部包围类的静态属性和静态方法 +\end_layout + +\end_inset + +。使用静态内部类的好处是,如果我们在外部包围类中不定义静态属性和方法,实际上就切断了静态内部类和外部包围类的联系,使得静态内部类成为一个独立的模块,符合“松耦合 +”的现代软件设计理念。因此可以看到在实际的软件开发中,内部类很多都定义为静态内部类,比如Android程序设计中,大量使用到静态内部类。 +\end_layout + +\begin_layout Enumerate +静态内部类对象的创建不需要首先创建外部包围类对象,比如Outer.Inner innerObj = new Outer.Inner();这实际上让静态内部类成为了一 +个受限的顶级类 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要展开说明顶级类和受限的含义吗? +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Example +编写一个静态内部类,演示静态内部类访问外部包围类的静态属性和静态方法 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/nestedclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "nestedclass-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "nestedclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/nestedclass/Book.java" +lstparams "caption={Book.java},label={nestedclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/nestedclass/Client.java" +lstparams "caption={Client.java},label={nestedclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book[version=1] by someone +\end_layout + +\begin_layout Plain Layout +publish the book[Learning Java based on C] +\end_layout + +\begin_layout Plain Layout +Book.Editor.usage() called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +局部内部类 +\end_layout + +\begin_layout Standard +局部内部类定义在方法内部,可以认为是方法的局部变量。就像方法的局部变量一样,局部内部类的作用范围仅限于方法内部,即在方法外部是无法创建局部内部类的对象的。局部内 +部类可以使用所在方法中的属性,也可以访问类的实例属性和类属性。 +\end_layout + +\begin_layout Standard +局部内部类的使用场合较少,通常在组织复杂方法代码时使用。但是,由于在方法内部定义类,可能导致方法体臃肿,使得方法的逻辑层次不清晰,在使用局部内部类时要适当取舍。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举个在openjdk中的例子?或者实际项目中的例子 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +编写一个局部内部类,演示局部内部类对方法属性的访问和局部内部类对象的创建方式 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/oopbasic/src/cn +/edu/sdut/softlab/oopbasic/localinnerclass +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "localninnerclass-Book.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "localninnerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/localinnerclass/Book.java" +lstparams "float,caption={Book.java},label={localninnerclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/localinnerclass/Client.java" +lstparams "float,caption={Client.java},label={localninnerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book before publish +\end_layout + +\begin_layout Plain Layout +publish book[version=1,id=0 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:匿名内部类" + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:JAVA图形用户界面的事件机制" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:接口上的匿名内部类" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:使用匿名内部类" + +\end_inset + +中,我们还会看到匿名内部类的使用。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果一个内部类只使用一次的话,就没有必要非要给这个内部类起个名字了,这就是匿名内部类的使用场合。匿名内部类由于没有名字,必须从父类继承下来(在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:接口上的匿名内部类" + +\end_inset + +中我们可以看到,也可以实现一个接口)。 +\end_layout + +\begin_layout Example +使用匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "exa:使用匿名内部类" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annonymousinnerclass-Book.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annonymousinnerclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/annnoymousinnerclass/Book.java" +lstparams "float,caption={Book.java},label={annonymousinnerclass-Book.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/annnoymousinnerclass/Client.java" +lstparams "float,caption={Client.java},label={annonymousinnerclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +edit the book before publishing +\end_layout + +\begin_layout Plain Layout +publish the book[Learning Java Based on C] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用匿名内部类" + +\end_inset + +中,我们组合使用了匿名对象和匿名内部类,这是由于在这种情况下,创建的匿名内部类对象也只使用一次,就没有必要起个名字了。我们给对象一个名字的目的不就是在重复使用这 +个对象的时候方便引用吗? +\end_layout + +\begin_layout Exercise +还原 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:使用匿名内部类" + +\end_inset + +为不使用匿名内部类的情形,对比一下说明匿名内部类的优点和缺点。 +\end_layout + +\begin_layout Subsection +*内部类的进一步讨论 +\begin_inset CommandInset label +LatexCommand label +name "subsec:内部类的进一步讨论" + +\end_inset + + +\end_layout + +\begin_layout Standard +在前面的讨论中,内部类都是没有父类的。但是,内部类其实也可以是一个子类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:实现多个接口" + +\end_inset + +中,我们可以看到,内部类也可以实现(多个)接口,从而更好的实现Java的多继承。 +\end_layout + +\end_inset + +,这样我们在外部包围类中定义多个内部类,每个内部类继承自一个父类,就巧妙的绕过了Java没有多继承的限制,曲线的实现了多继承。 +\end_layout + +\begin_layout Example +编写程序,使用内部类达到多继承的目的。 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写程序,使用内部类达到多继承的目的。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-Printer.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-Copier.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-SmartPrinter.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinherit-SmartPrinterClient.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/Printer.java" +lstparams "float,caption={Printer.java},label={multiinherit-Printer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/Copier.java" +lstparams "float,caption={Copier.java},label={multiinherit-Copier.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/SmartPrinter.java" +lstparams "float,caption={SmartPrinter.java},label={multiinherit-SmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopbasic/src/cn/edu/sdut/softlab/oopbasic/multiinherit/SmartPrinterClient.java" +lstparams "float,caption={SmartPrinter.java},label={multiinherit-SmartPrinterClient.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +basic print +\end_layout + +\begin_layout Plain Layout +SmartPrinter print +\end_layout + +\begin_layout Plain Layout +basic copy +\end_layout + +\begin_layout Plain Layout +SmartPrinter copy +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,在SmartPrinterTest中,我们只是使用SmartPrinter对象即可同时获得print和copy两个功能,好像同时从Printer和Co +pier继承下来一样。SmartPrinter类其实是一个Facade类 +\begin_inset CommandInset citation +LatexCommand cite +key "design-pattern-4gangs" +literal "true" + +\end_inset + +,当我们希望在一个类中融合多项功能时,为了代码逻辑清晰起见,借用内部类实现多继承是常见的策略。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举一个在switch中使用Enum的例子 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +内部类的作用范围 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section* +思考和练习 +\end_layout + +\begin_layout Exercise +编写一个default修饰的类,尝试在其他包中创建该类的对象,结果会怎样? +\begin_inset CommandInset label +LatexCommand label +name "exer:编写一个default修饰的类,尝试在其他包中创建该类的对象,结" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +考虑下面的代码,指出哪些是类属性,哪些是实例属性? +\begin_inset CommandInset label +LatexCommand label +name "exer:考虑下面的代码,指出哪些是类属性,哪些是实例属性?" + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +http://docs.oracle.com/javase/tutorial/java/javaOO/QandE/creating-questions.html +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture5.lyx b/guide/lecture_guide/lecture5.lyx new file mode 100644 index 0000000..db0b3ca --- /dev/null +++ b/guide/lecture_guide/lecture5.lyx @@ -0,0 +1,3395 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +coderemarks +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第五次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:抽象类和抽象方法" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:抽象类和抽象方法" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:接口" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:接口" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +抽象类的基本概念和用法; +\end_layout + +\begin_layout Enumerate +接口的基本概念和用法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +抽象类和接口的关系; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握抽象类的概念和使用场合,结合类的层级结构和访问控制,能够根据现实问题设计合适的抽象类作为父类; +\end_layout + +\begin_layout Enumerate +熟练掌握接口的概念和使用场合,能够根据现实问题抽象出接口部分,设计合适的模块耦合; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +抽象类和接口的区别和联系? +\end_layout + +\begin_layout Enumerate +从现实世界中找到几个抽象类和接口的对应关系。 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +面向对象工程思想 +\end_layout + +\begin_layout Standard +不想当将军的士兵不是好士兵,不想当架构师的程序员不是一个好程序员。本章内容不可能涵盖Java架构师的所有内容,只是一个菜鸟Java程序员进阶的必由之路。 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/programmer-steps.eps + lyxscale 50 + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Section +抽象类和抽象方法 +\begin_inset CommandInset label +LatexCommand label +name "sec:抽象类和抽象方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +在类的继承关系中,有些情况下我们不希望根据父类创建对象,或者说希望 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +禁止创建父类对象 +\end_layout + +\end_inset + +。比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Animal的类层次关系" + +\end_inset + +所示的情形。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-polymorphism.eps + width 70col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Animal的类层次关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Animal的类层次关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果我们希望禁止创建Animal对象 +\begin_inset Foot +status open + +\begin_layout Plain Layout +为什么有这种需求呢?主要的出发点是强制使用具体的子类对象,因为子类对象比父类对象提供了更具体的属性和方法。 +\end_layout + +\end_inset + +,即只允许创建Dog、Cat等Animal的子类对象,该怎么做呢?Java提供了两种方式: +\end_layout + +\begin_layout Enumerate +使用抽象类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抽象类 +\end_layout + +\end_inset + +:将Animal定义为抽象类,这样使用new创建Animal对象将导致语法错误,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:抽象类" + +\end_inset + +。 +\end_layout + +\begin_layout Enumerate +使用接口 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +:将Animal定义为接口,这样便不能直接创建Animal类型的对象,只能通过实现Animal接口创建具体的对象,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +抽象类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:抽象类" + +\end_inset + + +\end_layout + +\begin_layout Standard +只要一个类使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +abstract +\end_layout + +\end_inset + +abstract修饰,这个类就是一个抽象类。抽象类不允许通过new操作符创建对象,抽象类只能作为父类被继承。 +\end_layout + +\begin_layout Example +编写一个抽象的Animal类 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写一个抽象的Animal类。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Dog.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Animal.java" +lstparams "float,caption={Animal.java},label={abstractclass-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Dog.java" +lstparams "float,caption={Dog.java},label={abstractclass-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Client.java" +lstparams "float,caption={Client.java},label={abstractclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +抽象类是不允许直接实例化 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例化 +\end_layout + +\end_inset + +的,因此在Client中直接创建Animal类型的对象会报告语法错误。虽然Dog类看起来是一个空的类,但是Dog继承自Animal,因此也继承了Animal中已 +经实现了的公有的hello方法。 +\end_layout + +\begin_layout Subsection +抽象方法 +\end_layout + +\begin_layout Standard +有的时候,我们希望父类的方法仅仅是个声明,即只是说明了方法的名字、返回值类型、参数的类型和个数及其顺序,方法的具体内容(即方法体)需要父类的子类去实现。也就是说 +,父类的这个方法是“抽象”的,因为缺少了方法体,直接调用这个抽象的方法也没有意义,因此Java规定只要类中有一个抽象方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抽象方法 +\end_layout + +\end_inset + +,这个类就必须定义为抽象类。子类在继承抽象类后,必须实现父类中的所有抽象方法,除非该子类也是抽象类。 +\end_layout + +\begin_layout Example +实现一个包含抽象方法的抽象类。 +\begin_inset CommandInset label +LatexCommand label +name "exa:实现一个包含抽象方法的抽象类。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "abstractmethod-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "abstractmethod-Dog.java" + +\end_inset + +,Client的设计和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:编写一个抽象的Animal类。" + +\end_inset + +一样,这里不再列出。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractmethod/Animal.java" +lstparams "float,caption={Animal.java},label={abstractmethod-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractmethod/Dog.java" +lstparams "float,caption={Dog.java},label={abstractmethod-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,父类中的抽象方法hello在子类中必须给出具体的实现。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea中,如果没有实现父类中的抽象方法,在类名上面会给出提示信息,此时只要在类名上面按Alt+Enter键组合即可自动给出默认的方法实现,非常方便: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/abstract-method-hint.png + width 60col% + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +如果Dog类也是抽象类,一定需要实现父类Animal中的抽象方法吗?试修改 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:实现一个包含抽象方法的抽象类。" + +\end_inset + +的Dog为抽象类,然后增加一个Hunter类作为Dog的子类。 +\end_layout + +\begin_layout Subsection +抽象类小结 +\end_layout + +\begin_layout Standard +抽象类是系统架构的常见手段,有两个重要的作用: +\end_layout + +\begin_layout Itemize +强制继承,不允许实例化父类,即必须提供子类才能使用抽象父类的属性和功能。 +\end_layout + +\begin_layout Itemize +便于合理划分(区分)事物的共性和个性,将个性化的部分设计为抽象方法,强制子类实现父类的抽象方法,同时子类中的这些方法其名称、参数和返回值也会受到抽象父类的约束, +这在系统架构和团队合作中显得尤为重要。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +要讨论抽象类和多态吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +接口 +\begin_inset CommandInset label +LatexCommand label +name "sec:接口" + +\end_inset + + +\end_layout + +\begin_layout Subsection +定义接口:纯的抽象类 +\end_layout + +\begin_layout Standard +如果抽象类中所有的方法都是抽象方法会怎样?比如下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public abstract class Animal { +\end_layout + +\begin_layout Plain Layout + + public abstract void hello(); +\end_layout + +\begin_layout Plain Layout + + public abstract void eat(); +\end_layout + +\begin_layout Plain Layout + + public abstract void sleep(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,此时的Animal是一个纯抽象类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +纯抽象类 +\end_layout + +\end_inset + +,Java提供了interface( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +接口)来表达纯的抽象类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "interface-Animal.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Animal.java" +lstparams "float,caption={Animal.java},label={interface-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +接口具有如下的特点: +\end_layout + +\begin_layout Itemize +接口一定是抽象的,因此接口类不需要明确声明是抽象的。即,在定义接口时,下面的两种方式都是可以的,一般采用省略abstract的写法。 +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public abstract interface Animal{...} +\end_layout + +\begin_layout Plain Layout + +public interface Animal {} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +接口中的方法一定是public的,所以可以省略接口方法的访问控制属性。实际上,在接口方法上使用private或者protected是语法错误,比如尝试在接口方法 +上增加protected: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public interface Animal { +\end_layout + +\begin_layout Plain Layout + + // 语法错误! +\end_layout + +\begin_layout Plain Layout + + protected void hello(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +正因为接口的以上两个特点,可以认为 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +接口是对“纯的抽象类”的简化写法 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +实现接口 +\end_layout + +\begin_layout Standard +接口虽然很像“纯的抽象类”,但是其用法和用意和抽象类有很多不同,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:抽象类和接口的关系" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抽象类 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +意义 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +概括了一类事物的共同属性和行为特征 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +概括了一类事物的共同行为特征 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法的实现 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +可以实现部分方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +只能声明方法,不允许实现方法 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +使用场合 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于明确类的层次关系 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于明确类的能力范围 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +用法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +子类通过extends继承父类 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +通过implements实现指定的接口 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抽象类和接口的关系 +\begin_inset CommandInset label +LatexCommand label +name "tab:抽象类和接口的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +将Animal定义为接口,Dog类实现Animal接口。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "interface-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "pureabstract-Dog.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "pureabstract-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Dog.java" +lstparams "float,caption={Dog.java},label={pureabstract-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Client.java" +lstparams "float,caption={Client.java},label={pureabstract-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\begin_layout Plain Layout +Dog eat method +\end_layout + +\begin_layout Plain Layout +Dog sleep method +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +Dog类实现了Animal接口即意味着Dog类要给出Animal接口中规定的所有抽象方法的具体实现。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +和实现抽象方法类似,在Idea中,通过快捷键Alt+Enter可自动补全接口的方法,不再赘述。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +实现多个接口 +\begin_inset CommandInset label +LatexCommand label +name "subsec:实现多个接口" + +\end_inset + + +\end_layout + +\begin_layout Standard +对于抽象类,我们知道需要子类继承抽象的父类并实现父类中的所有抽象方法。但是,Java只支持单继承,即一个子类只能继承自一个抽象类。接口则不同, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +一个类可以“实现”若干个接口 +\end_layout + +\end_inset + +,这也是接口的强大之处。 +\end_layout + +\begin_layout Standard +现实中,事物总是具有多面性的,比如爱因斯坦不仅仅是物理学家,小提琴也拉的很好。比如大家对毛泽东的评价是伟大的思想家、哲学家、军事家、诗人。通常,我们会把一类事物 +的共同行为特征归纳为一个接口,那么具有多面性的事物,应该可以拥有多个接口才对,或者说,具有多面性的事物,应该实现多个接口。 +\end_layout + +\begin_layout Example +实现多个接口的类。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要画出类的UML类图 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Printer.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Copier.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-SmartPrinter.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Printer.java" +lstparams "float,caption={Printer.java},label={multiinterface-Printer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Copier.java" +lstparams "float,caption={Copier.java},label={multiinterface-Copier.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/SmartPrinter.java" +lstparams "float,caption={SmartPrinter.java},label={multiinterface-SmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Client.java" +lstparams "float,caption={Client.java},label={multiinterface-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +print called +\end_layout + +\begin_layout Plain Layout +copy called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +SmartPrinter实现了两个接口Printer和Copier,也就意味着SmartPrinter同时具有打印和复印两项功能。有人说,这不是多此一举吗?去掉 +两个接口的定义,在SmartPrinter类中直接实现copy和print方法就可以。从功能上看,的确可以这样处理,但是从逻辑上看,不使用接口会带来两个方面的问 +题: +\end_layout + +\begin_layout Itemize +Print和Copy两个接口定义了功能方法的名称和参数,如果不使用接口,或者不实现规定的接口,那么方法名就失去了参照,很容易造成各自为政的局面,给代码的维护和团 +队的交流带来麻烦。 +\end_layout + +\begin_layout Itemize +使用接口带来的另外一个好处是,我们可以通过“向上塑型 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +向上塑型 +\end_layout + +\end_inset + +”加强软件的健壮性,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:向上塑型:面向接口的编程" + +\end_inset + +展示这一点。 +\end_layout + +\begin_layout Standard +基于以上的分析,其实SmartPrinter的更合理的实现应该是 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-BetterSmartPrinter.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/BetterSmartPrinter.java" +lstparams "float,caption={BetterSmartPrinter.java},label={multiinterface-BetterSmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,通过内部类的封装,BetterSmartPrinter类的内部结构更清晰了。 +\end_layout + +\begin_layout Subsection +抽象类和接口的区别 +\end_layout + +\begin_layout Standard +抽象类和接口是从不同的方向来分析和看待事物—抽象类是纵向分析,接口是横向分析。如 +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:抽象类和接口的区别" + +\end_inset + +所示,纵向来看,Bus类描述了公交车的公共属性和方法,Classroom类描述了教室的公共属性和方法。但是在Bus和Classroom类中,某些方法是公共的,比 +如都提供Wifi接入服务和休息座椅,这些在不同事物中的公共方法,横向(切片)来看就是接口的意义。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/oop-project-method/abstract-class-interface.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抽象类和接口的区别 +\begin_inset CommandInset label +LatexCommand label +name "fig:抽象类和接口的区别" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +试根据 +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:抽象类和接口的区别" + +\end_inset + +编写相应的Bus、Classroom类和接口Wifi、Seat。 +\begin_inset CommandInset label +LatexCommand label +name "exer:试根据编写相应的Bus、Classroom类和接口Wifi、Se" + +\end_inset + +(参见: +\begin_inset CommandInset ref +LatexCommand vref +reference "solu:abstract class and interface" + +\end_inset + +) +\end_layout + +\begin_layout Subsection +接口中的常量 +\end_layout + +\begin_layout Standard +接口中除了抽象方法外,也可以持有常量,这也是一种常见的情形。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要进一步解释为什么常量是常见情形?JDK中的例子找出来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +但是,接口中不允许持有变量。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要进一步解释为什么? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +接口的继承 +\end_layout + +\begin_layout Standard +接口是“纯的抽象类”,因此接口和其他类一样,也可以实现继承关系,即接口的继承和类的继承有相同的语法和限制,不再赘述。 +\end_layout + +\begin_layout Subsection +接口中的默认方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +自JDK8开始支持此特性。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +TBD +\begin_inset Note Note +status open + +\begin_layout Plain Layout +可以参考:http://www.cnblogs.com/guangshan/p/4889732.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +不懂接口的项目经理不是好的项目经理 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:实现多个接口" + +\end_inset + +中我们已经看到,通过接口可以帮助我们规划模块的调用界面(界限),这在团队协作中非常重要,也就是说,接口为团队协作提供了有力的语法支持,考虑下面的情形: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/no-interface.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +不引入接口时的团队协作 +\begin_inset CommandInset label +LatexCommand label +name "fig:不引入接口时的团队协作" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果不使用接口,团队成员在功能实现时,在方法命名和方法规划上就失去了约束,这在小型项目中也许还是可以接受的,但是随着项目规模的增大,项目成员的增加和更迭,这种没 +有约束的编码方式很容易把项目带到沟里,最终失去控制,导致项目失败。因此,作为 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +项目经理 +\end_layout + +\end_inset + +项目经理或者项目的架构师 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +架构师 +\end_layout + +\end_inset + +,接口是一个有力的工具,在项目之初可以通过定义一系列接口的方式规定模块功能和模块之间的交互界面,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:引入接口后的团队协作" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/with-interface.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +引入接口后的团队协作 +\begin_inset CommandInset label +LatexCommand label +name "fig:引入接口后的团队协作" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +分别实现 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:不引入接口时的团队协作" + +\end_inset + +所示的代码和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:引入接口后的团队协作" + +\end_inset + +所示的代码,认真体会接口在团队协作中的作用。 +\end_layout + +\begin_layout Subsection +接口上的匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:接口上的匿名内部类" + +\end_inset + + +\end_layout + +\begin_layout Standard +如果我们确定一个对象只临时使用一次,那么这个对象通常可以采用匿名内部类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +匿名内部类 +\end_layout + +\end_inset + +的方式来实现,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:匿名内部类" + +\end_inset + +。如果这个临时的对象只是实现了某个接口,那么代码还可以进一步简化,直接可以使用“接口上的匿名类”技术来实现,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annoymousInnerClass-Client.java" + +\end_inset + +所示(Printer接口和Copier接口不变,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Printer.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Copier.java" + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/annoymousinnerclass/Client.java" +lstparams "float,caption={Client.java},label={annoymousInnerClass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Section +多态 +\begin_inset CommandInset label +LatexCommand label +name "sec:多态" + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +多态 +\end_layout + +\end_inset + +多态,是指对象在不同阶段或者环境下有不同的行为特征,听起来是不是有点“变色龙”的味道? +\end_layout + +\begin_layout Standard +先看一个实例,假设有如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Animal的类层次关系" + +\end_inset + +所示的类层次结构,也就是说,父类Animal有默认的hello()方法,三个子类Dog,Cat,Duke分别重写(overriding)了父类Animal的方法 +hello()。代码实现如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Dog.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Cat.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Duke.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-TestAnimal.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Animal.java" +lstparams "float,caption={Animal.java},label={ploymorphism-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Dog.java" +lstparams "float,caption={Dog.java},label={ploymorphism-Dog.java}" + +\end_inset + + +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Cat.java" +lstparams "float,caption={Cat.java},label={ploymorphism-Cat.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Duke.java" +lstparams "float,caption={Duke.java},label={ploymorphism-Duke.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/TestAnimal.java" +lstparams "float,caption={TestAnimal.java},label={ploymorphism-TestAnimal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在TestAnimal中,animals数组的每个元素是Animal类型的,貌似调用animal数组元素的hello方法应该打印出“动物在打招呼”,但是执行Te +stAnimal会发现输出结果是: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\begin_layout Plain Layout +喵喵 +\end_layout + +\begin_layout Plain Layout +嘎嘎 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,虽然我们调用的是父类对象的方法,但是其实真正执行的却是子类中的方法,这就是 +\begin_inset Flex Noun +status open + +\begin_layout Plain Layout +多态 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +多态 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。简单的说,多态是指:父类对象调用子类方法。 但是,同一个对象,在不同的运行时间,怎么会有不同的行为呢?这一点是如何做到的?先从对象的存储模型说起。 +\end_layout + +\begin_layout Subsection +对象的概念存储模型 +\begin_inset CommandInset label +LatexCommand label +name "subsec:对象的存储模型" + +\end_inset + + +\end_layout + +\begin_layout Standard +在上面的例子中,Dog、Cat、Duke类的对象在内存中是如何存储的呢?比如当Dog dog = new Dog()创建了一个Dog类的实例,则在内存中的存储如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java对象在内存中的存储模型" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +提请读者注意的是,为了简化问题的描述和避免过多的底层细节,本节的对象存储模型仅仅为了大家理解方便,并非对象在内存的真实存储情形。更多的细节请读者参考Java虚拟 +机规范 +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-se8-specification" +literal "true" + +\end_inset + +,推荐阅读《深入理解Java虚拟机》 +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-advanced-feature" +literal "true" + +\end_inset + +一书。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "50line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage.eps + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java对象在内存中的存储模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java对象在内存中的存储模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其中,dog是对象的引用,即指针,指向对象在内存的起始地址。对象在内存中的存储分为两个部分:父类的属性和方法存储区域以及子类的属性和方法存储区域,也就是说,子类 +完全包含了父类的所有信息。因此可以看出,我们得到了一个指向子类的引用dog,这个引用dog即可以访问子类的方法和属性,也可以访问父类的方法和属性,无非是通过do +g指针不同的偏移量指向不同的区域而已。 +\end_layout + +\begin_layout Standard +那么Animal dog = new Dog()是什么意思呢?从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java对象在内存中的存储模型" + +\end_inset + +可以看出,此时的dog指针仍然是指向整个Dog对象的指针,但是指针的范围却局限于父类Animal的区域,也就是说,此时的dog指针只能调用父类Animal中的属 +性和方法,而不能调用Dog子类扩展了的属性和方法。 +\end_layout + +\begin_layout Standard +如果子类没有重写 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +重写 +\end_layout + +\end_inset + +(orverriding)父类的方法,子类和父类的存储是泾渭分明的。如果子类重写(orverriding)了父类中的方法,那么父类中被重写的方法同样会发生变化, +即变的和子类中重写的方法一模一样,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:存在重写情况下的类存储结构" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这样的讲述是有问题的,试想super.hello()方法的调用过程? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage1.eps + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +存在重写情况下的类存储结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:存在重写情况下的类存储结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,当子类重写了父类中的方法时,父类存储区域中被重写的方法就变得和子类中的方法一模一样了,这样就能够理解本文刚开始的例子了:虽然animals数组的元素都 +是Animal类型的对象,但是由于这三个引用分别指向了Dog、Cat、Duke的对象,而Dog等对象重写了Animal中的hello方法,致使我们虽然调用的是父 +类中的方法,但是由于子类重写了父类中的这个方法,父类中的这个方法变得和子类中的方法一模一样了(即所谓的overriding,重写),最终的效果和直接调用子类中的 +方法一样,这就是Java中的多态,其实也是我们期望发生的事情。 +\end_layout + +\begin_layout Subsection +方法重载时的情形 +\end_layout + +\begin_layout Standard +在上例中,如果子类不是重写(overriding)父类的方法,而是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +重载 +\end_layout + +\end_inset + +重载(overloading)父类的方法,结果会怎样呢?比如,Cat类的hello方法改为(Dog/Duke以此类推): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void hello(String name){ +\end_layout + +\begin_layout Plain Layout + + System.out.println("喵喵" + name); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,Cat类的hello方法重载了父类的hello方法。执行TestAnimal的结果是: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +根据 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:存在重载情况的类存储结构" + +\end_inset + +可自行分析执行结果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage2.eps + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +存在重载情况的类存储结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:存在重载情况的类存储结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +多态的小结 +\end_layout + +\begin_layout Standard +可以看出,Java的多态是一种“动态绑定”技术,即在运行时决定调用哪个方法。多态的使用需要满足三个条件: +\end_layout + +\begin_layout Enumerate +继承 +\end_layout + +\begin_layout Enumerate +重写 +\end_layout + +\begin_layout Enumerate +父类引用指向子类对象 +\end_layout + +\begin_layout Subsection +多态的应用场合 +\end_layout + +\begin_layout Standard +从以上的分析可以看出,通常会利用方法的重写来达到简化代码的目的,即充分利用Java的多态特性。也就是说,在多态的帮助下,我们只需要调用父类的方法就可以了,具体执 +行的却是子类的对应方法。当然,这里有一个前提,即必须使用子类创建对象的引用,否则多态也就失效了。 +\end_layout + +\begin_layout Exercise +请说明实现Java多态的关键是什么? +\end_layout + +\begin_layout Section +*向上塑型:面向接口的编程 +\begin_inset CommandInset label +LatexCommand label +name "sec:向上塑型:面向接口的编程" + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:对象的存储模型" + +\end_inset + +可以看出,子类对象拥有父类对象的所有属性和方法(当然,在访问控制的限制下),反过来说,父类对象的属性和方法是子类对象的一个子集,因此把子类对象转换为一个父类对象 +是安全的,也就是说,如果我们持有一个子类对象的引用,可以安全的把这个引用转换为父类对象的引用,因为通过这个父类对象的引用,我们访问任何属性和方法都是“可达”的, +都不会引起任何错误。 +\end_layout + +\begin_layout Standard +但是反过来是不可行的,即把父类对象转换为子类对象。原因很简单,转换后的子类对象引用仍然指向了父类对象,但是却可能试图访问超出了父类对象范围的属性和方法,显然是不 +允许的。 +\end_layout + +\begin_layout Standard +这就是Java中的“向上塑型 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +向上塑型 +\end_layout + +\end_inset + +”,即对象的引用可以向父类的方向转换,但是不允许向子类的方向转换。在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-TestAnimal.java" + +\end_inset + +中,我们已经看到了向上塑型的应用,可以说,向上塑型是Java多态的的基本形态。 +\end_layout + +\begin_layout Standard +在编程实践中,我们也经常按照接口向上塑型,即把对象的类型转换为其实现的某个接口,比如我们重写 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Client.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + Printer sp = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + + sp.print(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,通过向上塑型为父类对象或者接口类型,实际上我们获得了一个“受限”的对象引用,即这个对象引用只能访问原对象的部分属性和方法,一定程度上提高了程序的安全性 +和健壮性:尽量少的对外暴露调用接口。这也符合面向对象编程的封装 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +封装 +\end_layout + +\end_inset + +原则。 +\end_layout + +\begin_layout Subsection +对象的类型 +\end_layout + +\begin_layout Standard +讨论如下的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class SmartPrinter extends BasePrinter implements Printer, Copier + { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +那么以下的用法都是合法的: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +SmartPrinter sp = new SmartPrinter(); +\end_layout + +\begin_layout Plain Layout + +BasePrinter sp = new SmartPrinter(); // 向上塑型为父类对象 +\end_layout + +\begin_layout Plain Layout + +Printer sp = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + +Copier = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + +Object sp = new SmartPrinter(); // Object是所有类的父类 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +一个对象可以有多少种类型?试举例说明。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +此话题说清楚有难度,手头资料似乎不够 +\end_layout + +\begin_layout Plain Layout +子类(subtyping)是面向对象编程的重要概念, +\end_layout + +\begin_layout Definition +子类替换原则 +\begin_inset CommandInset citation +LatexCommand cite +after "2.1" +key "java-generics-collections" +literal "true" + +\end_inset + +是指,凡是我们期望一个对象的时候,都可以使用这个对象的子类对象来替代。 +\end_layout + +\begin_layout Definition +子类替换有两种常见情形: +\end_layout + +\begin_layout Enumerate +使用子类赋值 +\end_layout + +\begin_layout Enumerate +使用子类替换参数 +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture6.lyx b/guide/lecture_guide/lecture6.lyx new file mode 100644 index 0000000..071f40a --- /dev/null +++ b/guide/lecture_guide/lecture6.lyx @@ -0,0 +1,3415 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +coderemarks +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第六次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:多态" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:多态" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:向上塑型:面向接口的编程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:向上塑型:面向接口的编程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +多态的概念和用法; +\end_layout + +\begin_layout Enumerate +面向接口编程的思想; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +多态的实现方法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +了解多态的概念和用法,知晓将来的复杂工程实现中多态是一种常见的形态; +\end_layout + +\begin_layout Enumerate +建立面向接口编程的基本思想和态度,逐步培养面向接口编程的素质和能力; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +为什么面向接口编程更加安全? +\end_layout + +\begin_layout Enumerate +在工程实践中,使用抽象类属于面向接口编程吗? +\end_layout + +\begin_layout Enumerate +\begin_inset CommandInset ref +LatexCommand vref +reference "exer:一个对象可以有多少种类型?试举例说明。" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +面向对象工程思想 +\end_layout + +\begin_layout Standard +不想当将军的士兵不是好士兵,不想当架构师的程序员不是一个好程序员。本章内容不可能涵盖Java架构师的所有内容,只是一个菜鸟Java程序员进阶的必由之路。 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/programmer-steps.eps + lyxscale 50 + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Section +抽象类和抽象方法 +\begin_inset CommandInset label +LatexCommand label +name "sec:抽象类和抽象方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +在类的继承关系中,有些情况下我们不希望根据父类创建对象,或者说希望 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +禁止创建父类对象 +\end_layout + +\end_inset + +。比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Animal的类层次关系" + +\end_inset + +所示的情形。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-polymorphism.eps + width 70col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Animal的类层次关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Animal的类层次关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果我们希望禁止创建Animal对象 +\begin_inset Foot +status open + +\begin_layout Plain Layout +为什么有这种需求呢?主要的出发点是强制使用具体的子类对象,因为子类对象比父类对象提供了更具体的属性和方法。 +\end_layout + +\end_inset + +,即只允许创建Dog、Cat等Animal的子类对象,该怎么做呢?Java提供了两种方式: +\end_layout + +\begin_layout Enumerate +使用抽象类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抽象类 +\end_layout + +\end_inset + +:将Animal定义为抽象类,这样使用new创建Animal对象将导致语法错误,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:抽象类" + +\end_inset + +。 +\end_layout + +\begin_layout Enumerate +使用接口 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +:将Animal定义为接口,这样便不能直接创建Animal类型的对象,只能通过实现Animal接口创建具体的对象,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:接口" + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +抽象类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:抽象类" + +\end_inset + + +\end_layout + +\begin_layout Standard +只要一个类使用 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +abstract +\end_layout + +\end_inset + +abstract修饰,这个类就是一个抽象类。抽象类不允许通过new操作符创建对象,抽象类只能作为父类被继承。 +\end_layout + +\begin_layout Example +编写一个抽象的Animal类 +\begin_inset CommandInset label +LatexCommand label +name "exa:编写一个抽象的Animal类。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Dog.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "abstractclass-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Animal.java" +lstparams "float,caption={Animal.java},label={abstractclass-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Dog.java" +lstparams "float,caption={Dog.java},label={abstractclass-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractclass/Client.java" +lstparams "float,caption={Client.java},label={abstractclass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +抽象类是不允许直接实例化 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +实例化 +\end_layout + +\end_inset + +的,因此在Client中直接创建Animal类型的对象会报告语法错误。虽然Dog类看起来是一个空的类,但是Dog继承自Animal,因此也继承了Animal中已 +经实现了的公有的hello方法。 +\end_layout + +\begin_layout Subsection +抽象方法 +\end_layout + +\begin_layout Standard +有的时候,我们希望父类的方法仅仅是个声明,即只是说明了方法的名字、返回值类型、参数的类型和个数及其顺序,方法的具体内容(即方法体)需要父类的子类去实现。也就是说 +,父类的这个方法是“抽象”的,因为缺少了方法体,直接调用这个抽象的方法也没有意义,因此Java规定只要类中有一个抽象方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抽象方法 +\end_layout + +\end_inset + +,这个类就必须定义为抽象类。子类在继承抽象类后,必须实现父类中的所有抽象方法,除非该子类也是抽象类。 +\end_layout + +\begin_layout Example +实现一个包含抽象方法的抽象类。 +\begin_inset CommandInset label +LatexCommand label +name "exa:实现一个包含抽象方法的抽象类。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "abstractmethod-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "abstractmethod-Dog.java" + +\end_inset + +,Client的设计和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:编写一个抽象的Animal类。" + +\end_inset + +一样,这里不再列出。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractmethod/Animal.java" +lstparams "float,caption={Animal.java},label={abstractmethod-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/abstractmethod/Dog.java" +lstparams "float,caption={Dog.java},label={abstractmethod-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,父类中的抽象方法hello在子类中必须给出具体的实现。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea中,如果没有实现父类中的抽象方法,在类名上面会给出提示信息,此时只要在类名上面按Alt+Enter键组合即可自动给出默认的方法实现,非常方便: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/abstract-method-hint.png + width 60col% + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +如果Dog类也是抽象类,一定需要实现父类Animal中的抽象方法吗?试修改 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:实现一个包含抽象方法的抽象类。" + +\end_inset + +的Dog为抽象类,然后增加一个Hunter类作为Dog的子类。 +\end_layout + +\begin_layout Subsection +抽象类小结 +\end_layout + +\begin_layout Standard +抽象类是系统架构的常见手段,有两个重要的作用: +\end_layout + +\begin_layout Itemize +强制继承,不允许实例化父类,即必须提供子类才能使用抽象父类的属性和功能。 +\end_layout + +\begin_layout Itemize +便于合理划分(区分)事物的共性和个性,将个性化的部分设计为抽象方法,强制子类实现父类的抽象方法,同时子类中的这些方法其名称、参数和返回值也会受到抽象父类的约束, +这在系统架构和团队合作中显得尤为重要。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +要讨论抽象类和多态吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +接口 +\begin_inset CommandInset label +LatexCommand label +name "sec:接口" + +\end_inset + + +\end_layout + +\begin_layout Subsection +定义接口:纯的抽象类 +\end_layout + +\begin_layout Standard +如果抽象类中所有的方法都是抽象方法会怎样?比如下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public abstract class Animal { +\end_layout + +\begin_layout Plain Layout + + public abstract void hello(); +\end_layout + +\begin_layout Plain Layout + + public abstract void eat(); +\end_layout + +\begin_layout Plain Layout + + public abstract void sleep(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,此时的Animal是一个纯抽象类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +纯抽象类 +\end_layout + +\end_inset + +,Java提供了interface( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +接口)来表达纯的抽象类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "interface-Animal.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Animal.java" +lstparams "float,caption={Animal.java},label={interface-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + +接口具有如下的特点: +\end_layout + +\begin_layout Itemize +接口一定是抽象的,因此接口类不需要明确声明是抽象的。即,在定义接口时,下面的两种方式都是可以的,一般采用省略abstract的写法。 +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public abstract interface Animal{...} +\end_layout + +\begin_layout Plain Layout + +public interface Animal {} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +接口中的方法一定是public的,所以可以省略接口方法的访问控制属性。实际上,在接口方法上使用private或者protected是语法错误,比如尝试在接口方法 +上增加protected: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public interface Animal { +\end_layout + +\begin_layout Plain Layout + + // 语法错误! +\end_layout + +\begin_layout Plain Layout + + protected void hello(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +正因为接口的以上两个特点,可以认为 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +接口是对“纯的抽象类”的简化写法 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +实现接口 +\end_layout + +\begin_layout Standard +接口虽然很像“纯的抽象类”,但是其用法和用意和抽象类有很多不同,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:抽象类和接口的关系" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抽象类 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +接口 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +意义 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +概括了一类事物的共同属性和行为特征 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +概括了一类事物的共同行为特征 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法的实现 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +可以实现部分方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +只能声明方法,不允许实现方法 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +使用场合 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于明确类的层次关系 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于明确类的能力范围 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +用法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +子类通过extends继承父类 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +通过implements实现指定的接口 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抽象类和接口的关系 +\begin_inset CommandInset label +LatexCommand label +name "tab:抽象类和接口的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +将Animal定义为接口,Dog类实现Animal接口。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "interface-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "pureabstract-Dog.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "pureabstract-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Dog.java" +lstparams "float,caption={Dog.java},label={pureabstract-Dog.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/pureabstract/Client.java" +lstparams "float,caption={Client.java},label={pureabstract-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\begin_layout Plain Layout +Dog eat method +\end_layout + +\begin_layout Plain Layout +Dog sleep method +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +Dog类实现了Animal接口即意味着Dog类要给出Animal接口中规定的所有抽象方法的具体实现。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +和实现抽象方法类似,在Idea中,通过快捷键Alt+Enter可自动补全接口的方法,不再赘述。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +实现多个接口 +\begin_inset CommandInset label +LatexCommand label +name "subsec:实现多个接口" + +\end_inset + + +\end_layout + +\begin_layout Standard +对于抽象类,我们知道需要子类继承抽象的父类并实现父类中的所有抽象方法。但是,Java只支持单继承,即一个子类只能继承自一个抽象类。接口则不同, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +一个类可以“实现”若干个接口 +\end_layout + +\end_inset + +,这也是接口的强大之处。 +\end_layout + +\begin_layout Standard +现实中,事物总是具有多面性的,比如爱因斯坦不仅仅是物理学家,小提琴也拉的很好。比如大家对毛泽东的评价是伟大的思想家、哲学家、军事家、诗人。通常,我们会把一类事物 +的共同行为特征归纳为一个接口,那么具有多面性的事物,应该可以拥有多个接口才对,或者说,具有多面性的事物,应该实现多个接口。 +\end_layout + +\begin_layout Example +实现多个接口的类。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要画出类的UML类图 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Printer.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Copier.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-SmartPrinter.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Client.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Printer.java" +lstparams "float,caption={Printer.java},label={multiinterface-Printer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Copier.java" +lstparams "float,caption={Copier.java},label={multiinterface-Copier.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/SmartPrinter.java" +lstparams "float,caption={SmartPrinter.java},label={multiinterface-SmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/Client.java" +lstparams "float,caption={Client.java},label={multiinterface-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行Client结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +print called +\end_layout + +\begin_layout Plain Layout +copy called +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +SmartPrinter实现了两个接口Printer和Copier,也就意味着SmartPrinter同时具有打印和复印两项功能。有人说,这不是多此一举吗?去掉 +两个接口的定义,在SmartPrinter类中直接实现copy和print方法就可以。从功能上看,的确可以这样处理,但是从逻辑上看,不使用接口会带来两个方面的问 +题: +\end_layout + +\begin_layout Itemize +Print和Copy两个接口定义了功能方法的名称和参数,如果不使用接口,或者不实现规定的接口,那么方法名就失去了参照,很容易造成各自为政的局面,给代码的维护和团 +队的交流带来麻烦。 +\end_layout + +\begin_layout Itemize +使用接口带来的另外一个好处是,我们可以通过“向上塑型 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +向上塑型 +\end_layout + +\end_inset + +”加强软件的健壮性,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:向上塑型:面向接口的编程" + +\end_inset + +展示这一点。 +\end_layout + +\begin_layout Standard +基于以上的分析,其实SmartPrinter的更合理的实现应该是 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-BetterSmartPrinter.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/multiinterface/BetterSmartPrinter.java" +lstparams "float,caption={BetterSmartPrinter.java},label={multiinterface-BetterSmartPrinter.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,通过内部类的封装,BetterSmartPrinter类的内部结构更清晰了。 +\end_layout + +\begin_layout Subsection +抽象类和接口的区别 +\end_layout + +\begin_layout Standard +抽象类和接口是从不同的方向来分析和看待事物—抽象类是纵向分析,接口是横向分析。如 +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:抽象类和接口的区别" + +\end_inset + +所示,纵向来看,Bus类描述了公交车的公共属性和方法,Classroom类描述了教室的公共属性和方法。但是在Bus和Classroom类中,某些方法是公共的,比 +如都提供Wifi接入服务和休息座椅,这些在不同事物中的公共方法,横向(切片)来看就是接口的意义。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/oop-project-method/abstract-class-interface.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抽象类和接口的区别 +\begin_inset CommandInset label +LatexCommand label +name "fig:抽象类和接口的区别" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +试根据 +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:抽象类和接口的区别" + +\end_inset + +编写相应的Bus、Classroom类和接口Wifi、Seat。 +\begin_inset CommandInset label +LatexCommand label +name "exer:试根据编写相应的Bus、Classroom类和接口Wifi、Se" + +\end_inset + +(参见: +\begin_inset CommandInset ref +LatexCommand vref +reference "solu:abstract class and interface" + +\end_inset + +) +\end_layout + +\begin_layout Subsection +接口中的常量 +\end_layout + +\begin_layout Standard +接口中除了抽象方法外,也可以持有常量,这也是一种常见的情形。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要进一步解释为什么常量是常见情形?JDK中的例子找出来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +但是,接口中不允许持有变量。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要进一步解释为什么? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +接口的继承 +\end_layout + +\begin_layout Standard +接口是“纯的抽象类”,因此接口和其他类一样,也可以实现继承关系,即接口的继承和类的继承有相同的语法和限制,不再赘述。 +\end_layout + +\begin_layout Subsection +接口中的默认方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +自JDK8开始支持此特性。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +TBD +\begin_inset Note Note +status open + +\begin_layout Plain Layout +可以参考:http://www.cnblogs.com/guangshan/p/4889732.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +不懂接口的项目经理不是好的项目经理 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:实现多个接口" + +\end_inset + +中我们已经看到,通过接口可以帮助我们规划模块的调用界面(界限),这在团队协作中非常重要,也就是说,接口为团队协作提供了有力的语法支持,考虑下面的情形: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/no-interface.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +不引入接口时的团队协作 +\begin_inset CommandInset label +LatexCommand label +name "fig:不引入接口时的团队协作" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果不使用接口,团队成员在功能实现时,在方法命名和方法规划上就失去了约束,这在小型项目中也许还是可以接受的,但是随着项目规模的增大,项目成员的增加和更迭,这种没 +有约束的编码方式很容易把项目带到沟里,最终失去控制,导致项目失败。因此,作为 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +项目经理 +\end_layout + +\end_inset + +项目经理或者项目的架构师 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +架构师 +\end_layout + +\end_inset + +,接口是一个有力的工具,在项目之初可以通过定义一系列接口的方式规定模块功能和模块之间的交互界面,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:引入接口后的团队协作" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/with-interface.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +引入接口后的团队协作 +\begin_inset CommandInset label +LatexCommand label +name "fig:引入接口后的团队协作" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +分别实现 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:不引入接口时的团队协作" + +\end_inset + +所示的代码和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:引入接口后的团队协作" + +\end_inset + +所示的代码,认真体会接口在团队协作中的作用。 +\end_layout + +\begin_layout Subsection +接口上的匿名内部类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:接口上的匿名内部类" + +\end_inset + + +\end_layout + +\begin_layout Standard +如果我们确定一个对象只临时使用一次,那么这个对象通常可以采用匿名内部类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +匿名内部类 +\end_layout + +\end_inset + +的方式来实现,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:匿名内部类" + +\end_inset + +。如果这个临时的对象只是实现了某个接口,那么代码还可以进一步简化,直接可以使用“接口上的匿名类”技术来实现,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "annoymousInnerClass-Client.java" + +\end_inset + +所示(Printer接口和Copier接口不变,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Printer.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Copier.java" + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/annoymousinnerclass/Client.java" +lstparams "float,caption={Client.java},label={annoymousInnerClass-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Section +多态 +\begin_inset CommandInset label +LatexCommand label +name "sec:多态" + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +多态 +\end_layout + +\end_inset + +多态,是指对象在不同阶段或者环境下有不同的行为特征,听起来是不是有点“变色龙”的味道? +\end_layout + +\begin_layout Standard +先看一个实例,假设有如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Animal的类层次关系" + +\end_inset + +所示的类层次结构,也就是说,父类Animal有默认的hello()方法,三个子类Dog,Cat,Duke分别重写(overriding)了父类Animal的方法 +hello()。代码实现如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Animal.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Dog.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Cat.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-Duke.java" + +\end_inset + +、 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-TestAnimal.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Animal.java" +lstparams "float,caption={Animal.java},label={ploymorphism-Animal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Dog.java" +lstparams "float,caption={Dog.java},label={ploymorphism-Dog.java}" + +\end_inset + + +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Cat.java" +lstparams "float,caption={Cat.java},label={ploymorphism-Cat.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/Duke.java" +lstparams "float,caption={Duke.java},label={ploymorphism-Duke.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/oopm/src/cn/edu/sdut/softlab/oopm/polymorphism/TestAnimal.java" +lstparams "float,caption={TestAnimal.java},label={ploymorphism-TestAnimal.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在TestAnimal中,animals数组的每个元素是Animal类型的,貌似调用animal数组元素的hello方法应该打印出“动物在打招呼”,但是执行Te +stAnimal会发现输出结果是: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +汪汪 +\end_layout + +\begin_layout Plain Layout +喵喵 +\end_layout + +\begin_layout Plain Layout +嘎嘎 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,虽然我们调用的是父类对象的方法,但是其实真正执行的却是子类中的方法,这就是 +\begin_inset Flex Noun +status open + +\begin_layout Plain Layout +多态 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +多态 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。简单的说,多态是指:父类对象调用子类方法。 但是,同一个对象,在不同的运行时间,怎么会有不同的行为呢?这一点是如何做到的?先从对象的存储模型说起。 +\end_layout + +\begin_layout Subsection +对象的概念存储模型 +\begin_inset CommandInset label +LatexCommand label +name "subsec:对象的存储模型" + +\end_inset + + +\end_layout + +\begin_layout Standard +在上面的例子中,Dog、Cat、Duke类的对象在内存中是如何存储的呢?比如当Dog dog = new Dog()创建了一个Dog类的实例,则在内存中的存储如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java对象在内存中的存储模型" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +提请读者注意的是,为了简化问题的描述和避免过多的底层细节,本节的对象存储模型仅仅为了大家理解方便,并非对象在内存的真实存储情形。更多的细节请读者参考Java虚拟 +机规范 +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-se8-specification" +literal "true" + +\end_inset + +,推荐阅读《深入理解Java虚拟机》 +\begin_inset CommandInset citation +LatexCommand cite +key "jvm-advanced-feature" +literal "true" + +\end_inset + +一书。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "50line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage.eps + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java对象在内存中的存储模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java对象在内存中的存储模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其中,dog是对象的引用,即指针,指向对象在内存的起始地址。对象在内存中的存储分为两个部分:父类的属性和方法存储区域以及子类的属性和方法存储区域,也就是说,子类 +完全包含了父类的所有信息。因此可以看出,我们得到了一个指向子类的引用dog,这个引用dog即可以访问子类的方法和属性,也可以访问父类的方法和属性,无非是通过do +g指针不同的偏移量指向不同的区域而已。 +\end_layout + +\begin_layout Standard +那么Animal dog = new Dog()是什么意思呢?从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java对象在内存中的存储模型" + +\end_inset + +可以看出,此时的dog指针仍然是指向整个Dog对象的指针,但是指针的范围却局限于父类Animal的区域,也就是说,此时的dog指针只能调用父类Animal中的属 +性和方法,而不能调用Dog子类扩展了的属性和方法。 +\end_layout + +\begin_layout Standard +如果子类没有重写 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +重写 +\end_layout + +\end_inset + +(orverriding)父类的方法,子类和父类的存储是泾渭分明的。如果子类重写(orverriding)了父类中的方法,那么父类中被重写的方法同样会发生变化, +即变的和子类中重写的方法一模一样,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:存在重写情况下的类存储结构" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这样的讲述是有问题的,试想super.hello()方法的调用过程? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage1.eps + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +存在重写情况下的类存储结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:存在重写情况下的类存储结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,当子类重写了父类中的方法时,父类存储区域中被重写的方法就变得和子类中的方法一模一样了,这样就能够理解本文刚开始的例子了:虽然animals数组的元素都 +是Animal类型的对象,但是由于这三个引用分别指向了Dog、Cat、Duke的对象,而Dog等对象重写了Animal中的hello方法,致使我们虽然调用的是父 +类中的方法,但是由于子类重写了父类中的这个方法,父类中的这个方法变得和子类中的方法一模一样了(即所谓的overriding,重写),最终的效果和直接调用子类中的 +方法一样,这就是Java中的多态,其实也是我们期望发生的事情。 +\end_layout + +\begin_layout Subsection +方法重载时的情形 +\end_layout + +\begin_layout Standard +在上例中,如果子类不是重写(overriding)父类的方法,而是 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +重载 +\end_layout + +\end_inset + +重载(overloading)父类的方法,结果会怎样呢?比如,Cat类的hello方法改为(Dog/Duke以此类推): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void hello(String name){ +\end_layout + +\begin_layout Plain Layout + + System.out.println("喵喵" + name); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,Cat类的hello方法重载了父类的hello方法。执行TestAnimal的结果是: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\begin_layout Plain Layout +动物在打招呼 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +根据 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:存在重载情况的类存储结构" + +\end_inset + +可自行分析执行结果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/oop-project-method/java-instance-storage2.eps + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +存在重载情况的类存储结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:存在重载情况的类存储结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +多态的小结 +\end_layout + +\begin_layout Standard +可以看出,Java的多态是一种“动态绑定”技术,即在运行时决定调用哪个方法。多态的使用需要满足三个条件: +\end_layout + +\begin_layout Enumerate +继承 +\end_layout + +\begin_layout Enumerate +重写 +\end_layout + +\begin_layout Enumerate +父类引用指向子类对象 +\end_layout + +\begin_layout Subsection +多态的应用场合 +\end_layout + +\begin_layout Standard +从以上的分析可以看出,通常会利用方法的重写来达到简化代码的目的,即充分利用Java的多态特性。也就是说,在多态的帮助下,我们只需要调用父类的方法就可以了,具体执 +行的却是子类的对应方法。当然,这里有一个前提,即必须使用子类创建对象的引用,否则多态也就失效了。 +\end_layout + +\begin_layout Exercise +请说明实现Java多态的关键是什么? +\end_layout + +\begin_layout Section +*向上塑型:面向接口的编程 +\begin_inset CommandInset label +LatexCommand label +name "sec:向上塑型:面向接口的编程" + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:对象的存储模型" + +\end_inset + +可以看出,子类对象拥有父类对象的所有属性和方法(当然,在访问控制的限制下),反过来说,父类对象的属性和方法是子类对象的一个子集,因此把子类对象转换为一个父类对象 +是安全的,也就是说,如果我们持有一个子类对象的引用,可以安全的把这个引用转换为父类对象的引用,因为通过这个父类对象的引用,我们访问任何属性和方法都是“可达”的, +都不会引起任何错误。 +\end_layout + +\begin_layout Standard +但是反过来是不可行的,即把父类对象转换为子类对象。原因很简单,转换后的子类对象引用仍然指向了父类对象,但是却可能试图访问超出了父类对象范围的属性和方法,显然是不 +允许的。 +\end_layout + +\begin_layout Standard +这就是Java中的“向上塑型 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +向上塑型 +\end_layout + +\end_inset + +”,即对象的引用可以向父类的方向转换,但是不允许向子类的方向转换。在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ploymorphism-TestAnimal.java" + +\end_inset + +中,我们已经看到了向上塑型的应用,可以说,向上塑型是Java多态的的基本形态。 +\end_layout + +\begin_layout Standard +在编程实践中,我们也经常按照接口向上塑型,即把对象的类型转换为其实现的某个接口,比如我们重写 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "multiinterface-Client.java" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + Printer sp = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + + sp.print(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,通过向上塑型为父类对象或者接口类型,实际上我们获得了一个“受限”的对象引用,即这个对象引用只能访问原对象的部分属性和方法,一定程度上提高了程序的安全性 +和健壮性:尽量少的对外暴露调用接口。这也符合面向对象编程的封装 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +封装 +\end_layout + +\end_inset + +原则。 +\end_layout + +\begin_layout Subsection +对象的类型 +\end_layout + +\begin_layout Standard +讨论如下的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class SmartPrinter extends BasePrinter implements Printer, Copier + { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +那么以下的用法都是合法的: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +SmartPrinter sp = new SmartPrinter(); +\end_layout + +\begin_layout Plain Layout + +BasePrinter sp = new SmartPrinter(); // 向上塑型为父类对象 +\end_layout + +\begin_layout Plain Layout + +Printer sp = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + +Copier = new SmartPrinter(); // 向上塑型为接口类型 +\end_layout + +\begin_layout Plain Layout + +Object sp = new SmartPrinter(); // Object是所有类的父类 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +一个对象可以有多少种类型?试举例说明。 +\begin_inset CommandInset label +LatexCommand label +name "exer:一个对象可以有多少种类型?试举例说明。" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +此话题说清楚有难度,手头资料似乎不够 +\end_layout + +\begin_layout Plain Layout +子类(subtyping)是面向对象编程的重要概念, +\end_layout + +\begin_layout Definition +子类替换原则 +\begin_inset CommandInset citation +LatexCommand cite +after "2.1" +key "java-generics-collections" +literal "true" + +\end_inset + +是指,凡是我们期望一个对象的时候,都可以使用这个对象的子类对象来替代。 +\end_layout + +\begin_layout Definition +子类替换有两种常见情形: +\end_layout + +\begin_layout Enumerate +使用子类赋值 +\end_layout + +\begin_layout Enumerate +使用子类替换参数 +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture7.lyx b/guide/lecture_guide/lecture7.lyx new file mode 100644 index 0000000..7e649d8 --- /dev/null +++ b/guide/lecture_guide/lecture7.lyx @@ -0,0 +1,7179 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +note-inset +tip-inset +warning-inset +theorems-bytype +theorems-chap-bytype +coderemarks +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第七次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:字符串处理" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:字符串处理" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:数字类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:数字类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:日期和时间类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:日期和时间类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +字符串类String的构造方法和各种类方法; +\end_layout + +\begin_layout Enumerate +字符串、数字和数字包裹类的转换关系; +\end_layout + +\begin_layout Enumerate +日期、时间的表示方法和处理方法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +字符串、数字和数字包裹类的转换关系 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握String类的常见构造方法和字符串的处理方法; +\end_layout + +\begin_layout Enumerate +熟练掌握字符串、数字和数字包裹类的相互转换方法; +\end_layout + +\begin_layout Enumerate +了解日期、时间相应的API。 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +String是Java的基本数据类型吗? +\end_layout + +\begin_layout Enumerate +字符串、数字和数字包裹类的相互转换有什么规律可循? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +Java的常用类 +\begin_inset CommandInset label +LatexCommand label +name "chap:Java的常用类" + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/essentail-classes/essentail-classes.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Section +字符串类 +\begin_inset CommandInset label +LatexCommand label +name "sec:字符串处理" + +\end_inset + + +\end_layout + +\begin_layout Standard +字符和字符串是程序设计中最常见的数据类型了。在C语言中只有字符类型,字符串需要通过字符数组或者指向字符的指针来表达,而Java直接提供了String类 +\begin_inset Foot +status open + +\begin_layout Plain Layout +建议将JDK API的文档常置手边,方便查询。JDK9以后,本教程中涉及到的API转移到了java.base模块中,相应的在线文档为(以Java9为例,更新的版本 +只需要将其中的数字9替换为更新的版本号即可): +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://docs.oracle.com/javase/9/docs/api/java.base-summary.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +来表示字符串,对字符串的处理就方便多了。 +\end_layout + +\begin_layout Subsection +字符串对象的定义和初始化 +\end_layout + +\begin_layout Standard +创建字符串对象的最简单方法是直接使用双引号初始化字符串: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String hello = "Hello, World!"; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +除此之外,JDK10提供了多达15个构造方法可以用来创建字符串对象 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:http://docs.oracle.com/javase/10/docs/api/java/lang/String.html +\end_layout + +\end_inset + +,在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "essentials-Client.java" + +\end_inset + +中演示了创建字符串对象的常见形式。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/string/Client.java" +lstparams "float,caption={创建字符串对象的几种方法},label={essentials-Client.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +请读者思考以下两种方式创建字符串对象的区别: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String hello = "hello world!"; +\end_layout + +\begin_layout Plain Layout + +String hello = new String("hello, world!"); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第一种方式在内存中只创建了一个字符串对象hello,第二种方式则创建了两个字符串对象:hello和字符串内容为“hello world!”的匿名对象。实际上,双 +引号括起来的字符串一般都会在内存中创建一个匿名对象。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Warning +status open + +\begin_layout Plain Layout +注意双引号和单引号的用法区别:双引号用来表示字符串,单引号用来表示字符,比如: +\end_layout + +\begin_layout Plain Layout +String str = +\begin_inset Quotes eld +\end_inset + +a string +\begin_inset Quotes erd +\end_inset + +;// 一个字符串对象 +\end_layout + +\begin_layout Plain Layout +char c = 'A'; // 一个字符变量 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +常见字符串处理方法 +\end_layout + +\begin_layout Subsubsection* +求字符串的长度 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +字符串结束符?在这里讲解字符串的不变性? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +获取字符串的长度使用String类提供的length()方法: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String str = "a string"; +\end_layout + +\begin_layout Plain Layout + +System.out.println(str.length()); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +length方法返回的字符串长度不包括“字符串结束符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +字符串结束符 +\end_layout + +\end_inset + +” +\begin_inset Foot +status open + +\begin_layout Plain Layout +在C语言中,每个字符串都有一个字符串结束符,即' +\backslash +0',在计算字符串的长度时不包括字符串结束符。 +\end_layout + +\end_inset + +,因此上面的代码片段输出结果为8。 +\end_layout + +\begin_layout Subsubsection* +截取字符串 +\end_layout + +\begin_layout Standard +如果把字符串看做字符的有序序列,那么我们可以任意截取这个字符序列的一小段,String类提供了substring方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "SubStringTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/string/SubStringTest.java" +lstparams "float,caption={SubStringTest.java},label={SubStringTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +一个常见的任务是去掉字符串开头或者末尾的某个特殊字符,比如字符串 +\begin_inset Quotes eld +\end_inset + +zhangsan,lisi, +\begin_inset Quotes erd +\end_inset + +,我们希望去掉最后的逗号变成 +\begin_inset Quotes erd +\end_inset + +zhagnsan,lisi +\begin_inset Quotes erd +\end_inset + +,可以使用下面的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String str = "zhangsan,lisi,"; +\end_layout + +\begin_layout Plain Layout + +System.out.println(str.substring(0,str.length() - 1)); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意到,substring方法中,开始字符串的索引和结束字符串的索引都是从0开始的。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +如果仅仅是去掉字符串两端的空白字符(包括空格、回车、Tab),则可以使用String提供的trim()方法,这在WEB开发中很常见:用户从浏览器输入的表单中输入 +的字符串一般需要使用trim处理一下,去掉用户无意中输入的空白字符。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +分割字符串 +\begin_inset CommandInset label +LatexCommand label +name "subsec:分割字符串" + +\end_inset + + +\end_layout + +\begin_layout Standard +有的字符串存在明显的分隔符,比如linux的passwd文件,使用“:”隔开了各个区域: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +root:x:0:0:root:/root:/bin/bash +\end_layout + +\begin_layout Plain Layout +daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin +\end_layout + +\begin_layout Plain Layout +bin:x:2:2:bin:/bin:/usr/sbin/nologin +\end_layout + +\begin_layout Plain Layout +sys:x:3:3:sys:/dev:/usr/sbin/nologin +\end_layout + +\begin_layout Plain Layout +sync:x:4:65534:sync:/bin:/bin/sync +\end_layout + +\begin_layout Plain Layout +games:x:5:60:games:/usr/games:/usr/sbin/nologin +\end_layout + +\begin_layout Plain Layout +man:x:6:12:man:/var/cache/man:/usr/sbin/nologin +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如何方便的把这类字符串解析为一个字符串数组呢?String提供了方便的split方法: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + String str = "root:x:0:0:root:/root:/bin/bash"; +\end_layout + +\begin_layout Plain Layout + + String[] result = str.split(":"); +\end_layout + +\begin_layout Plain Layout + + for (String s : result) { +\end_layout + +\begin_layout Plain Layout + + System.out.println(s); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到,split方法的参数不仅仅可以是一个简单的字符串,还可以是一个正则表达式 +\begin_inset Foot +status open + +\begin_layout Plain Layout +详情请参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://docs.oracle.com/javase/tutorial/essential/regex/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,能够处理复杂的字符串分割的情形。 +\end_layout + +\begin_layout Exercise +编写一个程序,解析Linux的passwd文件,输出用户名和该用户的登录shell。(关于如何打开文件请参阅 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "chap:Java的IO" + +\end_inset + +)。 +\end_layout + +\begin_layout Subsubsection* +拼接字符串 +\begin_inset CommandInset label +LatexCommand label +name "subsec:拼接字符串" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java中拼接两个字符串的方法有以下几种: +\end_layout + +\begin_layout Itemize +重载 +\begin_inset Quotes erd +\end_inset + ++ +\begin_inset Quotes erd +\end_inset + +运算符:Java重载了 +\begin_inset Quotes erd +\end_inset + ++ +\begin_inset Quotes erd +\end_inset + +运算符,允许直接将两个字符串首尾连接起来。注意到如果“+”的两个操作数只要任一个是字符串,另外一个操作数都会自动转换为字符串形式,比如下面的代码片段: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String str = "Java " + "cool!"; +\end_layout + +\begin_layout Plain Layout + +int a = 10; +\end_layout + +\begin_layout Plain Layout + +System.out.println("variable a=" + a); // 打印出:variable a=10 +\end_layout + +\begin_layout Plain Layout + +String str2 = a + ""; // 简单的方法把数字a转化为字符串"10" +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用String的concat方法可以达到和使用+同样的效果,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +"java".concat(" language"); //返回 java language +\end_layout + +\begin_layout Plain Layout + +"java".concat(" programming").concat(" language");// 返回java programming language +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用String的join方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +这是一个类方法(静态方法) +\end_layout + +\end_inset + +,这个方法是split方法的“反方法”,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +String message = String.join("-", "Java", "is", "cool"); +\end_layout + +\begin_layout Plain Layout + +// message returned is: "Java-is-cool" +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +StringBuilder类提供了高效处理字符串的功能,通常涉及到大量字符串拼接时,建议使用StringBuilder来完成 +\begin_inset Foot +status open + +\begin_layout Plain Layout +其实当使用“+”连接多个字符串时,最终经过编译后也是通过StringBuilder来完成的。但是为什么说直接使用“+”连接多个字符串的效率不高呢?这涉及到Jav +a的内存回收机制,这里不展开阐述,详情可参见本系列教程的提高篇:性能调整。 +\end_layout + +\end_inset + +: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +StringBuilder sb = new StringBuilder(); +\end_layout + +\begin_layout Plain Layout + +sb.append("Java"); +\end_layout + +\begin_layout Plain Layout + +sb.append("is cool!"); +\end_layout + +\begin_layout Plain Layout + +String str = sb.toString(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +另外一个和StringBuilder功能类似的类是StringBuffer。StringBuilder和StringBuffer的最大区别是StringBuff +er是线程 +\begin_inset Foot +status open + +\begin_layout Plain Layout +关于线程的概念和用法,请参见本系列教程的提高篇:多线程Java程序设计。 +\end_layout + +\end_inset + +安全的,即StringBuffer可以安全的用于多线程环境。StringBuilder不是线程安全的,因此只能用于单线程环境。由此也可以知道,StringBui +lder的效率要比StringBuffer高一些。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +查找(匹配)字符串 +\begin_inset CommandInset label +LatexCommand label +name "subsec:查找(匹配)字符串" + +\end_inset + + +\end_layout + +\begin_layout Standard +分为以下几种情形: +\end_layout + +\begin_layout Itemize +检查是否以特定字符串开头的startsWith +\end_layout + +\begin_layout Itemize +检查是否以特定字符串结尾的endsWith +\end_layout + +\begin_layout Itemize +检查是否包含特定字符串的contains +\end_layout + +\begin_layout Itemize +检查字符串是否满足正则表达式的matches +\end_layout + +\begin_layout Example +综合示例String的字符串匹配方法 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "StringMatch.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/string/StringMatchTest.java" +lstparams "float,caption={StringMatch.java},label={StringMatch.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +这里尤其要注意matches方法,其参数是一个正则表达式 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +由于本书没有讲述正则表达式,这里仅仅提及,将来可以补充一个交叉链接进来 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Subsubsection* +其他字符串处理方法 +\end_layout + +\begin_layout Standard +JDK的String类提供了丰富的字符串处理功能,除了上面介绍的常见方法外,还有如下的方法也很常用,请大家自行参考 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/8/docs/api/java/lang/String.html +\end_layout + +\end_inset + + 学习: +\end_layout + +\begin_layout Itemize +根据索引提取字符串中的字符:charAt +\end_layout + +\begin_layout Itemize +比较两个字符串:equals +\end_layout + +\begin_layout Itemize +比较两个字符串(忽略大小写)equalsIgnoreCase +\end_layout + +\begin_layout Itemize +判断字符串是否为空:isEmpty +\end_layout + +\begin_layout Itemize +替换字符串:replace +\end_layout + +\begin_layout Itemize +转换大小写:toLowerCase,toUppperCase +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +5.1.3 字符串综合示例 +\end_layout + +\begin_layout Plain Layout +在应用需求中,我们会遇到这样的客户需求,要把账单上的小写数据转换为大写的数据。比如对于 +\begin_inset Quotes erd +\end_inset + +308.7 +\begin_inset Quotes erd +\end_inset + +,我们希望得到的结果是“叁佰零捌元柒角”。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要补充代码 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Plain Layout +暂时没有准备好示例程序 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Java面试中经常遇到的问题:String str = new String( +\begin_inset Quotes eld +\end_inset + +a string +\begin_inset Quotes erd +\end_inset + +)创建了几个字符串对象?答案是2个: +\begin_inset Quotes erd +\end_inset + +a string +\begin_inset Quotes erd +\end_inset + +作为string构造方法的参数本身是一个字符串对象,根据 +\begin_inset Quotes erd +\end_inset + +a string +\begin_inset Quotes erd +\end_inset + +这个字符串使用String的构造方法又创建了一个字符串对象str,因此这一句创建了2个字符串对象。那么String str = +\begin_inset Quotes eld +\end_inset + +a string +\begin_inset Quotes erd +\end_inset + +创建了几个字符串对象呢?显然是1个。因此可以看出,使用new操作符创建字符串对象一般是没有必要的,徒增Java的内存占用而已。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +来自面试真题:试说明下列代码的执行结果: +\begin_inset CommandInset label +LatexCommand label +name "exer:来自面试真题about StringBuffer" + +\end_inset + + +\end_layout + +\begin_layout Exercise +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Lianxi { +\end_layout + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + StringBuffer a = new StringBuffer("a"); +\end_layout + +\begin_layout Plain Layout + + StringBuffer b = new StringBuffer("b"); +\end_layout + +\begin_layout Plain Layout + + append(a,b); +\end_layout + +\begin_layout Plain Layout + + System.out.println(a); +\end_layout + +\begin_layout Plain Layout + + System.out.println(b); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + private static void append(StringBuffer a, StringBuffer b) { +\end_layout + +\begin_layout Plain Layout + + a.append(b); +\end_layout + +\begin_layout Plain Layout + + b = a; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +数字类 +\begin_inset CommandInset label +LatexCommand label +name "sec:数字类" + +\end_inset + + +\end_layout + +\begin_layout Subsection +基本数字类型变量的包裹类 +\end_layout + +\begin_layout Standard +在程序中,当我们用到数字时,一般使用数字的基本数据类型来表达,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +int age = 20; +\end_layout + +\begin_layout Plain Layout + +float money = 23456.5f; +\end_layout + +\begin_layout Plain Layout + +byte mask = 0xff; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如果需要对数字做更深入的处理怎么办呢?Java提供了各种基本数字类型的包裹类 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +包裹类 +\end_layout + +\end_inset + +(Wrapper Class),如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:java中的数字类型包裹类" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +BigDecimal的讲解?放到精度控制中? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/essentail-classes/number-classes.eps + lyxscale 60 + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +java中的数字类型包裹类 +\begin_inset CommandInset label +LatexCommand label +name "fig:java中的数字类型包裹类" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +一般以下情形中,我们需要数字类型的包裹类: +\end_layout + +\begin_layout Itemize +有的方法参数明确声明需要一个数字类型的对象,比如:int toInt(Integer obj) +\begin_inset Note Note +status open + +\begin_layout Plain Layout +从openjdk中找到这样的一个方法 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +使用包裹类中定义的常量,比如MAX_VALUE,MIN_VALUE,SIZE,TYPE等。 +\end_layout + +\begin_layout Itemize +在数字和字符串之间转换或者不同数制之间转换时。 +\end_layout + +\begin_layout Standard +所有Number的子类都实现了的方法如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Number子类的方法列表" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +byte byteValue() +\end_layout + +\begin_layout Plain Layout +short shortValue() +\end_layout + +\begin_layout Plain Layout +int intValue() +\end_layout + +\begin_layout Plain Layout +long longValue() +\end_layout + +\begin_layout Plain Layout +float floatValue() +\end_layout + +\begin_layout Plain Layout +double doubleValue() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回请求的基本数字类型数值,可能存在损失精度情况,比如一个Double类型的对象使用intValue时。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +int compareTo(Byte anotherByte) +\end_layout + +\begin_layout Plain Layout +int compareTo(Double anotherDouble) +\end_layout + +\begin_layout Plain Layout +int compareTo(Float anotherFloat) +\end_layout + +\begin_layout Plain Layout +int compareTo(Integer anotherInteger) +\end_layout + +\begin_layout Plain Layout +int compareTo(Long anotherLong) +\end_layout + +\begin_layout Plain Layout +int compareTo(Short anotherShort) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +数字类型对象的比较,返回值的意义: +\end_layout + +\begin_layout Plain Layout +0:两个数字类型对象代表的数字相等 +\end_layout + +\begin_layout Plain Layout +<0:本数字类型对象小于参数中的数字类型对象 +\end_layout + +\begin_layout Plain Layout +>0:本数字类型对象大于参数中的数字类型对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean equals(Object obj) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +覆盖了Object类的equals方法,仅当两个包裹对象不是Null并且代表的数字相等时返回true。不过有两个例外情况,请参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/8/docs/api/java/lang/Number.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Number子类的方法列表 +\begin_inset CommandInset label +LatexCommand label +name "tab:Number子类的方法列表" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +Number子类的公共方法。 +\begin_inset CommandInset label +LatexCommand label +name "exa:Number子类的公共方法。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WrapperNumberTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/number/WrapperNumberTest.java" +lstparams "float,caption={WrapperNumberTest.java},label={WrapperNumberTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行WrapperNumberTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Integer max value=2147483647 +\end_layout + +\begin_layout Plain Layout +Short max value=32767 +\end_layout + +\begin_layout Plain Layout +Long max value=9223372036854775807 +\end_layout + +\begin_layout Plain Layout +Float max value=3.4028235E38 +\end_layout + +\begin_layout Plain Layout +Double max value=1.7976931348623157E308 +\end_layout + +\begin_layout Plain Layout +byteValue=123 +\end_layout + +\begin_layout Plain Layout +intValue=123 +\end_layout + +\begin_layout Plain Layout +shortValue=123 +\end_layout + +\begin_layout Plain Layout +longValue=123 +\end_layout + +\begin_layout Plain Layout +floatValue=123.45 +\end_layout + +\begin_layout Plain Layout +doubleValue=123.44999694824219 +\end_layout + +\begin_layout Plain Layout +compareTo 123.45f=0 +\end_layout + +\begin_layout Plain Layout +eqauls 123.45f=true +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,从float到byte、int、short、long转换时丢失了精度,在实际编程实践中,要根据具体需求需用合适的xxxValue方法获得相应的基本类型 +数值。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +\begin_inset Index idx +status open + +\begin_layout Plain Layout +自动装箱 +\end_layout + +\end_inset + +自动装箱(autoboxing) +\end_layout + +\end_inset + +和 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +自动拆箱 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +自动拆箱 +\end_layout + +\end_inset + +(unboxing) +\end_layout + +\end_inset + +是指Java编译器自动在基本数据类型和其包裹类之间转换,即在需要一个包裹类的地方,我们只需要给出一个基本类型的数字即可,Java编译器会自动将这个基本类型的数字 +转化为一个相应的包裹类的对象,称为“自动装箱”,相反的过程称为“自动拆箱”。比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WrapperNumberTest.java" + +\end_inset + +中,我们使用自动装箱机制初始化一个Float类型的对象:Float num = 123.45f。 +\end_layout + +\begin_layout Plain Layout +在Java编程实践中建议使用自动装箱和卸箱机制来处理基本数字类型变量和对象之间的转换,简化了代码,也提高了代码的可读性。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +根据 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:Number子类的公共方法。" + +\end_inset + +,请写出其他数字类的公共方法的测试类。 +\end_layout + +\begin_layout Subsection +不同数字类型之间的转换 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Integer、int、字符串之间的相互转换方法" + +\end_inset + +,这里以Integer为例,给出了Integer、int和字符串之间相互转换的方法,其他类型的数值之间的转换类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/essentail-classes/integer-string-Integer.eps + width 95line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Integer、int、字符串之间的相互转换方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:Integer、int、字符串之间的相互转换方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Integer的转换方法" + +\end_inset + +列出了Integer支持的转换方法(全部是 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +类方法 +\end_layout + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static Integer decode(String s) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将字符串转换为整数,可以接收十进制、八进制和十六进制的表示方式。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static int parseInt(String s) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将字符串转换为整数,最常见的使用方式,只接受十进制表示方式。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static int parseInt(String s, int radix) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将字符串转换为整数,radix为进制形式,可以为10,2,8,16。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +String toString() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将数字转换为字符串。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static String toString(int i) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +静态方法,将给定的整数转换为字符串。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static Integer valueOf(int i) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的整数创建一个整数对象。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static Integer valueOf(String s) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的字符串创建一个整数对象。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +static Integer valueOf(String s, int radix) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的字符串和进制形式创建一个整数对象。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Integer的转换方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:Integer的转换方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +演示数字之间的转换。 +\begin_inset CommandInset label +LatexCommand label +name "exa:演示数字之间的转换。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "NumberTest.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/number/NumberTest.java" +lstparams "float,caption={NumberTest.java},label={NumberTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行NumberTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +10 +\end_layout + +\begin_layout Plain Layout +16 +\end_layout + +\begin_layout Plain Layout +8 +\end_layout + +\begin_layout Plain Layout +123 +\end_layout + +\begin_layout Plain Layout +num=123 +\end_layout + +\begin_layout Plain Layout +num=123 +\end_layout + +\begin_layout Plain Layout +8 +\end_layout + +\begin_layout Plain Layout +123 +\end_layout + +\begin_layout Plain Layout +123 +\end_layout + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +首先要注意到不同进制数字的表示方式,可以看出,decode方法可以自动判别不同进制的数字字符串并转换为一个整数对象。另外,在将字符串转换为整数时,格式不符的字符 +串会导致Java抛出异常。 +\end_layout + +\begin_layout Exercise +仿照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:演示数字之间的转换。" + +\end_inset + +,写一个Double类型的数字、字符串之间相互转换的测试类DoubleTest.java。 +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +待补充,数字的格式化输出,作为独立的一节 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +*BigDecimal +\end_layout + +\begin_layout Standard +float和double主要是为了科学计算和工程计算而设计的,其数值的表达和计算结果都是一个近似值,比如float和double无法精确的表示0.1(或者10的任 +何负数次方值),因此在需要精确运算的场合不能使用float和double,比如常见的货币计算 +\begin_inset CommandInset citation +LatexCommand cite +after "p190" +key "effective-java" +literal "true" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +例如,假设你现在有¥10.03,花掉了¥4.36,剩下多少钱呢?如果我们用下面的代码片段计算: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +System.out.println(10.03-4.36); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +结果不是你想要的5.67,而是5.669999999999999。 +\end_layout + +\begin_layout Standard +是不是四舍五入就能解决问题呢?我们看下面的问题: +\end_layout + +\begin_layout Standard +假设你有1元,货架上的铅笔标价分别为0.1元、0.2元、0.3元,直到1元。你打算从0.1元/支的开始,每种买一支,直到买不起为止,请问可以买多少支铅笔,找回多少零头? +这个题目似乎可以用下面的简单代码解决: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + double funds = 1.00; +\end_layout + +\begin_layout Plain Layout + + int itemsBought = 0; +\end_layout + +\begin_layout Plain Layout + + for(double price = .10; funds >= price; price += .10) { +\end_layout + +\begin_layout Plain Layout + + funds -= price; +\end_layout + +\begin_layout Plain Layout + + itemsBought++; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + System.out.println(itemsBought + " items bought."); +\end_layout + +\begin_layout Plain Layout + + System.out.println("Charge: ¥" + funds); +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +问题很简单,显然应该可以买4支铅笔,但是当运行这段代码时,其结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +3 items bought. +\end_layout + +\begin_layout Plain Layout +Charge: ¥0.3999999999999999 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +如何正确的解决这个问题呢?或者说,如何精确的表达计算结果呢?答案是使用BigDecimal,或者int、long进行货币运算。使用int、long进行货币运算需 +要我们自己控制金额的放大系数(小数点位置),而BigDecimal则可以帮助我们处理小数点问题,并提供了很多计算功能,比如将上面代码中的double替换为Big +Decimal的后: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + BigDecimal funds = new BigDecimal("1.00"); +\end_layout + +\begin_layout Plain Layout + + final BigDecimal TEN_CENTS = new BigDecimal(".10"); +\end_layout + +\begin_layout Plain Layout + + int itemsBought = 0; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + for (BigDecimal price = TEN_CENTS; +\end_layout + +\begin_layout Plain Layout + + funds.compareTo(price) >= 0; +\end_layout + +\begin_layout Plain Layout + + price = price.add(TEN_CENTS)) { +\end_layout + +\begin_layout Plain Layout + + itemsBought++; +\end_layout + +\begin_layout Plain Layout + + funds = funds.subtract(price); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + System.out.println(itemsBought + " items bought."); +\end_layout + +\begin_layout Plain Layout + + System.out.println("Money left over: ¥" + funds); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +4 items bought. +\end_layout + +\begin_layout Plain Layout +Money left over: ¥0.00 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写一个程序,将买铅笔问题使用int或者long处理。提示:找到货币的最小单位,使用最小单位表示单价和金额。 +\end_layout + +\begin_layout Subsubsection +BigDecimal的常见构造方法 +\end_layout + +\begin_layout Standard +见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:BigDecimal的常见构造方法" + +\end_inset + +,按照使用方便性列出了常见的BigDecimal构造方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的构造方法列表参见:http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +示例 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal(String val) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用字符串构造BigDecimal对象 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +); +\end_layout + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +-123.456 +\begin_inset Quotes erd +\end_inset + +); +\end_layout + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +1.23E3 +\begin_inset Quotes erd +\end_inset + +); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal(int val) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用基本的整数构造BigDecimal对象 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal(123); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal(long val) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用基本的long构造BigDecimal对象 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal(123L); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal(double val) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用基本的double构造BigDecimal对象 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal(123.456D); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal(char[] in) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用字符序列构造BigDecimal对象 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +char in = {'1','2','3'}; +\end_layout + +\begin_layout Plain Layout +new BigDecimal(in); +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BigDecimal的常见构造方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:BigDecimal的常见构造方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +BigDecimal提供的计算方法 +\end_layout + +\begin_layout Standard +BigDecimal不仅可以任意精度的数字,还提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:BigDecimal的计算方法" + +\end_inset + +所示的计算方法。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名称 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +示例 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal add(BigDecimal augend) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前的BigDecimal对象和augend对象相加 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +).add(new BigDecimal( +\begin_inset Quotes eld +\end_inset + +234.5432 +\begin_inset Quotes erd +\end_inset + +)); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal subtract(BigDecimal subtrahend) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前的BigDecimal对象和subtrahend对象相减 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +).substract(new BigDecimal( +\begin_inset Quotes eld +\end_inset + +234.5432 +\begin_inset Quotes erd +\end_inset + +)); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal multiply(BigDecimal multiplicand) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前的BigDecimal对象和multiplicand对象相乘 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +).multiploy(new BigDecimal( +\begin_inset Quotes eld +\end_inset + +234.5432 +\begin_inset Quotes erd +\end_inset + +)); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal divide(BigDecimal divisor) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前的BigDecimal对象和divisor对象相除 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +).divide(new BigDecimal( +\begin_inset Quotes eld +\end_inset + +234.5432 +\begin_inset Quotes erd +\end_inset + +)); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public BigDecimal pow(int n) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前对象的n次方 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +new BigDecimal( +\begin_inset Quotes eld +\end_inset + +123.456 +\begin_inset Quotes erd +\end_inset + +).pow(3); +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BigDecimal的计算方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:BigDecimal的计算方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +BigDecimal的舍入处理策略 +\end_layout + +\begin_layout Standard +由于BigDecimal提供的是精确的数值计算,我们经常需要根据实际情况进行适当的舍入处理,BigDecimal提供了多达8种舍入处理模式,这8种舍入模式在Ro +undingMode中定义,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:RoundingMode中定义的8种舍入模式" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +输入数据 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +UP +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +DOWN +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CEIL +\end_layout + +\begin_layout Plain Layout +-ING +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +FLOOR +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +HALF +\end_layout + +\begin_layout Plain Layout +_UP +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +HALF +\end_layout + +\begin_layout Plain Layout +_DOWN +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +HALF +\end_layout + +\begin_layout Plain Layout +_EVEN +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +UNNECE +\end_layout + +\begin_layout Plain Layout +-SSARY +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +5.5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2.5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1.6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1.1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1.0 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +-1.0 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +-1.1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +-1.6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +-2.5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +-5.5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +抛出异常 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +RoundingMode中定义的8种舍入模式 +\begin_inset CommandInset label +LatexCommand label +name "tab:RoundingMode中定义的8种舍入模式" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,HALF_UP即我们最常用的“四舍五入”模式。 +\end_layout + +\begin_layout Standard +下面的代码片段演示了编程实践中的常见情形: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// 计算结果四舍五入保留2位小数 +\end_layout + +\begin_layout Plain Layout + +new BigDecimal("123.456").multiply(new BigDecimal("1.23")).setScale(2, RoundingMode.H +ALF_UP); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +对于任何需要精确答案的计算任务,请不要使用float或者double。如果你想让系统来记录十进制小数点,并且不介意因为不使用基本类型而带来的不便,请使用BigD +ecimal。使用BigDecimal还有一些额外的好处,允许你完全控制舍入。每当一个计算涉及到舍入的时候,BigDecimal允许你8种舍入模式中选择其一。但 +是BigDecimal有一定的性能问题,即比使用float和double要慢(大约上百倍的差距)。如果性能非常关键,那么使用int或者long处理精确计算问题。 +要注意的是,int最多只能处理9位十进制数字,long最多只能处理18位十进制数字。如果数值可能超过18位,就必须使用BigDecimal。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +日期和时间类 +\begin_inset CommandInset label +LatexCommand label +name "sec:日期和时间类" + +\end_inset + + +\end_layout + +\begin_layout Standard +在Java语言中,日期和时间曾经是一个复杂和混乱的问题 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +有必要讲述ZoneId,时区的概念和用法吗? +\end_layout + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +关于Java8之前的日期和时间API,在互联网上有大量的吐槽,比如: +\end_layout + +\begin_layout Itemize +JDK BUG吗? 混乱的日期API: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.importnew.com/20098.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +为什么我们需要新的Java日期/时间API: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://www.importnew.com/14140.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +What's wrong with Java Date & Time API: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://stackoverflow.com/questions/1969442/whats-wrong-with-java-date-time-api +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,Java8终于给Java带来了一致的日期和时间实现!Java8的日期和时间类是JSR310 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:https://jcp.org/en/jsr/detail?id=310 +\end_layout + +\end_inset + +的一个具体实现,是Java8的重要新特性。本书只介绍Java8中新的日期和时间类API,不再涉及旧的日期和时间API,也建议读者在编写Java应用程序的时候不要 +再使用旧版本的日期和时间API。 +\end_layout + +\begin_layout Subsection +日期操作类:LocalDate +\begin_inset Foot +status open + +\begin_layout Plain Layout +最新的API文档在:https://docs.oracle.com/javase/10/docs/api/java/time/LocalDate.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +顾名思义,LocalDate的“本意”似乎是“本地日期”,但是遗憾的是,LocalDate的本意应该是“日期”。这是因为Java8之前的日期类(旧的日期API) +叫做Date,因此新的日期API只好另起炉灶,就被称作“LocalDate”了。LocalDate的常见用法见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:LocalDate的常见用法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static LocalDate now() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据默认时区获得当前日期 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static LocalDate of(int year, int month, int dayOfMonth) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的年月日创建LocalDate对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static LocalDate ofYearDay(int year, int dayOfYear) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的年份和天数创建LocalDate对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static LocalDate parse(CharSequence text) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的字符串创建LocalDate对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static LocalDate parse(CharSequence text, DateTimeFormatter formatter) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的字符串及其格式创建LocalDate对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public String format(DateTimeFormatter formatter) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +格式化输出日期(参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:日期和时间的格式化输出类:DateTimeFormatter" + +\end_inset + +) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean isAfter(ChronoLocalDate other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断日期对象是否在other日期对象之后 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean isBefore(ChronoLocalDate other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断日期对象是否在other日期对象之前 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +LocalDate的常见用法 +\begin_inset CommandInset label +LatexCommand label +name "tab:LocalDate的常见用法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +LocalDate用法示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "LocalDateTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/time/LocalDateTest.java" +lstparams "caption={LocalDateTest.java},label={LocalDateTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行LocalDateTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Current Date=2016-11-20 +\end_layout + +\begin_layout Plain Layout +Specific Date=2016-01-01 +\end_layout + +\begin_layout Plain Layout +Current Date in IST=2016-11-20 +\end_layout + +\begin_layout Plain Layout +365th day from base date= 1971-01-01 +\end_layout + +\begin_layout Plain Layout +100th day of 2016=2016-04-09 +\end_layout + +\begin_layout Plain Layout +2016-11-21 parsed to LocalDate = 2016-11-21 +\end_layout + +\begin_layout Plain Layout +2016-11-21 < 2016-11-22 ? true +\end_layout + +\begin_layout Plain Layout +2016-11-21 < 2016-11-21 ? false +\end_layout + +\begin_layout Plain Layout +2016-11-22 > 2016-11-21 ? true +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +时间操作类:LocalTime +\begin_inset Foot +status open + +\begin_layout Plain Layout +最新的API文档在:https://docs.oracle.com/javase/10/docs/api/java/time/LocalTime.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +LocalTime是表示时间的操作类,其API设计和LocalDate很相似,这里不再详细列出LocalTime的方法,具体可以参考 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:LocalTime类用法示例" + +\end_inset + +。 +\end_layout + +\begin_layout Example +LocalTime类用法示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:LocalTime类用法示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "LocalTimeTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/time/LocalTimeTest.java" +lstparams "caption={LocalTimeTest.java},label={LocalTimeTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行LocalTimeTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Current Time=15:07:13.774 +\end_layout + +\begin_layout Plain Layout +Specific Time of Day=12:20:25.000000040 +\end_layout + +\begin_layout Plain Layout +Current Time in IST=12:37:13.775 +\end_layout + +\begin_layout Plain Layout +10000th second time= 02:46:40 +\end_layout + +\begin_layout Plain Layout +12:30:55 parsed to LocalDate = 12:30:55 +\end_layout + +\begin_layout Plain Layout +12:30:55 < 13:02:15 ? true +\end_layout + +\begin_layout Plain Layout +12:30:55 < 12:30:55 ? false +\end_layout + +\begin_layout Plain Layout +13:02:15 > 12:30:55 ? true +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +日期时间类:LocalDateTime +\begin_inset Foot +status open + +\begin_layout Plain Layout +最新的API文档在:https://docs.oracle.com/javase/10/docs/api/java/time/LocalDateTime.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +LocalDateTime是表示日期时间的操作类,其API设计和LocalDate很相似,这里不再详细列出LocalDateTime的方法,具体可以参考 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:LocalDateTime类用法示例" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +日期(LocalDate)、时间(LocalTime)、日期时间(LocalTime)、字符串之间的相互转化关系参见下图: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/essentail-classes/date-time-string.eps + width 90line% + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +LocalDateTime类用法示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:LocalDateTime类用法示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "LocalDateTimeTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/time/LocalDateTimeTest.java" +lstparams "caption={LocalDateTimeTest.java},label={LocalDateTimeTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行LocalDateTimeTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Current DateTime=2016-11-20T15:08:15.970 +\end_layout + +\begin_layout Plain Layout +Current DateTime=2016-11-20T15:08:15.971 +\end_layout + +\begin_layout Plain Layout +Specific Date=2014-01-01T10:10:30 +\end_layout + +\begin_layout Plain Layout +Current Date in IST=2016-11-20T12:38:15.972 +\end_layout + +\begin_layout Plain Layout +10000th second time from 01/01/1970= 1970-01-01T02:46:40 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +日期和时间的格式化输出类:DateTimeFormatter +\begin_inset Foot +status open + +\begin_layout Plain Layout +最新的API文档在:https://docs.oracle.com/javase/10/docs/api/java/time/format/DateTimeForm +atter.html +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "subsec:日期和时间的格式化输出类:DateTimeFormatter" + +\end_inset + + +\end_layout + +\begin_layout Standard +在大部分情况下,LocalDate和LocalTime的默认输出即符合预期,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "LocalDateTest.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "LocalTimeTest.java" + +\end_inset + +中LocalDate和LocalTime对象的输出。如果需要定制日期和时间的输出格式,DateTimeFormatter提供了丰富的内置格式支持和可定制选项。D +ateTimeFormatter内置的输出格式如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:DateTimeFormatter的输出格式控制选项" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +格式控制选项 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +示例 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ofLocalizedDate(date +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +Style) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Formatter with date style from the locale +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ofLocalizedTime(time +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +Style) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Formatter with time style from the locale +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'10:15:30' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ofLocalizedDateTime( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +dateTimeStyle) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Formatter with a style for date and time from the locale +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'3 Jun 2008 11:05:30' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ofLocalizedDateTime( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +dateStyle,timeStyle) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Formatter with date and time styles from the locale +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'3 Jun 2008 11:05' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +BASIC_ISO_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +基本的 ISO 日期格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'20111203' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_LOCAL_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO Local Date +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_OFFSET_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +显示时区偏移量的 ISO 日期格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03+01:00' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO 日期格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03+01:00'; '2011-12-03' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_LOCAL_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +不带时区偏移量的时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'10:15:30' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_OFFSET_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +带时区偏移量的时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'10:15:30+01:00' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'10:15:30+01:00'; '10:15:30' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_LOCAL_DATE +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO日期和时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03T10:15:30' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_OFFSET_DATE +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +带时区偏移量的日期时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +2011-12-03T10:15:30+01:00' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_ZONED_DATE +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +带时区显示的日期时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03T10:15:30+01:00[ +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +Europe/Paris]' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_DATE_TIME +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +带时区显示的日期时间格式 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2011-12-03T10:15:30+01:00[ +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +Europe/Paris]' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_ORDINAL_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +显示年份以及第几天 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2012-337' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_WEEK_DATE +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +显示年份和周次 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +'2012-W48-6' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +ISO_INSTANT +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Date and Time of an Instant +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +RFC_1123_DATE_TIME RFC 1123 / RFC 822 'Tue, 3 Jun 2008 11:05:30 GMT' +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +DateTimeFormatter的输出格式控制选项 +\begin_inset CommandInset label +LatexCommand label +name "tab:DateTimeFormatter的输出格式控制选项" + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +需要翻译 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:DateTimeFormatter的输出格式控制选项" + +\end_inset + +中,我们常用的日期和时间格式为ISO_LOCAL_DATE,ISO_LOCAL_TIME,ISO_LOCAL_DATE_TIME。 +\end_layout + +\begin_layout Standard +除了可使用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:DateTimeFormatter的输出格式控制选项" + +\end_inset + +中预定义的日期和时间格式外,ofPattern()方法支持任意模式的日期和时间格式化输出,具体的格式化字符串可以参照DateTimeFormmater的API文 +档,这里不再一一列出。 +\end_layout + +\begin_layout Example +使用DateTimeFormmater定制日期和时间的输出 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "DateTimeFormatterTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/time/DateTimeFormatterTest.java" +lstparams "caption={DateTimeFormatterTest.java},label={DateTimeFormatterTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行DateTimeFormatterTest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Default format of LocalDate=2016-11-20 +\end_layout + +\begin_layout Plain Layout +20::十一月::2016 +\end_layout + +\begin_layout Plain Layout +20161120 +\end_layout + +\begin_layout Plain Layout +Default format of LocalDateTime=2016-11-20T15:18:44.241 +\end_layout + +\begin_layout Plain Layout +20::十一月::2016 15::18::44 +\end_layout + +\begin_layout Plain Layout +20161120 +\end_layout + +\begin_layout Plain Layout +Default format after parsing = 2014-04-27T21:39:48 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +*日期和时间的调整 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +作为较高要求,可以不写这部分? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +大多数日期/时间API类都实现了一系列工具方法,如:加/减天数、周数、月份数,等等。还有其他的工具方法能够使用TemporalAdjuster调整日期,并计算两 +个日期间的周期。 +\end_layout + +\begin_layout Example +使用日期和时间类调整日期和时间 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "DateTimeAPITest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/essentials/src/cn/edu/sdut/softlab/essentials/time/DateTimeAPITest.java" +lstparams "caption={DateTimeAPITest.java},label={DateTimeAPITest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行DateTimeAPITest结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Year 2016 is Leap Year? true +\end_layout + +\begin_layout Plain Layout +Today is before 01/01/2015? false +\end_layout + +\begin_layout Plain Layout +Current Time=2016-11-20T15:26:02.947 +\end_layout + +\begin_layout Plain Layout +10 days after today will be 2016-11-30 +\end_layout + +\begin_layout Plain Layout +3 weeks after today will be 2016-12-11 +\end_layout + +\begin_layout Plain Layout +20 months after today will be 2018-07-20 +\end_layout + +\begin_layout Plain Layout +10 days before today will be 2016-11-10 +\end_layout + +\begin_layout Plain Layout +3 weeks before today will be 2016-10-30 +\end_layout + +\begin_layout Plain Layout +20 months before today will be 2015-03-20 +\end_layout + +\begin_layout Plain Layout +First date of this month= 2016-11-01 +\end_layout + +\begin_layout Plain Layout +Last date of this year= 2016-12-31 +\end_layout + +\begin_layout Plain Layout +Period Format= P1M11D +\end_layout + +\begin_layout Plain Layout +Months remaining in the year= 1 +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture_guide.lyx b/guide/lecture_guide/lecture_guide.lyx index 12c53b3..2c232be 100644 --- a/guide/lecture_guide/lecture_guide.lyx +++ b/guide/lecture_guide/lecture_guide.lyx @@ -167,6 +167,10 @@ CS呢?角色扮演。Mud? \end_layout \begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout \begin_inset ERT status open @@ -180,6 +184,11 @@ AddLabels \end_inset +\end_layout + +\end_inset + + \begin_inset Note Comment status open @@ -220,6 +229,46 @@ filename "lecture3.lyx" \end_inset +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture4.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture5.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture6.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture7.lyx" + +\end_inset + + \end_layout \begin_layout Standard From 74779ccb118ec246340ab64227d98e0c9bdeb56d Mon Sep 17 00:00:00 2001 From: subaochen Date: Thu, 10 Sep 2020 10:35:30 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E7=9A=84=E6=95=99?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guide/lecture_guide/lecture10.lyx | 10404 +++++++++++++++++++++++ guide/lecture_guide/lecture11.lyx | 10427 ++++++++++++++++++++++++ guide/lecture_guide/lecture12.lyx | 9753 ++++++++++++++++++++++ guide/lecture_guide/lecture13.lyx | 9852 ++++++++++++++++++++++ guide/lecture_guide/lecture14.lyx | 9802 ++++++++++++++++++++++ guide/lecture_guide/lecture15.lyx | 2751 +++++++ guide/lecture_guide/lecture8.lyx | 3197 ++++++++ guide/lecture_guide/lecture9.lyx | 3143 +++++++ guide/lecture_guide/lecture_guide.lyx | 80 + guide/lecture_guide/make_lecture.sh | 3 + 10 files changed, 59412 insertions(+) create mode 100644 guide/lecture_guide/lecture10.lyx create mode 100644 guide/lecture_guide/lecture11.lyx create mode 100644 guide/lecture_guide/lecture12.lyx create mode 100644 guide/lecture_guide/lecture13.lyx create mode 100644 guide/lecture_guide/lecture14.lyx create mode 100644 guide/lecture_guide/lecture15.lyx create mode 100644 guide/lecture_guide/lecture8.lyx create mode 100644 guide/lecture_guide/lecture9.lyx create mode 100755 guide/lecture_guide/make_lecture.sh diff --git a/guide/lecture_guide/lecture10.lyx b/guide/lecture_guide/lecture10.lyx new file mode 100644 index 0000000..4c0a9aa --- /dev/null +++ b/guide/lecture_guide/lecture10.lyx @@ -0,0 +1,10404 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +coderemarks +logicalmkup +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:C的IO回顾" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:C的IO回顾" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java的IO体系" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java的IO体系" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java I/O和C的I/O的比较; +\end_layout + +\begin_layout Enumerate +Java I/O的分类和类层次结构; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java I/O的面向字节和面向字符的接口; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握Java I/O的基本概念和实现思路; +\end_layout + +\begin_layout Enumerate +熟练掌握Java I/O的两种分类及其不同的使用场合; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java I/O体系复杂吗?是否存在过度设计的嫌疑?你是否有更好的想法? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +Java的IO +\begin_inset CommandInset label +LatexCommand label +name "chap:Java的IO" + +\end_inset + + +\end_layout + +\begin_layout Standard +输入输出(IO)看起来简单,但是却头绪繁多、内容繁杂。这是因为我们要处理的输入输出设备种类众多,导致Java通过面向对象的方式对输入输出设备及其操作的封装也比较 +复杂,因此建议读者在学习本章内容的时候要经常跳出具体的技术细节,回到下图从总体上把握Java IO的体系。 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/io/Java-IO.png + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +内容是否太多?不容易理出一个头绪来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Section +C的IO回顾 +\begin_inset CommandInset label +LatexCommand label +name "sec:C的IO回顾" + +\end_inset + + +\end_layout + +\begin_layout Standard +在C语言中,输入输出的概念分为两个层面: +\end_layout + +\begin_layout Itemize +输入输出的“源”都被看做设备,使用设备描述符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +设备描述符 +\end_layout + +\end_inset + +来区分不同的输入输出源。 +\end_layout + +\begin_layout Itemize +从设备输入或者输出的数据通过“流”(stream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +stream +\end_layout + +\end_inset + +)模型来处理,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:C的输入模型" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:C的输出模型" + +\end_inset + +。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +把下图的输入流和输出流画成管道的形状 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/c-input.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的输入模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:C的输入模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/c-output.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的输出模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:C的输出模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓的“流”(stream),是一个仅容一个bit数据通过的管道,即数据的有序序列,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:输入流模型" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这个图似乎表达的不是很清楚? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/input-stream.eps + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +输入流模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:输入流模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Quotes eld +\end_inset + +流模型”的最大好处是,每个I/O函数都尽力做最好的自己即可,通过“流模型”可以将不同的I/O函数串联起来协同完成更复杂的IO操作。Java的IO体系也借鉴了C中 +的IO设计,只不过C是面向过程的语言,IO的处理是通过函数来完成的,而Java是面向对象的方式来处理IO,IO的操作是通过不同的IO操作类来完成的。 +\end_layout + +\begin_layout Section +Java的IO体系 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的IO体系" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java继承了C对输入输出的基本认识:无论输入输出来自何处(设备),去往何处(设备),一律当做“流”的方式来处理。流就像一个仅容一个bit数据通过的管道一样,是 +一个有序的数据序列。如果我们按照8位(1个字节)来分割解读流中的数据序列,就是“面向字节的流”,有时也简称“字节流 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +字节流 +\end_layout + +\end_inset + +”;如果我们以16位(2个字节,即1个字符)来分割和解读流中的数据,就是“面向字符的流”,有时也简称“字符流 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +字符流 +\end_layout + +\end_inset + +”。其实,字节流和字符流的区分并没有改变流的数据本质,只是我们以不同的视角解读数据罢了,就像一部红楼,经学家看见《易》,道学家看见淫,才子看见缠绵,革命家看见排 +满,流言家看见宫闱秘事 +\begin_inset Foot +status open + +\begin_layout Plain Layout +出自《鲁迅全集-集外集拾遗补编•<绛洞花主>小引》 +\end_layout + +\end_inset + +。红楼还是那部红楼,不同的人,不同的场合,不同的视角,不同的解读而已。 +\end_layout + +\begin_layout Standard +Java IO相关的类在包java.io中。 +\end_layout + +\begin_layout Subsection +面向字节的流 +\begin_inset CommandInset label +LatexCommand label +name "subsec:面向字节的流" + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓面向字节的流,是指流中的数据按照字节来解释,即每8位(1个字节)为一个解读的单元。Java提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的InputStream类层次结构" + +\end_inset + +所示的面向字节的流的处理类层次结构。其中的节点流是指直接与输入输出设备打交道处理I/O操作的类,处理流是指对原始数据进行二次加工的类。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream.eps + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的InputStream/OutputStream类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java的InputStream类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的InputStream类层次结构" + +\end_inset + +中的InputStream/OutputStream的子类有各自的应用场景,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:InputStream/OutputStream子类的适用场景" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FileInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取二进制文件,比如图片、音视频等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +PipedInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +提供了管道化操作的具体实现:PipedInputStream通常和一个PipedOutputStream关联在一起,即PipedOutputStream的输出送 +给PipedInputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ByteArrayInput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将一个字节数组当做一个InputStream来处理。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +SequenceInput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将多个InputStream收尾相接组成一个新的InputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FilterInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +顾名思义,FilterInputStream接受一个InputStream作为参数,然后对这个InputStream中的数据做相应的处理后再输出。即,Filte +rInputStream通常用来对数据进行筛选、变换、编码等处理,FilterInputStream的不同子类已经实现了若干的过滤处理,常见的FilterInp +utStream的子类如下: +\end_layout + +\begin_layout Description +BufferedInputStream: 对于任何InputStream提供了缓存处理功能,提高了输入处理的效率。 +\end_layout + +\begin_layout Description +DataInputStream: 如果我们确定InputStream中存储的是基本类型数据,则可以借助于DataInputStream提供的读取基本类型数据方法 +简化操作,这些方法直接返回所需要的基本类型变量,比如readInt。注意到DataInputStream也实现了DataInput接口,在DataInput接口 +中规范了读取基本类型数据的方法。 +\end_layout + +\begin_layout Description +PushBackInputStream: 通常,我们从InputStream读取一个字节后,这个字节就从InputStream移除了,再次从InputStrea +m读取数据会从下一个字节开始。PushBackInputStream的设计目的是把刚刚读取的字节再次送回InputStream,以便有机会再次读取这个字节的数据 +。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ObjectInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于对基本数据类型和对象的序列化处理,通常和ObjectOutputStream联合使用,即ObjectInputStreamream所读取的数据通常是由Obj +ectOutputStream写入的。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream输入流 +\begin_inset CommandInset label +LatexCommand label +name "tab:InputStream/OutputStream子类的适用场景" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FileOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写入二进制文件,比如图片、音视频等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +PipedOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +通常和一个PipedInputStream关联在一起实现管道化操作 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ByteArrayOutput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写入到一个字节数组中 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FilterOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +接受一个OutputStream作为参数,在数据写入OutputStream之前进行一定的处理。常见的FilterOutputStream子类如下: +\end_layout + +\begin_layout Itemize +DataOutputStream: 将基本数据类型写入OutputStream,便于使用DataInputStream读入处理。 +\end_layout + +\begin_layout Itemize +BufferedOutputStream:对于任何OutputStream提供了缓存处理功能,提高了输出处理的效率。 +\end_layout + +\begin_layout Itemize +PrintStream: 自动刷新缓冲区的OutputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ObjectOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于对基本数据类型和对象的序列化处理。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +OutputStream输出流 +\begin_inset CommandInset label +LatexCommand label +name "tab:OutputStream子类的适用场景" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +InputStream是个抽象类,是所有字节输入流的父类,其中定义了一些基本的字节输入流的操作方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:InputStream的常用方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract int read() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取下一个字节,字节值为0~255。如果输入流不再有数据则返回-1。该方法是一个阻塞方法,直到有数据可读或者数据流结束,或发生异常才返回。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(byte[] b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取一组数据存入缓冲区b中,返回所读取字节的个数。如果返回-1表示数据流结束。该方法相当于read(b, 0, b.length)。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(byte[] b, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取最多len字节数据存入缓冲区b中,存储位置从b的第off个位置开始。该方法返回读取的字节数,如果返回-1表示数据流结束。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int available() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回当前输入流可供读取的字节数。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void mark(int readLimit) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在输入流中标记当前位置,以后可以调用reset方法返回该位置,以便重复读取从该标记位置开始的数据。readLimit设置调用mark方法后可以读取的最大字节数, +且保持mark标记有效。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void reset() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +重置流的读取位置,回到上次调用mark方法标记的位置。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean markSupported() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +检测输入流是否支持mark和reset方法 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long skip(long n) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流忽略n字节的数据,返回被忽略的实际字节数。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭输入流,释放所占用的系统资源。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:InputStream的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void write(int b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +向输出流写入一个字节。写出字节为整数b的低字节,整数b的3个高字节被忽略。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(byte[] b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +把缓冲区b中的全部数据写入输出流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(byte[] b, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +把缓冲区b从b[off]开始的len个字节的数据写入输出流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pbulic void flush() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +刷新输出流,强制输出缓冲区的数据立即写出 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭输出流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +OutputStream的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:OutputStream的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java内部的数据都是unicode编码 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:http://unicode.org/charts。Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Uni +code 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。un +icode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。我们经常说的UTF-8编码是unicode编码的具体实现(除此之外还 +有UTF-16,UTF-32,但是用的不多),UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节 +长度:对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码,因此对于英语字母,UTF-8编码和ASCII码是相同的。 对于n字节的符号(n +>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 + +\end_layout + +\end_inset + +的,除ASCII码外都是多字节编码方式,因此面向字节的流处理往往用于处理二进制数据,或者用于适合把数据看做二进制的场合。比如: +\end_layout + +\begin_layout Itemize +在工业控制领域,我们把接收到的数据按照自己制定的数据格式写入文件(不一定是Java语言编写的程序写文件,也许是C/C++写文件),在这种情况下就适合使用面向字节 +的流打开文件读取数据。在C语言中我们也特别强调,为了保证正确读写文件,采用什么方式(主要指面向字节还是面向字符)写入文件,就要采用同样的方式打开文件。 +\end_layout + +\begin_layout Itemize +ASCII文件可以安全的使用面向字节的流读写,因为ASCII字符的长度没有超出8位。 +\end_layout + +\begin_layout Itemize +图片、声音、视频等数据一般是以二进制方式存储的,因此适合使用字节流来处理。 +\end_layout + +\begin_layout Standard +我们之前一直在使用的System.in +\begin_inset Index idx +status open + +\begin_layout Plain Layout +System.in +\end_layout + +\end_inset + +,实际上一个InputStream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +InputStream +\end_layout + +\end_inset + +类型的对象,Sytsem.out +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Sytsem.out +\end_layout + +\end_inset + +实际上是一个PrintStream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +PrintStream +\end_layout + +\end_inset + +类型的对象 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见openjdk的jdk/src/java.base/share/classes/java/lang/System.java +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + /** +\end_layout + +\begin_layout Plain Layout + + * The "standard" input stream. + This stream is already +\end_layout + +\begin_layout Plain Layout + + * open and ready to supply input data. + Typically this stream +\end_layout + +\begin_layout Plain Layout + + * corresponds to keyboard input or another input source specified by +\end_layout + +\begin_layout Plain Layout + + * the host environment or user. +\end_layout + +\begin_layout Plain Layout + + */ +\end_layout + +\begin_layout Plain Layout + + public static final InputStream in = null; +\end_layout + +\begin_layout Plain Layout + + /** +\end_layout + +\begin_layout Plain Layout + + * The "standard" output stream. + This stream is already +\end_layout + +\begin_layout Plain Layout + + * open and ready to accept output data. + Typically this stream +\end_layout + +\begin_layout Plain Layout + + * corresponds to display output or another output destination +\end_layout + +\begin_layout Plain Layout + + * specified by the host environment or user. +\end_layout + +\begin_layout Plain Layout + + *

+\end_layout + +\begin_layout Plain Layout + + * For simple stand-alone Java applications, a typical way to write +\end_layout + +\begin_layout Plain Layout + + * a line of output data is: +\end_layout + +\begin_layout Plain Layout + + *

+\end_layout
+
+\begin_layout Plain Layout
+
+     *     System.out.println(data)
+\end_layout
+
+\begin_layout Plain Layout
+
+     * 
+\end_layout + +\begin_layout Plain Layout + + *

+\end_layout + +\begin_layout Plain Layout + + * See the println methods in class PrintStream. +\end_layout + +\begin_layout Plain Layout + + * +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println() +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(boolean) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(char) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(char[]) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(double) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(float) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(int) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(long) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(java.lang.Object) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(java.lang.String) +\end_layout + +\begin_layout Plain Layout + + */ +\end_layout + +\begin_layout Plain Layout + + public static final PrintStream out = null; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +输入输出流在使用后为什么要及时关闭呢?这是因为,Java把所有的输入输出流都抽象为文件的操作,如果我们不及时关闭打开的输入输出流,相当于不及时关闭打开的文件,久 +而久之可能造成操作系统打开的文件过多,从而拖慢系统运行速度,甚至超出系统允许打开的文件数。因此,输入输出流使用完毕及时关闭是个好习惯。 +\end_layout + +\begin_layout Plain Layout +我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:try-with-resources" + +\end_inset + +会看到,使用try-with-resources可以方便的管理输入输出流的关闭,减轻了程序员的负担。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +复制二进制文件 +\begin_inset CommandInset label +LatexCommand label +name "exa:复制二进制文件。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CopyBinary.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CopyBinary.java" +lstparams "caption={CopyBinary.java},label={CopyBinary.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +要复制的文件从哪里来? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在Idea中运行CopyBinary.main()结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +97321151161141051101031049484810504846525310 +\end_layout + +\begin_layout Plain Layout +97321151161141051101031049484810504846525310 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +本例我们实现了两种文件复制的方式: +\end_layout + +\begin_layout Enumerate +不使用缓冲区的字节流。通过FileInputStream读取文件,通过FileOutputStream写入文件,没有使用缓冲区,每次读取一个字节。显然当文件比较 +大时,读写文件的效率是比较低的。 +\end_layout + +\begin_layout Enumerate +使用缓冲区的字节流。利用BufferedInputStream和BufferedOutputStream构造带缓冲区的字节流,这是编程实践中最常见的情形。 +\end_layout + +\begin_layout Standard +注意到我们使用了try-with-resources的Java新语法。如果使用传统的try-catch接口则要注意输入字节流和输出字节流在使用完毕后都需要关闭, +通常借助于finally代码块实现。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Example +FileInputStream/FileOutputStream、BufferedInputStream/BufferedOutputStream、DataIn +putSteam/DataOutputStream的使用 +\end_layout + +\begin_layout Paragraph* +设计要求 +\end_layout + +\begin_layout Standard +假设一个表示气温的文件weather.txt有下列数据 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:文件操作" + +\end_inset + +还会使用文件相关API重新设计本例。 +\end_layout + +\end_inset + +,试将下列数据使用DataOutputStream重新写入文件weather.dat,然后使用DataInputStream读出weather.dat并求温度的平均 +值。 +\end_layout + +\begin_layout Standard +\begin_inset Box Boxed +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +17.1 24.2 +\end_layout + +\begin_layout Plain Layout +18.9 22.3 +\end_layout + +\begin_layout Plain Layout +17.3 -2.3 15.6 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Temperature.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/Temperature.java" +lstparams "caption={Temperature.java},label={Temperature.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行Temperature结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +17.1 +\end_layout + +\begin_layout Plain Layout +24.2 +\end_layout + +\begin_layout Plain Layout +18.9 +\end_layout + +\begin_layout Plain Layout +22.3 +\end_layout + +\begin_layout Plain Layout +17.3 +\end_layout + +\begin_layout Plain Layout +-2.3 +\end_layout + +\begin_layout Plain Layout +15.6 +\end_layout + +\begin_layout Plain Layout +average temperature = 16.157142809459142 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +注意到dos的构造方式:DataOutputStream dos = new DataOutputStream(new BufferedOutputStream +(new FileOutputStream( +\begin_inset Quotes eld +\end_inset + +weather.dat +\begin_inset Quotes erd +\end_inset + +))),可以通过 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:DataStream/BufferedStream/InputS" + +\end_inset + +加深理解。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/datastream-buffer-file.eps + lyxscale 70 + width 90line% + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +此图可以通过层技术画的更好 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +DataStream/BufferedStream/InputStream的联合使用 +\begin_inset CommandInset label +LatexCommand label +name "fig:DataStream/BufferedStream/InputS" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意weather.txt, weather.dat文件的位置:目前是在项目的根目录下的,这是因为几乎所有的IDE环境,包括Eclipse、NetBeans、Ide +a都把项目的根目录作为字节流的根目录来处理,因此我们在上面的例子中,都是采用了相对路径的方式来读写文件。但是,这种读写文件的方式(主要是对文件路径的定义方式)如 +果离开了IDE环境就失效了,因此在实践中一般不采用此种文件定位方式,一般根据classpath定位文件,参见 +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:读写属性文件" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +无论是读取还是写入文件,字节流的操作分为以下两种方式: +\end_layout + +\begin_layout Enumerate +按字节处理:每次读取或者写入一个字节; +\end_layout + +\begin_layout Enumerate +按字节数组处理:每次读取或者写入一个字节数组,数组的大小需要事先定义; +\end_layout + +\begin_layout Plain Layout +在字符流中,我们还会看到按行处理的情形,但是在处理字节流时一般不按行处理,其原因是二进制数据一般不进行换行处理。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用C语言通过面向字节的方式打开一个文件写入“Hello World!”,然后使用Java语言读取此文件,看看有什么变化? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +使用C语言通过面向字节的方式打开一个文件写入“你好,世界!”,然后使用Java的面向字节的流读取此文件,看看有什么变化? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +请将 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +exercisename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:复制二进制文件。" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +改造为从命令行输入源文件和目标文件,然后将源文件复制为目标文件。 +\end_layout + +\begin_layout Subsection +面向字符的流 +\begin_inset CommandInset label +LatexCommand label +name "subsec:面向字符的流" + +\end_inset + + +\end_layout + +\begin_layout Standard +理解了字节流,字符流就不难理解了。字节流是将“流”中的数据按照字节来划分,所谓字符流,只是将“流”中的数据按照2个字节(即一个字符)来划分而已。Java + IO提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:字符流的类层次结构" + +\end_inset + +所示的处理字符流的类层次结构。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/reader-writer.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +字符流的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:字符流的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +有必要列出每一个Reader/Writer子类的使用场合吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +和字节流非常类似,Reader和Write是两个抽象类,其中封装了操作字符流的基本方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Reader的基本方法" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Writer的基本方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取一个字符并返回,如果没有字符可读则返回-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(char[] cbuf) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取字符到数组cbuf中,返回读取的字符个数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract int read(char[] cbuf, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取字符到数组cbuf中,并从cbuf[off]开始存储,最多读取len个字符。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long skip(long n) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +跳过流中的n个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean ready() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +检测输入字符流是否可读 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void mark(int readAheadLimit) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +标记流的当前位置,readAheadLimit表示在此位置有效期间最多可以读取的字符数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void reset() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +复位标记过的流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Reader的基本方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Reader的基本方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(int c) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写一个字符到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(char[] cbuf) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符数组cbuf到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void write(char[] cbuf, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符数组cbuf到流,从cbuf[off]开始最多写入len个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(String str) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符串str到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(String str, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符串str到流,从off个字符开始,最多写入len个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void flush() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +刷新流缓冲区 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Writer的基本方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Writer的基本方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +从键盘输入数据 +\begin_inset CommandInset label +LatexCommand label +name "sec:从键盘输入数据" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "40line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/x-memory-layout.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +实数3.125的内存表达 +\begin_inset CommandInset label +LatexCommand label +name "fig:实数3.125的内存表达" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +对于输入输出而言,使用最多的就是从键盘输入数据 +\begin_inset CommandInset citation +LatexCommand cite +after "p104,输入数据" +key "java-chenweijun" +literal "true" + +\end_inset + +,以及在显示器上输出数据。在Java语言中,数据的输出很方便,使用System.out.println就已经很好用了,无论什么类型的数据,都能够自动转换为字符串输出 +(在Java8以后,甚至包括了List、Map类型的数据),这里不再赘述。但是Java从键盘输入数据确实不是太方便,比如考虑下面的情形:从键盘输入一个实数3.12 +5保存到变量x中,该如何完成这个任务呢?如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:实数3.125的内存表达" + +\end_inset + +所示。我们的目标是获得一个单精度浮点类型变量x,其值为3.125,在内存中占用4个字节的内存空间,从高到低的4个字节分别为40、48、00和00(均为16进制数) +。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +浮点数的内存存储方式是哪里讲解的?在这里需要将知识点链接起来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +从键盘输入数据,我们已经知道必须通过System.in来完成,下面我们再次回顾一下System类的基本内容: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public final class System { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + public final static InputStream in = null; +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + private static void initializeSystemClass() { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + FileInputStream fdIn = new FileInputStream(FileDescriptor.in); +\end_layout + +\begin_layout Plain Layout + + setIn0(new BufferedInputStream(fdIn)); +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,in是System类的静态成员变量,在系统初始化的时候,in初始化为一个带缓冲的文件字节流,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +in是一个从标准输入设备(FileDescriptor.in)接受二进制数据并实现了缓存处理的字节流 +\end_layout + +\end_inset + +。另外也需要注意到,in是InputStream类型的,但其实在初始化的时候我们看到了,in的真实类型是BufferedInputStream类型的,这是前面讲 +过的多态 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:多态" + +\end_inset + + +\end_layout + +\end_inset + +的概念:子类对象,父类引用。 +\end_layout + +\begin_layout Standard +如果我们直接使用Sytem.in从键盘读入3.125,比如保存到一个byte数组中: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +byte[] b = new byte[20]; +\end_layout + +\begin_layout Plain Layout + +System.in.read(b); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +则内存中的数据如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream-read.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream的read方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:InputStream的read方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,当从键盘输入3.125时,保存在数组b中的是它们的ASCII值(注意 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +中使用16进制表示内存中的数据),并且包括了回车符和换行符 +\begin_inset Foot +status open + +\begin_layout Plain Layout +如果在Linux下面进行测试的话,从键盘输入是不包含回车符' +\backslash +r'的,只有换行符' +\backslash +n',即在Linux下面通过换行符' +\backslash +n'表示输入结束。 +\end_layout + +\end_inset + +,显然数组b不符合要求,我们很难直接将数组b直接转换为一个float类型的数据。 +\begin_inset Foot +status open + +\begin_layout Plain Layout +并非不能,而是比较麻烦,比如可以这样做: +\end_layout + +\begin_layout Plain Layout +byte[] b = new byte[20]; +\end_layout + +\begin_layout Plain Layout +float f = Float.valueOf(new String(b)); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +既然直接使用字节流不容易达成我们的目标,使用字符流InputStreamReader可以吗?InputStreamReader的构造方法是: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public InputStreamReader(InputStream in); +\end_layout + +\begin_layout Plain Layout + +public InputStreamReader(InputStream in, String enc) throws UnsupportedEncodingE +xception; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +InputStreamReader的构造方法的参数是InputStream类型的,也就是说,InputStreamReader的功能是把字节流转换为字符流,于是 +我们可以尝试这样解决: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +char[] c = new char[20]; +\end_layout + +\begin_layout Plain Layout + +InputStreamReader sr = new InputStreamReader(System.in); +\end_layout + +\begin_layout Plain Layout + +sr.read(c); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这段代码的功能是从键盘输入一组数据并保存到字符数组c中,c在内存中的内容如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStreamReader类的read方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstreamreader-read.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStreamReader类的read方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:InputStreamReader类的read方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,数组c存放的数据与 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +中的数组b是完全一样的,唯一的区别是数据类型发生了变化。b是一个字节类型的数组,每个数组元素只占一个字节;c是一个字符类型的数组,每个数组元素占两个字节。因此, +使用InputStreamReader和使用InputStream输入浮点数会遇到相似的问题:都需要将输入的数据(字节数组或者字符数组)转换为字符串对象然后使用 +Float.valueOf(String s)转换为浮点数。有没有办法从键盘直接获取字符串呢?InputStream和InputStreamReader都没有提供 +这样的功能,即便BufferedInputStream也没有提供直接从键盘获取字符串的功能,这是容易理解的:InputStream、BufferedInputS +tream的目的是原始的二进制字节,InputStreamReader的目的是为了获取原始的二进制字符,这些都和字符串没有关系。BufferedReader提供 +了从键盘获取字符串的功能,其中的readLine方法可以从键盘获取一行字符,并自动删除了末尾的回车换行符,于是我们有了最终的解决方案 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +本节的完整测试代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/io/src/cn/edu/s +dut/softlab/SystemInTest.java +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); +\end_layout + +\begin_layout Plain Layout + +String str = reader.readLine(); +\end_layout + +\begin_layout Plain Layout + +float x = Float.parseFloat(str); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在这段代码中,以System.in对象为输入参数,创建了一个InputStreamReader对象,然后以该对象为参数,创建了一个BufferedReader对象 +,从而形成了这几个类之间的连接关系 +\begin_inset Foot +status open + +\begin_layout Plain Layout +这里BufferedReader、InputStreamReader、System.in(InputStream)使用了设计模式中的装饰器模式,详情参见本系列教程 +的“提高篇”。 +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:从键盘输入数据相关类的关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/input-from-keyboard-stream.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +从键盘输入数据相关类的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:从键盘输入数据相关类的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这里的基本思路是:InputStream类负责从键盘读入字节流,然后InputStreamReader类将字节流转换为字符流,接着BufferedReader进 +行缓冲并读取一行字符,即把末尾的回车换行符去掉并将数据转化为 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +字符串 +\end_layout + +\end_inset + +,最后调用Float类的parseFloat方法把这个字符串转换为相应的实数。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +本节内容中,我们从观察java数据的内存表达深刻理解java的输入输出,常见的IDE都可以帮助我们方便的观察Java数据在内存中的存储格式,比如在Idea中调试 +SystemInTest时可以看到Idea即时的给出了各个变量的当前值: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream-read-idea-debug.png + width 85line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Note Note +status open + +\begin_layout Plain Layout +也考虑增加NetBeans/Eclipse的截图 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +如果我们仅仅需要用户从键盘输入一个简单的响应,比如yes或y的话,可以利用System.console方法,代码示例如下: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static boolean okayToOverwrite(String file) { +\end_layout + +\begin_layout Plain Layout + + String answer = System.console().readLine("overwrite %s (yes/no)? ", file); +\end_layout + +\begin_layout Plain Layout + + return (answer.equalsIgnoreCase("y") || answer.equalsIgnoreCase("yes")); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Scanner类 +\begin_inset CommandInset label +LatexCommand label +name "sec:Scanner类" + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:从键盘输入数据" + +\end_inset + +一节的描述可以看出,Java在处理键盘输入数据时实在不够友好,于是从Java 1.5开始增加了一个工具类Scanner简化从键盘输入数据的处理。Scanner类也 +是从InputStream接受数据,但是可以根据模式匹配的方法直接将二进制数据转换为相应的基本数据类型。具体的说,Scanner会自动根据分隔符(默认为空白字符 +,包括空格符、回车符、换行符、制表符)从输入数据中分离出一个个字符串(称为token),并转换为要求的整数、实数或者字符串等,从而方便的实现了在同一行读入多个不 +同类型的数据。 +\end_layout + +\begin_layout Standard +Scanner类的常用方法如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Scanner类的常用方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public byte nextByte() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个字节(byte) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public short nextShort() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个短整数(short) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int nextInt() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个整数(int) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long nextLong() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个长整数(long) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public float nextFloat() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个单精度浮点数(float) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public double nextDouble() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个双精度浮点数(double) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean hasNext() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否存在可读的数据? +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public String next() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个token(即空白字符隔开的独立的字符串) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public String nextLine() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一行 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public Scanner useDelimiter(Pattern pattern) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用自定义的token分隔符 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +应该增加一个token的用法示例 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Scanner类的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Scanner类的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +从键盘输入两个整数,计算其乘积并输出 +\begin_inset CommandInset label +LatexCommand label +name "exa:从键盘输入两个整数,计算其乘积并输出。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Multiply.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/MultiplyTest.java" +lstparams "caption={Multiply.java},label={Multiply.java}" + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用BufferedReader改写 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入两个整数,计算其乘积并输出。" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +使用Scanner读取文件“双城记.txt”,统计该小说有多少个单词 +\begin_inset Foot +status open + +\begin_layout Plain Layout +双城记文本下载地址: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://archive.org/stream/ataleoftwocities00098gut/98.txt +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +? +\end_layout + +\begin_layout Section +*文件操作 +\begin_inset CommandInset label +LatexCommand label +name "sec:文件操作" + +\end_inset + + +\end_layout + +\begin_layout Subsection +什么是Path? +\end_layout + +\begin_layout Standard +在新的文件操作API +\begin_inset Foot +status open + +\begin_layout Plain Layout +JDK 1.7引入了新的文件操作API,即NIO.2,本节内容着重于NIO.2,不再涉及旧的文件API。 +\end_layout + +\end_inset + +中,Path的概念至关重要,类Path是文件操作的入口。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里简要说明Path的功能 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +无论是Windows操作系统还是Linux操作系统,文件系统都是树状结构的。典型的文件系统如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:目录树示意图" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/linux-directory-tree.eps + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Linux系统目录树 +\begin_inset CommandInset label +LatexCommand label +name "fig:Linux系统目录树" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align left +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/windows-directory-tree.eps + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Windows系统目录树 +\begin_inset CommandInset label +LatexCommand label +name "fig:Windows系统目录树" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +目录树示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:目录树示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +myfile.txt的路径(Path)在Linux系统表示为: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +/home/lisi/myfile.txt +\end_layout + +\end_inset + +;而在Windows系统下myfile.txt的路径(Path)表示为: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +c: +\backslash +users +\backslash +list +\backslash +myfile.txt +\end_layout + +\end_inset + +。这里要特别注意到目录分隔符的区别:Windows操作系统使用反斜杠( +\backslash +) +\begin_inset Foot +status open + +\begin_layout Plain Layout +众所周知,Unix的历史要比Windows久远,Windows的设计从Unix中汲取了很多营养,但是Windows的路径分隔符和Unix系统的路径分隔符截然相反 +,给后来的程序设计带来了一些困扰:你必须正确识别和处理不同操作系统的路径分隔符。你一定会想,要是当初微软在设计Windows的时候使用和Unix相同的路径分隔符 +,该多好!历史没有如果,现实如此残酷!欲知当初微软选择反斜杠作为文件分隔符的原因,请参考:https://blogs.msdn.microsoft.com/larry +osterman/2005/06/24/why-is-the-dos-path-character/。简单的说,Windows操作系统脱胎于Dos操作系统,在D +os操作系统中斜杠(/)已经作为命令行参数的分隔符了,因此Windows只好选用其他的分隔符(反斜杠)作为文件路径分隔符。 +\end_layout + +\end_inset + +作为目录分隔符,而其他所有操作系统(包括Linux、Unix、MacOS)都使用斜杠(/)作为目录分隔符。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意到,路径(Path)不仅仅是目录的意思。实际上,路径(Path)包含了以下几种情况: +\end_layout + +\begin_layout Itemize +纯粹文件名,比如:myfile.txt +\end_layout + +\begin_layout Itemize +纯粹目录,比如:/home/sili +\end_layout + +\begin_layout Itemize +绝对路径+文件名,比如:/home/lisi/myfile.txt +\end_layout + +\begin_layout Itemize +相对路径+文件名,比如:./lisi/myfile.txt +\end_layout + +\begin_layout Plain Layout +以上几种情况都是路径(Path)。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +相对路径和绝对路径 +\end_layout + +\begin_layout Standard +从形式上看,相对路径和绝对路径很容易区分:以目录分隔符(Linux系统使用/,windows系统使用 +\backslash +)为起点的路径是绝对路径,其他形式的路径是相对路径。下面是一些示例,都表示文件myfile.txt: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +# 假设当前位于/ +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +home/lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +./home/lisi/myfile.txt # 相对路径,.表示当前目录 +\end_layout + +\begin_layout Plain Layout +# 假设当前位于/home +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +./lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +# 假设当前位于/usr  +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +../home/lisi/myfile.txt # 相对路径,..表示上一级目录 +\end_layout + +\begin_layout Plain Layout +/home/lisi/../zhangsan/myfile.txt # 绝对路径 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Path类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:Path类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Path类是Java的新文件API的重点和核心,顾名思义,Path类代表了一个路径,一个Path对象包括了文件名和文件所在的目录,因此Path类中包含了处理文件 +和目录的相关方法。 +\end_layout + +\begin_layout Subsubsection +创建Path对象 +\end_layout + +\begin_layout Standard +利用Paths类(注意和Path类的区别)的get方法可以很方便的创建一个Path对象,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "CreatePathTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CreatePathTest.java" +lstparams "float,caption={CreatePathTest.java},label={CreatePathTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在Idea中利用调试功能可以方便的观察所创建的Path对象,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:在Ideal中通过调试观察Path对象" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/create-path-debug.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +在Ideal中通过调试观察Path对象 +\begin_inset CommandInset label +LatexCommand label +name "fig:在Ideal中通过调试观察Path对象" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +获取Path信息 +\end_layout + +\begin_layout Standard +Path对象的主要信息是目录分隔符隔开的一个字符串数组,可以通过getName方法返回这个数组的每个元素 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见本系列教程的“提高篇”,结合lambda表达式操作这个数组更方便,比如: +\end_layout + +\begin_layout Plain Layout +Path path = Paths.get( +\begin_inset Quotes eld +\end_inset + +/home/subaochen/test.txt +\begin_inset Quotes erd +\end_inset + +); +\end_layout + +\begin_layout Plain Layout +path.forEach(p -> System.out.println(p)); +\end_layout + +\end_inset + +,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathInfoTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathInfoTest.java" +lstparams "float,caption={PathInfoTest.java},label={PathInfoTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathInfoTest.java" + +\end_inset + +中涉及的主要方法的用法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Path信息相关方法" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +String toString() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +路径的字符串表达,自动根据不同操作系统使用了不同的目录分隔符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getFileName() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +路径中的最“远”对象,即Path路径数组的最后一个元素,可能是真实的文件名,也可能是一个子目录名。注意,getFileName方法的返回值是Path,因此打印g +etFileName实际上会调用返回的Path对象的toString方法。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getName(int index) +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回Path数组的第index个元素。路径中的第一个元素index为0,最后一个元素的index为count-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int getNameCount() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回Path中的元素个数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path subpath(int beginIndex, int endIndex) +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +非常类似于String类的subString的用法,返回Path中的一部分信息。beginIndex和endIndex分别指定起始index和终止Index。注 +意到,endIndex处的元素不包含在返回的Path中。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getParent() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前Path对象的上一级Path,大部分情况下,getParent相当于subpath(0,getNameCount() -1),即将Path数组最后一个元素去 +掉即为上一级Path。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getRoot() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回根路径。如果是相对路径,则返回null。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Path信息相关方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Path信息相关方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Path转换 +\end_layout + +\begin_layout Standard +Path转换主要通过 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Path转换方法" + +\end_inset + +中的3个方法实现的。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +URI toUri() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Uri +\end_layout + +\end_inset + +方式描述路径。对于本地文件(文件系统)使用file协议,因此URI的形式如file:///path-to-file +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path toAbsolutePath() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回绝对路径,这对于了解文件在文件系统的位置很有帮助 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path toRealPath(LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回真实的文件路径。该方法会检测文件是否存在,也是唯一一个检测文件是否存在的Path方法。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +really? +\end_layout + +\end_inset + +参数options决定了如何处理符号链接。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Path转换方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Path转换方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathConversionTest.java" + +\end_inset + +演示了Path转换的三种情况。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathConversionTest.java" +lstparams "float,caption={PathConversionTest.java},label={PathConversionTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +拼接Path +\end_layout + +\begin_layout Standard +Path类的resolve方法可以拼接路径,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathResolveTest.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathResolveTest.java" +lstparams "float,caption={PathResolveTest.java},label={PathResolveTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +需要注意的是,如果resolve的参数是一个绝对路径,则拼接的结果只是返回参数中的绝对路径,因此在resolve中应该避免传入一个绝对路径。 +\end_layout + +\begin_layout Plain Layout +拼接Path的另外一个方法是relativize,请参考JDK的相关文档。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +比较Path +\end_layout + +\begin_layout Standard +比较Path主要是通过3个方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:比较两个Path的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean equals(Object otherPath) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +重写了Object.equals方法,比较两个Path对象是否相同:两个Path对象代表的路径相同则两个Path对象相同 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean endsWith(Path other) +\end_layout + +\begin_layout Plain Layout +boolean endsWith(String other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断Path对象是否以给定的Path对象或者路径字符串结尾 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean startsWith(Path other) +\end_layout + +\begin_layout Plain Layout +boolean startsWith(String other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断Path对象是否以给定的Path对象或者路径字符串开头 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +比较两个Path的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:比较两个Path的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比较Path的示例参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathCompareTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCompareTest.java" +lstparams "float,caption={PathCompareTest.java},label={PathCompareTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Section +*Files类 +\begin_inset CommandInset label +LatexCommand label +name "sec:*Files类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files +\begin_inset Foot +status open + +\begin_layout Plain Layout +你可能会迷惑,为什么不命名为File类呢?很遗憾的是,File类是旧的(JDK 1.7之前)的Java文件操作API中的文件操作类,新的文件操作类只好叫做File +s了。通常,以单数命名的类用来表示一类事物,复数命名的类是工具辅助类类,比如Path表征路径,Paths是路径的工具辅助类。因此Files并不是一个很好的类的命 +名,这也是Java API无奈的选择。 +\end_layout + +\end_inset + +类是Java文件操作新API(java.nio.file包)中文件操作的核心类。相对于Path类,Files类聚焦于文件相关的操作: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +进一步概括说明Files类的功能 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +检查文件或者目录 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:Path类" + +\end_inset + +中我们看到,Path类的大多数方法不会检查文件或者目录是否存在,换句话说,Path中的大多数方法只是对给定的路径进行语法上的检查和操作。Files类的exist +s和notExists方法可以用来检查一个Path对象是否存在于实际的文件系统中,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathExistTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathExistTest.java" +lstparams "float,caption={PathExistTest.java},label={PathExistTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +exists返回false可能存在两种情况: +\end_layout + +\begin_layout Enumerate +文件或者目录不存在; +\end_layout + +\begin_layout Enumerate +文件或者目录不可见,即当前用户没有权限查看该文件或者目录。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们可以使用isReadable、isWritable、isExecutable进一步检查文件是否可读、可写、可执行,比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Path file = ...; +\end_layout + +\begin_layout Plain Layout + +boolean isRegularExecutableFile = Files.isRegularFile(file) & +\end_layout + +\begin_layout Plain Layout + + Files.isReadable(file) & Files.isExecutable(file); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +删除文件或者目录 +\end_layout + +\begin_layout Standard +Files.delete方法删除文件或者目录。需要注意的是,如果要删除的是目录,则目录必须是空的,否则删除失败。示例代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathDeleteTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathDeleteTest.java" +lstparams "float,caption={PathDeleteTest.java},label={PathDeleteTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsection +复制文件或者目录 +\end_layout + +\begin_layout Standard +Files.copy方法可以复制文件或者目录。默认情况下,copy方法不会覆盖目的文件,但是可以通过传递CopyOption参数影响复制的过程: +\end_layout + +\begin_layout Itemize +REPLACE_EXISTING:覆盖目的文件。 +\end_layout + +\begin_layout Itemize +COPY_ATTRIBUTES:也复制文件属性到目的文件。如果不设置此选项,只是复制文件本身,文件属性取决于目的目录的设置。 +\end_layout + +\begin_layout Itemize +NOFOLLOW_LINKS:复制符号链接而非符号链接指向的文件。 +\end_layout + +\begin_layout Standard +示例程序参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathCopyTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCopyTest.java" +lstparams "caption={PathCopyTest.java},label={PathCopyTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +Files.copy也支持复制文件到流,或者从流复制到文件: +\end_layout + +\begin_layout Itemize +copy(InputStream, Path, CopyOption...options) +\end_layout + +\begin_layout Itemize +copy(Path, OutputStream) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +移动文件或者目录 +\end_layout + +\begin_layout Standard +Files.move可以移动文件或者目录,文件或者目录改名也是要通过move方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathMoveTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathMoveTest.java" +lstparams "caption={PathMoveTest.java},label={PathMoveTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsection +操作文件或者目录的属性 +\end_layout + +\begin_layout Standard +我们经常见到元数据(metadata)这个说法。简单的说,元数据是描述数据的数据,或者说,一类事物的元数据描述了一类事物的属性。对照面向对象的概念我们可以看出, +元数据非常像类的属性。Java提供了一组读取或者设置文件属性的方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +文件大小 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static long size(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +获取文件的大小(字节数) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +创建时间 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +没有提供直接的方法获取文件的创建时间,需要首先获取BasicFileAttributeView,然后解析creationTime,比如: +\end_layout + +\begin_layout Plain Layout +Path file = ...; +\end_layout + +\begin_layout Plain Layout +BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); +\end_layout + +\begin_layout Plain Layout +System.out.println("creationTime: " + attr.creationTime()); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +最后修改时间 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static FileTime getLastModifiedTime(Path path, LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setLastModifiedTime(Path path, FileTime time) throws + IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取和设置文件的最后修改时间。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +属主 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static UserPrincipal getOwner(Path path, LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setOwner(Path path, UserPrincipal owner) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取或者设置文件的属主 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +所属组 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +没有提供相应的方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +访问控制属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static Set getPosixFilePermissions(Path path, + LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setPosixFilePermissions(Path path, Set + perms) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取或者设置文件的访问控制属性 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否目录 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isDirectory(Path path, LinkOption... + options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否目录 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否普通文件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isRegularFile(Path path, LinkOption... + options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否普通文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否符号连接 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isSymbolicLink(Path path) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否符号链接 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否隐藏文件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isHidden(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否隐藏文件。注意到,Windows和Linux判断隐藏文件的方法是不同的,Linux的隐藏文件以 +\begin_inset Quotes erd +\end_inset + +. +\begin_inset Quotes erd +\end_inset + +开头,而Windows的隐藏文件设置了“隐藏”属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +File操作文件属性的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:File操作文件属性的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +利用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +中的方法,一次只能读取或者设置一个文件属性,如果要同时读取或者设置多个文件属性显然比较低效,因此Java提供了批量读取或者设置文件属性的方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:批量读取文件属性的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Map readAttributes(Path path, String attributes, + LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +批量读取文件属性,参数attributes给出了所要读取的属性列表,*表示所有属性。属性名称和FileAttributes各子类的属性字段定义相同,参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/FileAttributeVie +w.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static A readAttributes(Path path, + Class type, LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +批量读取文件属性,参数type是BasicFileAttributes的子类,返回结果和请求参数type相同。此方法更加“面向对象”一些,在IDE的帮助下不容易 +出错,因此建议采用此方法批量读取文件属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +批量读取文件属性的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:批量读取文件属性的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +不同操作系统的文件系统存在不小的差别,文件和目录的属性也各不相同,Java为了能够隐藏这些差异和细节,将文件和目录的属性做了进一步的封装,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:文件属性接口" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/fileattributes.eps + lyxscale 300 + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文件属性接口 +\begin_inset CommandInset label +LatexCommand label +name "fig:文件属性接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +BasicFileAttributes及其子接口只是定义了读取文件属性的方法,如何更新(修改)文件属性呢?Java进一步封装了在各种情况下操作文件属性的Attr +ibuteView类,即可以读取文件属性,也可以更新文件属性,同时屏蔽了不同操作系统的差异,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:读取和设置文件属性的View接口" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/FileAttributeView.eps + lyxscale 300 + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +读取和设置文件属性的View接口 +\begin_inset CommandInset label +LatexCommand label +name "fig:读取和设置文件属性的View接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +FileAttribes和FileAttributeView的区别,感觉没说清楚? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +读取文件属性,包括:文件大小、最后修改时间、是否普通文件等。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathMetadataTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathMetadataTest.java" +lstparams "caption={PathMetadataTest.java},label={PathMetadataTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +creationTime: 2016-12-12T02:49:04Z +\end_layout + +\begin_layout Plain Layout +lastAccessTime: 2016-12-12T02:51:47Z +\end_layout + +\begin_layout Plain Layout +lastModifiedTime: 2016-12-12T02:49:04Z +\end_layout + +\begin_layout Plain Layout +isDirectory: false +\end_layout + +\begin_layout Plain Layout +isOther: false +\end_layout + +\begin_layout Plain Layout +isRegularFile: true +\end_layout + +\begin_layout Plain Layout +isSymbolicLink: false +\end_layout + +\begin_layout Plain Layout +size: 0 +\end_layout + +\begin_layout Plain Layout +now lastModifiedTime is:2016-12-13T23:54:11Z +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +使用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +中的方法一次只能读取或者设置一个文件的属性,因此如果要一次读取或者设置多个文件属性的话,建议使用readAttributes方法较为高效。 +\end_layout + +\begin_layout Subsection +创建、读写文件 +\end_layout + +\begin_layout Subsubsection +读写小文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:读写小文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files类为读写小文件 +\begin_inset Foot +status open + +\begin_layout Plain Layout +多小的文件算是小文件?因为readAllBytes是把文件全部内容读到一个byte数组中,因此文件的尺寸取决于你的内存多少。但是,并不是所有的内存都可以用来保存 +文件内容的,因此使用这里的方法时要考虑到能够处理的文件的最大尺寸限制。 +\end_layout + +\end_inset + +提供了方便的write和readAllBytes方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:读写小文件的方便方法" + +\end_inset + +。可以看出, +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:读写小文件的方便方法" + +\end_inset + +中的方法不需要和输入输出流直接打交道。实际上,Files类的方法是对输入输出流的进一步封装,比如readAllBytes方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见openjdk的jdk/src/java.base/share/classes/java/nio/file/Files.java +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static byte[] readAllBytes(Path path) throws IOException { + +\end_layout + +\begin_layout Plain Layout + + try (SeekableByteChannel sbc = Files.newByteChannel(path); +\end_layout + +\begin_layout Plain Layout + + InputStream in = Channels.newInputStream(sbc)) { +\end_layout + +\begin_layout Plain Layout + + long size = sbc.size(); +\end_layout + +\begin_layout Plain Layout + + if (size > (long)MAX_BUFFER_SIZE) +\end_layout + +\begin_layout Plain Layout + + throw new OutOfMemoryError("Required array size too large"); +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + return read(in, (int)size); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Path write(Path path, byte[] bytes, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将bytes数组写入到文件path中。OpenOption在StandardOpenOption这个Enum中定义: +\end_layout + +\begin_layout Itemize +READ:为读打开文件 +\end_layout + +\begin_layout Itemize +WRITE:为写打开文件 +\end_layout + +\begin_layout Itemize +APPEND:如果可写则追加写入内容到文件末尾 +\end_layout + +\begin_layout Itemize +CREATE:如果文件不存在则创建 +\end_layout + +\begin_layout Itemize +CREATE_NEW:创建新文件;如果文件已经存在则失败,优先级高于CREATE +\end_layout + +\begin_layout Itemize +TRUNCATE_EXISTING:如果文件可写并且已经存在则截断文件尺寸为0 +\end_layout + +\begin_layout Itemize +DELETE_ON_CLOSE:文件操作结束(close)后自动删除文件,这对于临时文件很有用 +\end_layout + +\begin_layout Itemize +DSYNC:自动同步文件的内容到存储介质 +\end_layout + +\begin_layout Itemize +SYNC:自动同步文件的内容和原信息到存储介质 +\end_layout + +\begin_layout Itemize +SPARSE:创建稀疏文件 +\begin_inset Foot +status open + +\begin_layout Plain Layout +稀疏文件是指创建文件的时候并不真正分配空间,只有真正写入文件的时候才逐步分配空间。 +\end_layout + +\end_inset + +,如果文件系统支持的话 +\end_layout + +\begin_layout Plain Layout +默认是CREATE, TRUNCATE_EXISTING和WRITE,即如果文件不存在则创建,如果文件已存在则截断长度为0。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Path write(Path path, Iterable lines, + Charset cs, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将文本lines写入文件path中。lines以System.getProperty( +\begin_inset Quotes eld +\end_inset + +line.separator +\begin_inset Quotes erd +\end_inset + +)为行分隔符,并使用给定的(cs)编码 +\begin_inset Foot +status open + +\begin_layout Plain Layout +Java 1.7之后引入了StandCharsets类定义了常见的编码方式,参见:https://docs.oracle.com/javase/8/docs/api/ +java/nio/charset/StandardCharsets.html +\end_layout + +\end_inset + +为byte数组。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static byte[] readAllBytes(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path读取所有内容到byte数组。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static List readAllLines(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读文件path的所有行到List中,行分隔符为 +\backslash +r +\backslash +n(windows下)或 +\backslash +r(Mac下)或 +\backslash +n(Linux下)。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static List readAllLines(Path path, Charset cs) throws IOExceptio +n +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读文件path的所有行到List中,并使用cs编码将byte解码为字符串。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +读写小文件的方便方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:读写小文件的方便方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Example +读写小文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathCreateTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCreateTest.java" +lstparams "caption={PathCreateTest.java},label={PathCreateTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下,只是简单的输出了文件的内容: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +test string +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Subsubsection +带缓存的文本文件处理方法 +\end_layout + +\begin_layout Standard +处理文本文件时,通常需要借助于缓存提高效率,我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:面向字符的流" + +\end_inset + +中已经讨论过。Files类提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Files中带缓存的文本读写方法" + +\end_inset + +的方法更进一步简化了文本文件的处理。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedReader用于读取文件内容,使用UTF-8解码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedReader newBufferedReader(Path path, Charset cs) throws + IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedReader用于读取文件内容,文件内容以cs方式解码,默认使用UTF-8解码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedWriter用于写入文件内容,使用UTF-8编码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedWriter用于写入文件内容,文件内容以cs方式编码,默认使用UTF-8编码。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files中带缓存的文本读写方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files中带缓存的文本读写方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的代码片段演示了newBufferedReader的用法: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Charset charset = Charset.forName("UTF-8");// or Charset charset = StandCharsets.U +TF-8; +\end_layout + +\begin_layout Plain Layout + +try (BufferedReader reader = Files.newBufferedReader(file, charset)) { +\end_layout + +\begin_layout Plain Layout + + String line = null; +\end_layout + +\begin_layout Plain Layout + + while ((line = reader.readLine()) != null) { +\end_layout + +\begin_layout Plain Layout + + System.out.println(line); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} catch (IOException x) { +\end_layout + +\begin_layout Plain Layout + + System.err.format("IOException: %s%n", x); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +等价于下面的代码片段(如果文件是UTF-8编码的话): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try (BufferedReader reader = Files.newBufferedReader(file)) { +\end_layout + +\begin_layout Plain Layout + + String line = null; +\end_layout + +\begin_layout Plain Layout + + while ((line = reader.readLine()) != null) { +\end_layout + +\begin_layout Plain Layout + + System.out.println(line); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} catch (IOException x) { +\end_layout + +\begin_layout Plain Layout + + System.err.format("IOException: %s%n", x); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +使用不带缓存的输入输出流 +\end_layout + +\begin_layout Standard +Files同样封装了不带缓存的输入输出流,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Files中不带缓存的输入输出流" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static InputStream newInputStream(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个InputStream用于读取文件内容 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static OutputStream newOutputStream(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个OutputStream用于写入文件内容 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files中不带缓存的输入输出流 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files中不带缓存的输入输出流" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +Files对不带缓存的输入流的封装 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathWithoutBufferTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathWithoutBufferTest.java" +lstparams "caption={PathWithoutBufferTest.java},label={PathWithoutBufferTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行的结果如下(简单的打印出了之前写入的内容): +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Hello World! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +newInputStream返回一个不带缓存的输入流,但是这个例子又根据这个不带缓存的输入流构造了一个BufferedReader以便以行的方式读入文本。你可能 +会问,为什么不直接使用带缓存的newBufferedReader方法呢?是的,在这个例子中,使用newBufferedReader直接返回一个BufferedR +eader更方便,本例只是演示如何构造一个不带缓存的输入流。 +\end_layout + +\begin_layout Subsubsection +channel方式读写文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:channel方式读写文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +流(stream)是按照字节为单位读写文件的,channel +\begin_inset Note Note +status open + +\begin_layout Plain Layout +如何翻译?通道? +\end_layout + +\end_inset + +是按照缓冲区为单位读写文件的,也就是说,channel是自然带缓冲的,可以一次处理一个缓冲区。SeekableByteChannel内部维护着一个表示当前位置的 +指针,通过移动该指针可以实现随机文件读写,参见 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:随机读写文件" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +Files类的Channel读写文件方法见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Files类的Channel读写文件方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static SeekableByteChannel newByteChannel(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel +\end_layout + +\end_inset + +用于读写文件内容,默认是只读打开Channel的。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static SeekableByteChannel newByteChannel(Path path, Set options, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel +\end_layout + +\end_inset + +用于读写文件内容,attrs设置文件的属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files类的Channel读写文件方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files类的Channel读写文件方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +使用Channel读写文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileRandomAccessTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileChannelTest.java" +lstparams "caption={FileChannelTest.java},label={FileChannelTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +打印出myfile.txt的内容,不再列出。 +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +和Stream不同,使用Channel读写文件的要点是一次处理一个buffer,因此如何使用Buffer就称为用好Channel的关键。可以借助于Java的Bu +ffer类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:Buffer的类层次结构" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer.eps + lyxscale 200 + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Caption Standard + +\begin_layout Plain Layout +Buffer的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Buffer的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的讨论以ByteBuffer为例,其他类型的Buffer用法类似。 +\end_layout + +\begin_layout Standard +ByteBuffer实际上是一块可以写入和读取数据的内存,Java提供了若干方便的方法操作这块内存,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +,我们假设创建了一个大小为8个字节的ByteBuffer。要理解ByteBuffer的用法,需要首先理解ByteBuffer的三个基本属性: +\end_layout + +\begin_layout Itemize +capacity:ByteBuffer的大小,即占用多少个字节的内存空间。每个ByteBuffer在创建时需要指定capacity,一旦设定不允许改变,这里ca +pacity=8。 +\end_layout + +\begin_layout Itemize +limit:下一次读或者写允许操作的字节数。在写模式下,limit表示当前最多能够向Buffer写多少数据。在读模式下,limit表示当前最多能够读到多少数据。 +\end_layout + +\begin_layout Itemize +position:下一个可以读或者写的字节的位置索引,position的最大值为capacity - 1。在写模式下,position的初始值为0,当写入数据( +字节)后,position移动到下一个可写入的位置,比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +中,在写入3个字节的数据后,当前position=3。如果此时切换这个ByteBuffer到读模式,则position需要指向下一个可读的字节位置,显然应该将p +osition置为0,limit置为3(即当前position的值),即从Buffer的开头开始能够一次读3个字节的数据,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +的“读模式”所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer-usage.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +ByteBuffer的用法 +\begin_inset CommandInset label +LatexCommand label +name "fig:ByteBuffer的用法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Buffer通过flip方法从写模式切换到读模式,通常对Buffer的操作流程为: +\end_layout + +\begin_layout Enumerate +写入数据到Buffer,在这里是通过Channel的read方法写入数据到Buffer,也可以通过Buffer提供的各种put方法写入数据。 +\end_layout + +\begin_layout Enumerate +调用flip方法切换到读模式。 +\end_layout + +\begin_layout Enumerate +从Buffer中读取数据。 +\end_layout + +\begin_layout Enumerate +调用clear或者compact方法清空缓冲区。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +使用Idea可以方便的观察和学习Buffer中capacity、limit、position的变化情况,如下图所示。 +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer-idea-debug.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +读写文件的方法很多,何时使用InputStream/OutputStream/InputReader/OutputReader,何时使用Files方法读写文件? +一般的原则是什么? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +创建文件和临时文件 +\end_layout + +\begin_layout Standard +Files也提供了创建文件和临时文件的方便API,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Files创建文件和临时文件的方法" + +\end_inset + +。createFile和createTempFile被设计为“原子操作”,即首先检查文件是否存在(存在则抛出异常),然后创建一个空文件病设置为指定或者默认的属性 +,因此createFile的安全性要比其他方法高些。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +其他方法是哪些方法?stream?Channel?是否可以对比说明? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createFile(Path path, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据path创建属性为attrs的文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createTempFile(Path dir, String prefix, String suffix, + FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建属性为attrs的临时文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createTempFile(String prefix, String suffix, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建属性为attrs的临时文件 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files创建文件和临时文件的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files创建文件和临时文件的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +使用createFile创建文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileCreateTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileCreateTest.java" +lstparams "caption={FileCreateTest.java},label={FileCreateTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行应用程序后检查所创建文件的属性如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +~/test$ ls -l testcreate.txt +\end_layout + +\begin_layout Plain Layout +-rw-rw-r-- 1 subaochen subaochen 0 12月 16 08:20 testcreate.txt +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +createFile时如果没有给出文件属性则默认创建664属性的文件,即用户自己、所属组都可读写,其他所有人均只读。可以通过给出FileAttribute灵活设 +置属性,比如下面的代码片段设置为只对用户自己可读写: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Path file = ...; +\end_layout + +\begin_layout Plain Layout + +Set perms = +\end_layout + +\begin_layout Plain Layout + + PosixFilePermissions.fromString("rw-------"); +\end_layout + +\begin_layout Plain Layout + +FileAttribute> attr = +\end_layout + +\begin_layout Plain Layout + + PosixFilePermissions.asFileAttribute(perms); +\end_layout + +\begin_layout Plain Layout + +Files.createFile(file, attr); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,在/tmp创建一个临时文件temp.log,并观察此临时文件的属性 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,创建一个对所有人只读的文件,并验证所创建文件的属性 +\end_layout + +\begin_layout Subsection +随机读写文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:随机读写文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:读写小文件" + +\end_inset + +中其实我们已经看到,SeekableByteChannel已经具有随机读写文件的能力了:SeekableByteChannel的下列方法帮助我们确定读写的起始位 +置和数量: +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +long position() throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回文件的当前位置,即读和写的起始位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel position(long newPosition) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +设置Channel的当前位置,返回这个Channel(便于函数式编程) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +long size() throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回这个Channel的大小 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel truncate(long size) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +截断这个Channel到给定的大小 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int read(ByteBuffer dst) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从Channel读数据到dst +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int write(ByteBuffer src) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将dst的数据写入Channel +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +SeekableByteChannel的随机读写方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:SeekableByteChannel的随机读写方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +为了更方便的操作文件,JDK提供了对SeekableByteChannel的进一步封装:FileChannel,除SeekableByteChannel中的方法 +外,FileChannel增加了一些高级特性,比如可以将文件的指定区域映射到内存中以便快速访问,锁定文件的指定区域(不允许其他线程进行操作),从任意位置直接读写 +文件等。我们有两种方式获取一个FileChannel: +\end_layout + +\begin_layout Enumerate +通过Path.newByteChannel获得一个SeekableByteChannel,然后强制类型转换为FileChannel。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这种类型转换安全吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +通过FileInputStream.getChannel获取一个FileChannel。 +\end_layout + +\begin_layout Enumerate +通过FileChannel.open方法直接获得一个FileChannel。推荐采用此种方式。 +\end_layout + +\begin_layout Example +使用FileChannel读写文件,假设文件myfile.txt原来有如下的内容: +\end_layout + +\begin_layout Example +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Java programming language is good! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileRandomAccessTest.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileRandomAccessTest.java" +lstparams "caption={FileRandomAccessTest.java},label={FileRandomAccessTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +I was here! +\end_layout + +\begin_layout Plain Layout +ming language is good!Java programI was here! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,在文件的开头写入了 +\begin_inset Quotes erd +\end_inset + +I was here! +\backslash +n +\begin_inset Quotes erd +\end_inset + +,然后把文件开头原先的 +\begin_inset Quotes erd +\end_inset + +Java program +\begin_inset Quotes erd +\end_inset + +移动到了文件的最后,并在最后追加了 +\begin_inset Quotes erd +\end_inset + +I was here! +\backslash +n +\begin_inset Quotes erd +\end_inset + +。 +\end_layout + +\begin_layout Standard +本程序可以反复运行,结果完全一致。 +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +FileChannel提供的文件随机读写概念,重要的是理解两个position的用法: +\end_layout + +\begin_layout Itemize +FileChannel的position,用于确定从什么地方开始读写文件; +\end_layout + +\begin_layout Itemize +ByteBuffer的position,用于确定从什么地方开始读写ByteBuffer; +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +FileChannel、InputStream/OutputStream、ByteBuffer之间的关系和用法可以形象的用下图表示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/file-channel-stream-buffer.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +简单的说,ByteBuffer处于“中心”的位置,无论是从文件系统、网络读入的数据,还是准备写入文件系统、网络的数据,都是通过ByteBuffer的。因此,其他 +数据类型如何转换为ByteBuffer以及ByteBuffer如何转换为其他数据类型就显得非常重要,上图的大部分篇幅展示了这种相互转换的方法。 +\end_layout + +\begin_layout Plain Layout +我们可以看出,ByteBuffer转换为其他数据类型已经非常方便了,但是从其他数据类型转换为ByteBuffer的通道却不是很流畅,比如从short[]转换为一 +个ByteBuffer,目前没有直接的方法,只能通过遍历这个short数组,然后将数组的每个元素放入ByteBuffer这种稍微曲折的方法: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +ByteBuffer bb; +\end_layout + +\begin_layout Plain Layout + +... +\end_layout + +\begin_layout Plain Layout + +for(short s:short_array) { +\end_layout + +\begin_layout Plain Layout + + bb.putShort(s); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +相信JDK的未来版本会提供更丰富和合理的ByteBuffer和其他数据类型的相互转换方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +目录操作 +\end_layout + +\begin_layout Standard +目录是一种特殊的文件,我们前面介绍的很多API(所有接受Path作为参数的API)即可以操作文件,也可操作目录。但是毕竟目录的操作有其特殊性,比如下面的情形: +\end_layout + +\begin_layout Itemize +创建一个空目录 +\end_layout + +\begin_layout Itemize +列出目录下的所有子目录 +\end_layout + +\begin_layout Itemize +列出目录下的所有文件 +\end_layout + +\begin_layout Itemize +根据给定的规则列出目录下的文件和目录 +\end_layout + +\begin_layout Standard +JDK的Files类同样给出了目录操作的方便方法,分述如下。 +\end_layout + +\begin_layout Subsubsection +创建目录 +\end_layout + +\begin_layout Standard +Files类创建目录主要是两个方法,createDirectory用于创建一级目录,createDirectories用于创建多级目录,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:创建目录的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createDirectory(Path dir, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir和attrs创建一个目录。如果没有attrs参数则创建默认属性的目录。如果目录已经存在则抛出FileAlreadyExistsException异常。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createDirectories(Path dir, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建多级目录 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +创建目录的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:创建目录的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +创建目录 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CreateDirectoryTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CreateDirectoryTest.java" +lstparams "caption={CreateDirectoryTest.java},label={CreateDirectoryTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +第一次运行时终端没有任何显示,但是当我们去往test目录查看时,应该可以看到test目录下面多了一个新目录a。 +\end_layout + +\begin_layout Standard +当第二次运行该程序时,终端显示: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +java.nio.file.FileAlreadyExistsException: /home/subaochen/test/a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,如果dir目录已经存在,则createDirectory方法抛出FileAlreadyExistsException异常。 +\end_layout + +\begin_layout Standard +我们删除a目录,但是创建一个文件名字叫做a,即在test目录执行下列命令: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +~/test$ rmdir a; touch a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +再次执行本程序,终端显示: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +java.nio.file.FileAlreadyExistsException: /home/subaochen/test/a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +即,如果要创建的目录和文件重名也是不允许的,同样抛出FileAlreadyExistsException。 +\end_layout + +\begin_layout Exercise +使用Files.createDirectories创建目录test/a/b/c +\end_layout + +\begin_layout Subsubsection +列出目录 +\begin_inset CommandInset label +LatexCommand label +name "subsec:列出目录" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files的newDirectoryStream方法可以很方便的列出目录下的内容,包括子目录、文件、隐藏文件等,但是需要注意的是,newDirectoryStr +eam不是一个递归的过程,即不能深入到当前目录的子目录查找内容。 +\end_layout + +\begin_layout Example +利用newDirectoryStream方法列出当前目录下的文件、子目录等。 +\begin_inset CommandInset label +LatexCommand label +name "exa:列出当前目录下的文件、子目录等。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "ListDirectoryTest.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/ListDirectoryTest.java" +lstparams "caption={ListDirectoryTest.java},label={ListDirectoryTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +要注意到newDirectoryStream返回的是一个stream,因此和InputStream等用法类似,一定要记得用完后close这个stream。try +-with-resources结构能够自动关闭stream,如果使用try-catch结构,则要在finanlly块中执行stream.close()方法关闭st +ream。 +\end_layout + +\begin_layout Exercise +如何利用newDirectoryStream方法递归的列出当前目录下的内容,包括子目录下的文件及其子目录? +\end_layout + +\begin_layout Subsubsection +根据规则列出目录 +\end_layout + +\begin_layout Standard +newDirectoryStream允许传入Glob +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +appendixname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:什么是Glob?" + +\end_inset + + +\end_layout + +\end_inset + +过滤规则作为参数。 +\end_layout + +\begin_layout Example +列出当前目录下的所有java源代码和java class文件。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "ListDirectoryWithGlobTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/ListDirectoryWithGlobTest.java" +lstparams "caption={ListDirectoryWithGlobTest.java},label={ListDirectoryWithGlobTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计和分析 +\end_layout + +\begin_layout Standard +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:列出当前目录下的文件、子目录等。" + +\end_inset + +相比,我们看到newDirectoryStream方法只是多了一个参数:表明如何过滤本目录下的内容。 +\end_layout + +\begin_layout Subsection +遍历目录:FileVisitor接口 +\end_layout + +\begin_layout Standard +在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:列出目录" + +\end_inset + +中我们看到了,可以利用Files.newDirectoryStream列出当前目录下的内容,但是newDirectoryStream不是递归处理的,因此Files +类提供了遍历目录的另外方式:使用FileVisitor接口可以更方便的遍历目录。 +\end_layout + +\begin_layout Standard +首先实现FileVisitor接口,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PrintFiles.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PrintFiles.java" +lstparams "caption={PrintFiles.java},label={PrintFiles.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +然后可以在主类中使用FileVisitor接口遍历目录了,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WalkFileTreeTest.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/WalkFileTreeTest.java" +lstparams "caption={WalkFileTreeTest.java},label={WalkFileTreeTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +这里的关键是,walkFileTree方法会递归的遍历给定的目录,但是对于递归过程中遇到的每一个项目如何处理呢?我们看到walkFileTree的第二个参数是一 +个实现了FileVisitor接口的对象,这个对象决定了如何处理这些遇到的目录项目,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:FileVisitor接口方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws + IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在访问(操作)目录之前的动作,比如准备将目录复制到另外的目录中等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在访问(操作)目录之后的动作,比如访问目录后可以将目录删除等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +访问目录中的文件。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult visitFileFailed(T file, IOException exc) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果访问文件失败则调用此方法。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FileVisitor接口方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:FileVisitor接口方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +*访问属性文件 +\begin_inset CommandInset label +LatexCommand label +name "sec:读写属性文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +属性文件通常用来保存应用程序的配置信息,这样当应用程序的配置改变时,只需要修改属性文件(配置文件)即可,不需要修改应用程序的源代码,维护比较方便。属性文件的内容 +通常是以key、value对的形式出现,即key=value的形式,比如数据库相关的应用程序中通常将数据库服务器的IP地址、用户名、密码等信息保存到如下的属性文 +件中: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +hostname=192.168.1.200 +\end_layout + +\begin_layout Plain Layout +username=postgres +\end_layout + +\begin_layout Plain Layout +password=password +\end_layout + +\begin_layout Plain Layout +database=mydb +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的Properties类提供了方便的API读写这样的属性文件。 +\end_layout + +\begin_layout Example +访问属性文件 +\begin_inset CommandInset label +LatexCommand label +name "exa:访问属性文件" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PropertyFileTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PropertyFileTest.java" +lstparams "caption={PropertyFileTest.java},label={PropertyFileTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行本应用程序结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +hostname=localhost +\end_layout + +\begin_layout Plain Layout +password=password +\end_layout + +\begin_layout Plain Layout +database=mydb +\end_layout + +\begin_layout Plain Layout +username=postgres +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计和分析 +\end_layout + +\begin_layout Standard +本例中,我们使用了FileInputStrem和FileOutputStream构造了一个文件输入输出流,FileInpoutStream和FileOutput +Stream的参数是文件名,注意到该文件名是相对于项目根目录的。 +\end_layout + +\begin_layout Standard +实际上, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +Java在定位文件时,有如下的几种策略 +\end_layout + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +参考了: +\end_layout + +\begin_layout Itemize +http://www.cnblogs.com/yinger/archive/2011/09/08/2171831.html +\end_layout + +\begin_layout Itemize +官方教程:https://docs.oracle.com/javase/tutorial/essential/environment/properties.html +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Itemize +绝对路径:在FileInputStream、FileOutputStream中如果参数的路径使用路径分隔符(windows下是 +\backslash +,Linux下是/)开头则是绝对路径。 +\end_layout + +\begin_layout Itemize +相对于项目的路径:在FileInputStream、FileOutputStream中如果参数的路径没有使用路径分隔符(windows下是 +\backslash +,Linux下是/)开头则是项目于项目根目录的相对路径。 +\end_layout + +\begin_layout Itemize +相对于当前class文件的路径:如果使用Class.getResourceAsStream方法,则获得相对于当前class文件的路径,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getResourceAsStream(database-config.prope +rties); +\end_layout + +\end_inset + +path对象指向的文件database-config.properties和class文件在同一个目录下,即database-config.properties位于 +src/cn/edu/sdut/softlab目录下。 +\begin_inset Newline newline +\end_inset + +但是,如果参数是绝对路径,则获得是相对于包的文件路径,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getResourceAsStream(/database-config.prop +erties); +\end_layout + +\end_inset + +则文件database-config.properties位于src目录下。 +\end_layout + +\begin_layout Itemize +相对于包的路径:如果使用Class.getClassLoader().getResourceAsStream方法,则获得是相对于包路径的文件,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getClassLoader().getResourceAsStream(data +base-config.properties); +\end_layout + +\end_inset + +即文件database-config.properties位于src目录下。 +\begin_inset Newline newline +\end_inset + +同时需要注意到,Class.getClassLoader.getResourceAsStream的参数不允许使用绝对路径,否则返回的InputStream为null +。 +\end_layout + +\begin_layout Standard + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture11.lyx b/guide/lecture_guide/lecture11.lyx new file mode 100644 index 0000000..82537a8 --- /dev/null +++ b/guide/lecture_guide/lecture11.lyx @@ -0,0 +1,10427 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +coderemarks +logicalmkup +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十一次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:从键盘输入数据" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:从键盘输入数据" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Scanner类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Scanner类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:文件操作" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:文件操作" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java从键盘输入的深刻理解; +\end_layout + +\begin_layout Enumerate +Java文件操作的基本API; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +深刻理解Java从键盘接收输入的过程; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +从键盘输入入手,深刻理解Java的I/O类是如何相互协作的; +\end_layout + +\begin_layout Enumerate +掌握Java的文件操作API; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +猜测一下,Scanner类是如何封装输入操作的?找到JDK源代码研读一下,验证自己的想法。 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +Java的IO +\begin_inset CommandInset label +LatexCommand label +name "chap:Java的IO" + +\end_inset + + +\end_layout + +\begin_layout Standard +输入输出(IO)看起来简单,但是却头绪繁多、内容繁杂。这是因为我们要处理的输入输出设备种类众多,导致Java通过面向对象的方式对输入输出设备及其操作的封装也比较 +复杂,因此建议读者在学习本章内容的时候要经常跳出具体的技术细节,回到下图从总体上把握Java IO的体系。 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/io/Java-IO.png + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +内容是否太多?不容易理出一个头绪来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Section +C的IO回顾 +\begin_inset CommandInset label +LatexCommand label +name "sec:C的IO回顾" + +\end_inset + + +\end_layout + +\begin_layout Standard +在C语言中,输入输出的概念分为两个层面: +\end_layout + +\begin_layout Itemize +输入输出的“源”都被看做设备,使用设备描述符 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +设备描述符 +\end_layout + +\end_inset + +来区分不同的输入输出源。 +\end_layout + +\begin_layout Itemize +从设备输入或者输出的数据通过“流”(stream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +stream +\end_layout + +\end_inset + +)模型来处理,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:C的输入模型" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:C的输出模型" + +\end_inset + +。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +把下图的输入流和输出流画成管道的形状 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/c-input.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的输入模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:C的输入模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/c-output.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +C的输出模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:C的输出模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓的“流”(stream),是一个仅容一个bit数据通过的管道,即数据的有序序列,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:输入流模型" + +\end_inset + +所示。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这个图似乎表达的不是很清楚? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/input-stream.eps + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +输入流模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:输入流模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Quotes eld +\end_inset + +流模型”的最大好处是,每个I/O函数都尽力做最好的自己即可,通过“流模型”可以将不同的I/O函数串联起来协同完成更复杂的IO操作。Java的IO体系也借鉴了C中 +的IO设计,只不过C是面向过程的语言,IO的处理是通过函数来完成的,而Java是面向对象的方式来处理IO,IO的操作是通过不同的IO操作类来完成的。 +\end_layout + +\begin_layout Section +Java的IO体系 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的IO体系" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java继承了C对输入输出的基本认识:无论输入输出来自何处(设备),去往何处(设备),一律当做“流”的方式来处理。流就像一个仅容一个bit数据通过的管道一样,是 +一个有序的数据序列。如果我们按照8位(1个字节)来分割解读流中的数据序列,就是“面向字节的流”,有时也简称“字节流 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +字节流 +\end_layout + +\end_inset + +”;如果我们以16位(2个字节,即1个字符)来分割和解读流中的数据,就是“面向字符的流”,有时也简称“字符流 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +字符流 +\end_layout + +\end_inset + +”。其实,字节流和字符流的区分并没有改变流的数据本质,只是我们以不同的视角解读数据罢了,就像一部红楼,经学家看见《易》,道学家看见淫,才子看见缠绵,革命家看见排 +满,流言家看见宫闱秘事 +\begin_inset Foot +status open + +\begin_layout Plain Layout +出自《鲁迅全集-集外集拾遗补编•<绛洞花主>小引》 +\end_layout + +\end_inset + +。红楼还是那部红楼,不同的人,不同的场合,不同的视角,不同的解读而已。 +\end_layout + +\begin_layout Standard +Java IO相关的类在包java.io中。 +\end_layout + +\begin_layout Subsection +面向字节的流 +\begin_inset CommandInset label +LatexCommand label +name "subsec:面向字节的流" + +\end_inset + + +\end_layout + +\begin_layout Standard +所谓面向字节的流,是指流中的数据按照字节来解释,即每8位(1个字节)为一个解读的单元。Java提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的InputStream类层次结构" + +\end_inset + +所示的面向字节的流的处理类层次结构。其中的节点流是指直接与输入输出设备打交道处理I/O操作的类,处理流是指对原始数据进行二次加工的类。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream.eps + width 100line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的InputStream/OutputStream类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java的InputStream类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的InputStream类层次结构" + +\end_inset + +中的InputStream/OutputStream的子类有各自的应用场景,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:InputStream/OutputStream子类的适用场景" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FileInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取二进制文件,比如图片、音视频等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +PipedInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +提供了管道化操作的具体实现:PipedInputStream通常和一个PipedOutputStream关联在一起,即PipedOutputStream的输出送 +给PipedInputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ByteArrayInput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将一个字节数组当做一个InputStream来处理。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +SequenceInput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将多个InputStream收尾相接组成一个新的InputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FilterInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +顾名思义,FilterInputStream接受一个InputStream作为参数,然后对这个InputStream中的数据做相应的处理后再输出。即,Filte +rInputStream通常用来对数据进行筛选、变换、编码等处理,FilterInputStream的不同子类已经实现了若干的过滤处理,常见的FilterInp +utStream的子类如下: +\end_layout + +\begin_layout Description +BufferedInputStream: 对于任何InputStream提供了缓存处理功能,提高了输入处理的效率。 +\end_layout + +\begin_layout Description +DataInputStream: 如果我们确定InputStream中存储的是基本类型数据,则可以借助于DataInputStream提供的读取基本类型数据方法 +简化操作,这些方法直接返回所需要的基本类型变量,比如readInt。注意到DataInputStream也实现了DataInput接口,在DataInput接口 +中规范了读取基本类型数据的方法。 +\end_layout + +\begin_layout Description +PushBackInputStream: 通常,我们从InputStream读取一个字节后,这个字节就从InputStream移除了,再次从InputStrea +m读取数据会从下一个字节开始。PushBackInputStream的设计目的是把刚刚读取的字节再次送回InputStream,以便有机会再次读取这个字节的数据 +。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ObjectInputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于对基本数据类型和对象的序列化处理,通常和ObjectOutputStream联合使用,即ObjectInputStreamream所读取的数据通常是由Obj +ectOutputStream写入的。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream输入流 +\begin_inset CommandInset label +LatexCommand label +name "tab:InputStream/OutputStream子类的适用场景" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +类名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FileOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写入二进制文件,比如图片、音视频等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +PipedOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +通常和一个PipedInputStream关联在一起实现管道化操作 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ByteArrayOutput\SpecialChar softhyphen +Stream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写入到一个字节数组中 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +FilterOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +接受一个OutputStream作为参数,在数据写入OutputStream之前进行一定的处理。常见的FilterOutputStream子类如下: +\end_layout + +\begin_layout Itemize +DataOutputStream: 将基本数据类型写入OutputStream,便于使用DataInputStream读入处理。 +\end_layout + +\begin_layout Itemize +BufferedOutputStream:对于任何OutputStream提供了缓存处理功能,提高了输出处理的效率。 +\end_layout + +\begin_layout Itemize +PrintStream: 自动刷新缓冲区的OutputStream。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ObjectOutputStream +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +用于对基本数据类型和对象的序列化处理。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +OutputStream输出流 +\begin_inset CommandInset label +LatexCommand label +name "tab:OutputStream子类的适用场景" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +InputStream是个抽象类,是所有字节输入流的父类,其中定义了一些基本的字节输入流的操作方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:InputStream的常用方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract int read() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取下一个字节,字节值为0~255。如果输入流不再有数据则返回-1。该方法是一个阻塞方法,直到有数据可读或者数据流结束,或发生异常才返回。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(byte[] b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取一组数据存入缓冲区b中,返回所读取字节的个数。如果返回-1表示数据流结束。该方法相当于read(b, 0, b.length)。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(byte[] b, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流读取最多len字节数据存入缓冲区b中,存储位置从b的第off个位置开始。该方法返回读取的字节数,如果返回-1表示数据流结束。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int available() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回当前输入流可供读取的字节数。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void mark(int readLimit) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在输入流中标记当前位置,以后可以调用reset方法返回该位置,以便重复读取从该标记位置开始的数据。readLimit设置调用mark方法后可以读取的最大字节数, +且保持mark标记有效。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void reset() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +重置流的读取位置,回到上次调用mark方法标记的位置。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean markSupported() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +检测输入流是否支持mark和reset方法 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long skip(long n) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从输入流忽略n字节的数据,返回被忽略的实际字节数。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭输入流,释放所占用的系统资源。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:InputStream的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void write(int b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +向输出流写入一个字节。写出字节为整数b的低字节,整数b的3个高字节被忽略。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(byte[] b) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +把缓冲区b中的全部数据写入输出流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(byte[] b, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +把缓冲区b从b[off]开始的len个字节的数据写入输出流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pbulic void flush() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +刷新输出流,强制输出缓冲区的数据立即写出 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭输出流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +OutputStream的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:OutputStream的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java内部的数据都是unicode编码 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见:http://unicode.org/charts。Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Uni +code 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。un +icode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。我们经常说的UTF-8编码是unicode编码的具体实现(除此之外还 +有UTF-16,UTF-32,但是用的不多),UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节 +长度:对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码,因此对于英语字母,UTF-8编码和ASCII码是相同的。 对于n字节的符号(n +>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 + +\end_layout + +\end_inset + +的,除ASCII码外都是多字节编码方式,因此面向字节的流处理往往用于处理二进制数据,或者用于适合把数据看做二进制的场合。比如: +\end_layout + +\begin_layout Itemize +在工业控制领域,我们把接收到的数据按照自己制定的数据格式写入文件(不一定是Java语言编写的程序写文件,也许是C/C++写文件),在这种情况下就适合使用面向字节 +的流打开文件读取数据。在C语言中我们也特别强调,为了保证正确读写文件,采用什么方式(主要指面向字节还是面向字符)写入文件,就要采用同样的方式打开文件。 +\end_layout + +\begin_layout Itemize +ASCII文件可以安全的使用面向字节的流读写,因为ASCII字符的长度没有超出8位。 +\end_layout + +\begin_layout Itemize +图片、声音、视频等数据一般是以二进制方式存储的,因此适合使用字节流来处理。 +\end_layout + +\begin_layout Standard +我们之前一直在使用的System.in +\begin_inset Index idx +status open + +\begin_layout Plain Layout +System.in +\end_layout + +\end_inset + +,实际上一个InputStream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +InputStream +\end_layout + +\end_inset + +类型的对象,Sytsem.out +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Sytsem.out +\end_layout + +\end_inset + +实际上是一个PrintStream +\begin_inset Index idx +status open + +\begin_layout Plain Layout +PrintStream +\end_layout + +\end_inset + +类型的对象 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见openjdk的jdk/src/java.base/share/classes/java/lang/System.java +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + /** +\end_layout + +\begin_layout Plain Layout + + * The "standard" input stream. + This stream is already +\end_layout + +\begin_layout Plain Layout + + * open and ready to supply input data. + Typically this stream +\end_layout + +\begin_layout Plain Layout + + * corresponds to keyboard input or another input source specified by +\end_layout + +\begin_layout Plain Layout + + * the host environment or user. +\end_layout + +\begin_layout Plain Layout + + */ +\end_layout + +\begin_layout Plain Layout + + public static final InputStream in = null; +\end_layout + +\begin_layout Plain Layout + + /** +\end_layout + +\begin_layout Plain Layout + + * The "standard" output stream. + This stream is already +\end_layout + +\begin_layout Plain Layout + + * open and ready to accept output data. + Typically this stream +\end_layout + +\begin_layout Plain Layout + + * corresponds to display output or another output destination +\end_layout + +\begin_layout Plain Layout + + * specified by the host environment or user. +\end_layout + +\begin_layout Plain Layout + + *

+\end_layout + +\begin_layout Plain Layout + + * For simple stand-alone Java applications, a typical way to write +\end_layout + +\begin_layout Plain Layout + + * a line of output data is: +\end_layout + +\begin_layout Plain Layout + + *

+\end_layout
+
+\begin_layout Plain Layout
+
+     *     System.out.println(data)
+\end_layout
+
+\begin_layout Plain Layout
+
+     * 
+\end_layout + +\begin_layout Plain Layout + + *

+\end_layout + +\begin_layout Plain Layout + + * See the println methods in class PrintStream. +\end_layout + +\begin_layout Plain Layout + + * +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println() +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(boolean) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(char) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(char[]) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(double) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(float) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(int) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(long) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(java.lang.Object) +\end_layout + +\begin_layout Plain Layout + + * @see java.io.PrintStream#println(java.lang.String) +\end_layout + +\begin_layout Plain Layout + + */ +\end_layout + +\begin_layout Plain Layout + + public static final PrintStream out = null; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +输入输出流在使用后为什么要及时关闭呢?这是因为,Java把所有的输入输出流都抽象为文件的操作,如果我们不及时关闭打开的输入输出流,相当于不及时关闭打开的文件,久 +而久之可能造成操作系统打开的文件过多,从而拖慢系统运行速度,甚至超出系统允许打开的文件数。因此,输入输出流使用完毕及时关闭是个好习惯。 +\end_layout + +\begin_layout Plain Layout +我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:try-with-resources" + +\end_inset + +会看到,使用try-with-resources可以方便的管理输入输出流的关闭,减轻了程序员的负担。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +复制二进制文件 +\begin_inset CommandInset label +LatexCommand label +name "exa:复制二进制文件。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CopyBinary.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CopyBinary.java" +lstparams "caption={CopyBinary.java},label={CopyBinary.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +要复制的文件从哪里来? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在Idea中运行CopyBinary.main()结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +97321151161141051101031049484810504846525310 +\end_layout + +\begin_layout Plain Layout +97321151161141051101031049484810504846525310 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +本例我们实现了两种文件复制的方式: +\end_layout + +\begin_layout Enumerate +不使用缓冲区的字节流。通过FileInputStream读取文件,通过FileOutputStream写入文件,没有使用缓冲区,每次读取一个字节。显然当文件比较 +大时,读写文件的效率是比较低的。 +\end_layout + +\begin_layout Enumerate +使用缓冲区的字节流。利用BufferedInputStream和BufferedOutputStream构造带缓冲区的字节流,这是编程实践中最常见的情形。 +\end_layout + +\begin_layout Standard +注意到我们使用了try-with-resources的Java新语法。如果使用传统的try-catch接口则要注意输入字节流和输出字节流在使用完毕后都需要关闭, +通常借助于finally代码块实现。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Example +FileInputStream/FileOutputStream、BufferedInputStream/BufferedOutputStream、DataIn +putSteam/DataOutputStream的使用 +\end_layout + +\begin_layout Paragraph* +设计要求 +\end_layout + +\begin_layout Standard +假设一个表示气温的文件weather.txt有下列数据 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:文件操作" + +\end_inset + +还会使用文件相关API重新设计本例。 +\end_layout + +\end_inset + +,试将下列数据使用DataOutputStream重新写入文件weather.dat,然后使用DataInputStream读出weather.dat并求温度的平均 +值。 +\end_layout + +\begin_layout Standard +\begin_inset Box Boxed +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +17.1 24.2 +\end_layout + +\begin_layout Plain Layout +18.9 22.3 +\end_layout + +\begin_layout Plain Layout +17.3 -2.3 15.6 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Temperature.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/Temperature.java" +lstparams "caption={Temperature.java},label={Temperature.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行Temperature结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +17.1 +\end_layout + +\begin_layout Plain Layout +24.2 +\end_layout + +\begin_layout Plain Layout +18.9 +\end_layout + +\begin_layout Plain Layout +22.3 +\end_layout + +\begin_layout Plain Layout +17.3 +\end_layout + +\begin_layout Plain Layout +-2.3 +\end_layout + +\begin_layout Plain Layout +15.6 +\end_layout + +\begin_layout Plain Layout +average temperature = 16.157142809459142 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +注意到dos的构造方式:DataOutputStream dos = new DataOutputStream(new BufferedOutputStream +(new FileOutputStream( +\begin_inset Quotes eld +\end_inset + +weather.dat +\begin_inset Quotes erd +\end_inset + +))),可以通过 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:DataStream/BufferedStream/InputS" + +\end_inset + +加深理解。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/datastream-buffer-file.eps + lyxscale 70 + width 90line% + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +此图可以通过层技术画的更好 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +DataStream/BufferedStream/InputStream的联合使用 +\begin_inset CommandInset label +LatexCommand label +name "fig:DataStream/BufferedStream/InputS" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意weather.txt, weather.dat文件的位置:目前是在项目的根目录下的,这是因为几乎所有的IDE环境,包括Eclipse、NetBeans、Ide +a都把项目的根目录作为字节流的根目录来处理,因此我们在上面的例子中,都是采用了相对路径的方式来读写文件。但是,这种读写文件的方式(主要是对文件路径的定义方式)如 +果离开了IDE环境就失效了,因此在实践中一般不采用此种文件定位方式,一般根据classpath定位文件,参见 +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:读写属性文件" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +无论是读取还是写入文件,字节流的操作分为以下两种方式: +\end_layout + +\begin_layout Enumerate +按字节处理:每次读取或者写入一个字节; +\end_layout + +\begin_layout Enumerate +按字节数组处理:每次读取或者写入一个字节数组,数组的大小需要事先定义; +\end_layout + +\begin_layout Plain Layout +在字符流中,我们还会看到按行处理的情形,但是在处理字节流时一般不按行处理,其原因是二进制数据一般不进行换行处理。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用C语言通过面向字节的方式打开一个文件写入“Hello World!”,然后使用Java语言读取此文件,看看有什么变化? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +使用C语言通过面向字节的方式打开一个文件写入“你好,世界!”,然后使用Java的面向字节的流读取此文件,看看有什么变化? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +请将 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +exercisename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:复制二进制文件。" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +改造为从命令行输入源文件和目标文件,然后将源文件复制为目标文件。 +\end_layout + +\begin_layout Subsection +面向字符的流 +\begin_inset CommandInset label +LatexCommand label +name "subsec:面向字符的流" + +\end_inset + + +\end_layout + +\begin_layout Standard +理解了字节流,字符流就不难理解了。字节流是将“流”中的数据按照字节来划分,所谓字符流,只是将“流”中的数据按照2个字节(即一个字符)来划分而已。Java + IO提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:字符流的类层次结构" + +\end_inset + +所示的处理字符流的类层次结构。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/reader-writer.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +字符流的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:字符流的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +有必要列出每一个Reader/Writer子类的使用场合吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +和字节流非常类似,Reader和Write是两个抽象类,其中封装了操作字符流的基本方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Reader的基本方法" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Writer的基本方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取一个字符并返回,如果没有字符可读则返回-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int read(char[] cbuf) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取字符到数组cbuf中,返回读取的字符个数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract int read(char[] cbuf, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从流读取字符到数组cbuf中,并从cbuf[off]开始存储,最多读取len个字符。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long skip(long n) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +跳过流中的n个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean ready() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +检测输入字符流是否可读 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void mark(int readAheadLimit) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +标记流的当前位置,readAheadLimit表示在此位置有效期间最多可以读取的字符数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void reset() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +复位标记过的流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Reader的基本方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Reader的基本方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(int c) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写一个字符到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(char[] cbuf) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符数组cbuf到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void write(char[] cbuf, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符数组cbuf到流,从cbuf[off]开始最多写入len个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(String str) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符串str到流 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public void write(String str, int off, int len) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +写字符串str到流,从off个字符开始,最多写入len个字符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void flush() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +刷新流缓冲区 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public abstract void close() throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +关闭流 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Writer的基本方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Writer的基本方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +从键盘输入数据 +\begin_inset CommandInset label +LatexCommand label +name "sec:从键盘输入数据" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Wrap figure +lines 0 +placement r +overhang 0in +width "40line%" +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/x-memory-layout.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +实数3.125的内存表达 +\begin_inset CommandInset label +LatexCommand label +name "fig:实数3.125的内存表达" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +对于输入输出而言,使用最多的就是从键盘输入数据 +\begin_inset CommandInset citation +LatexCommand cite +after "p104,输入数据" +key "java-chenweijun" +literal "true" + +\end_inset + +,以及在显示器上输出数据。在Java语言中,数据的输出很方便,使用System.out.println就已经很好用了,无论什么类型的数据,都能够自动转换为字符串输出 +(在Java8以后,甚至包括了List、Map类型的数据),这里不再赘述。但是Java从键盘输入数据确实不是太方便,比如考虑下面的情形:从键盘输入一个实数3.12 +5保存到变量x中,该如何完成这个任务呢?如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:实数3.125的内存表达" + +\end_inset + +所示。我们的目标是获得一个单精度浮点类型变量x,其值为3.125,在内存中占用4个字节的内存空间,从高到低的4个字节分别为40、48、00和00(均为16进制数) +。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +浮点数的内存存储方式是哪里讲解的?在这里需要将知识点链接起来 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +从键盘输入数据,我们已经知道必须通过System.in来完成,下面我们再次回顾一下System类的基本内容: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public final class System { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + public final static InputStream in = null; +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + private static void initializeSystemClass() { +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + FileInputStream fdIn = new FileInputStream(FileDescriptor.in); +\end_layout + +\begin_layout Plain Layout + + setIn0(new BufferedInputStream(fdIn)); +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,in是System类的静态成员变量,在系统初始化的时候,in初始化为一个带缓冲的文件字节流,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +in是一个从标准输入设备(FileDescriptor.in)接受二进制数据并实现了缓存处理的字节流 +\end_layout + +\end_inset + +。另外也需要注意到,in是InputStream类型的,但其实在初始化的时候我们看到了,in的真实类型是BufferedInputStream类型的,这是前面讲 +过的多态 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:多态" + +\end_inset + + +\end_layout + +\end_inset + +的概念:子类对象,父类引用。 +\end_layout + +\begin_layout Standard +如果我们直接使用Sytem.in从键盘读入3.125,比如保存到一个byte数组中: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +byte[] b = new byte[20]; +\end_layout + +\begin_layout Plain Layout + +System.in.read(b); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +则内存中的数据如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream-read.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStream的read方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:InputStream的read方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,当从键盘输入3.125时,保存在数组b中的是它们的ASCII值(注意 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +中使用16进制表示内存中的数据),并且包括了回车符和换行符 +\begin_inset Foot +status open + +\begin_layout Plain Layout +如果在Linux下面进行测试的话,从键盘输入是不包含回车符' +\backslash +r'的,只有换行符' +\backslash +n',即在Linux下面通过换行符' +\backslash +n'表示输入结束。 +\end_layout + +\end_inset + +,显然数组b不符合要求,我们很难直接将数组b直接转换为一个float类型的数据。 +\begin_inset Foot +status open + +\begin_layout Plain Layout +并非不能,而是比较麻烦,比如可以这样做: +\end_layout + +\begin_layout Plain Layout +byte[] b = new byte[20]; +\end_layout + +\begin_layout Plain Layout +float f = Float.valueOf(new String(b)); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +既然直接使用字节流不容易达成我们的目标,使用字符流InputStreamReader可以吗?InputStreamReader的构造方法是: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public InputStreamReader(InputStream in); +\end_layout + +\begin_layout Plain Layout + +public InputStreamReader(InputStream in, String enc) throws UnsupportedEncodingE +xception; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +InputStreamReader的构造方法的参数是InputStream类型的,也就是说,InputStreamReader的功能是把字节流转换为字符流,于是 +我们可以尝试这样解决: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +char[] c = new char[20]; +\end_layout + +\begin_layout Plain Layout + +InputStreamReader sr = new InputStreamReader(System.in); +\end_layout + +\begin_layout Plain Layout + +sr.read(c); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这段代码的功能是从键盘输入一组数据并保存到字符数组c中,c在内存中的内容如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStreamReader类的read方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstreamreader-read.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +InputStreamReader类的read方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:InputStreamReader类的read方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可以看出,数组c存放的数据与 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:InputStream的read方法" + +\end_inset + +中的数组b是完全一样的,唯一的区别是数据类型发生了变化。b是一个字节类型的数组,每个数组元素只占一个字节;c是一个字符类型的数组,每个数组元素占两个字节。因此, +使用InputStreamReader和使用InputStream输入浮点数会遇到相似的问题:都需要将输入的数据(字节数组或者字符数组)转换为字符串对象然后使用 +Float.valueOf(String s)转换为浮点数。有没有办法从键盘直接获取字符串呢?InputStream和InputStreamReader都没有提供 +这样的功能,即便BufferedInputStream也没有提供直接从键盘获取字符串的功能,这是容易理解的:InputStream、BufferedInputS +tream的目的是原始的二进制字节,InputStreamReader的目的是为了获取原始的二进制字符,这些都和字符串没有关系。BufferedReader提供 +了从键盘获取字符串的功能,其中的readLine方法可以从键盘获取一行字符,并自动删除了末尾的回车换行符,于是我们有了最终的解决方案 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +本节的完整测试代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/io/src/cn/edu/s +dut/softlab/SystemInTest.java +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); +\end_layout + +\begin_layout Plain Layout + +String str = reader.readLine(); +\end_layout + +\begin_layout Plain Layout + +float x = Float.parseFloat(str); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在这段代码中,以System.in对象为输入参数,创建了一个InputStreamReader对象,然后以该对象为参数,创建了一个BufferedReader对象 +,从而形成了这几个类之间的连接关系 +\begin_inset Foot +status open + +\begin_layout Plain Layout +这里BufferedReader、InputStreamReader、System.in(InputStream)使用了设计模式中的装饰器模式,详情参见本系列教程 +的“提高篇”。 +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:从键盘输入数据相关类的关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/input-from-keyboard-stream.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +从键盘输入数据相关类的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:从键盘输入数据相关类的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这里的基本思路是:InputStream类负责从键盘读入字节流,然后InputStreamReader类将字节流转换为字符流,接着BufferedReader进 +行缓冲并读取一行字符,即把末尾的回车换行符去掉并将数据转化为 +\begin_inset Flex Emph +status open + +\begin_layout Plain Layout +字符串 +\end_layout + +\end_inset + +,最后调用Float类的parseFloat方法把这个字符串转换为相应的实数。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +本节内容中,我们从观察java数据的内存表达深刻理解java的输入输出,常见的IDE都可以帮助我们方便的观察Java数据在内存中的存储格式,比如在Idea中调试 +SystemInTest时可以看到Idea即时的给出了各个变量的当前值: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/inputstream-read-idea-debug.png + width 85line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Note Note +status open + +\begin_layout Plain Layout +也考虑增加NetBeans/Eclipse的截图 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +如果我们仅仅需要用户从键盘输入一个简单的响应,比如yes或y的话,可以利用System.console方法,代码示例如下: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static boolean okayToOverwrite(String file) { +\end_layout + +\begin_layout Plain Layout + + String answer = System.console().readLine("overwrite %s (yes/no)? ", file); +\end_layout + +\begin_layout Plain Layout + + return (answer.equalsIgnoreCase("y") || answer.equalsIgnoreCase("yes")); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Scanner类 +\begin_inset CommandInset label +LatexCommand label +name "sec:Scanner类" + +\end_inset + + +\end_layout + +\begin_layout Standard +从 +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:从键盘输入数据" + +\end_inset + +一节的描述可以看出,Java在处理键盘输入数据时实在不够友好,于是从Java 1.5开始增加了一个工具类Scanner简化从键盘输入数据的处理。Scanner类也 +是从InputStream接受数据,但是可以根据模式匹配的方法直接将二进制数据转换为相应的基本数据类型。具体的说,Scanner会自动根据分隔符(默认为空白字符 +,包括空格符、回车符、换行符、制表符)从输入数据中分离出一个个字符串(称为token),并转换为要求的整数、实数或者字符串等,从而方便的实现了在同一行读入多个不 +同类型的数据。 +\end_layout + +\begin_layout Standard +Scanner类的常用方法如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Scanner类的常用方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public byte nextByte() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个字节(byte) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public short nextShort() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个短整数(short) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public int nextInt() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个整数(int) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public long nextLong() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个长整数(long) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public float nextFloat() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个单精度浮点数(float) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public double nextDouble() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个双精度浮点数(double) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public boolean hasNext() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否存在可读的数据? +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public String next() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一个token(即空白字符隔开的独立的字符串) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public String nextLine() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读入下一行 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public Scanner useDelimiter(Pattern pattern) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用自定义的token分隔符 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +应该增加一个token的用法示例 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Scanner类的常用方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Scanner类的常用方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +从键盘输入两个整数,计算其乘积并输出 +\begin_inset CommandInset label +LatexCommand label +name "exa:从键盘输入两个整数,计算其乘积并输出。" + +\end_inset + +。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Multiply.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/MultiplyTest.java" +lstparams "caption={Multiply.java},label={Multiply.java}" + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用BufferedReader改写 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入两个整数,计算其乘积并输出。" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +使用Scanner读取文件“双城记.txt”,统计该小说有多少个单词 +\begin_inset Foot +status open + +\begin_layout Plain Layout +双城记文本下载地址: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://archive.org/stream/ataleoftwocities00098gut/98.txt +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +? +\end_layout + +\begin_layout Section +*文件操作 +\begin_inset CommandInset label +LatexCommand label +name "sec:文件操作" + +\end_inset + + +\end_layout + +\begin_layout Subsection +什么是Path? +\end_layout + +\begin_layout Standard +在新的文件操作API +\begin_inset Foot +status open + +\begin_layout Plain Layout +JDK 1.7引入了新的文件操作API,即NIO.2,本节内容着重于NIO.2,不再涉及旧的文件API。 +\end_layout + +\end_inset + +中,Path的概念至关重要,类Path是文件操作的入口。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里简要说明Path的功能 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +无论是Windows操作系统还是Linux操作系统,文件系统都是树状结构的。典型的文件系统如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:目录树示意图" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/linux-directory-tree.eps + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Linux系统目录树 +\begin_inset CommandInset label +LatexCommand label +name "fig:Linux系统目录树" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align left +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/windows-directory-tree.eps + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Windows系统目录树 +\begin_inset CommandInset label +LatexCommand label +name "fig:Windows系统目录树" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +目录树示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:目录树示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +myfile.txt的路径(Path)在Linux系统表示为: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +/home/lisi/myfile.txt +\end_layout + +\end_inset + +;而在Windows系统下myfile.txt的路径(Path)表示为: +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +c: +\backslash +users +\backslash +list +\backslash +myfile.txt +\end_layout + +\end_inset + +。这里要特别注意到目录分隔符的区别:Windows操作系统使用反斜杠( +\backslash +) +\begin_inset Foot +status open + +\begin_layout Plain Layout +众所周知,Unix的历史要比Windows久远,Windows的设计从Unix中汲取了很多营养,但是Windows的路径分隔符和Unix系统的路径分隔符截然相反 +,给后来的程序设计带来了一些困扰:你必须正确识别和处理不同操作系统的路径分隔符。你一定会想,要是当初微软在设计Windows的时候使用和Unix相同的路径分隔符 +,该多好!历史没有如果,现实如此残酷!欲知当初微软选择反斜杠作为文件分隔符的原因,请参考:https://blogs.msdn.microsoft.com/larry +osterman/2005/06/24/why-is-the-dos-path-character/。简单的说,Windows操作系统脱胎于Dos操作系统,在D +os操作系统中斜杠(/)已经作为命令行参数的分隔符了,因此Windows只好选用其他的分隔符(反斜杠)作为文件路径分隔符。 +\end_layout + +\end_inset + +作为目录分隔符,而其他所有操作系统(包括Linux、Unix、MacOS)都使用斜杠(/)作为目录分隔符。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +注意到,路径(Path)不仅仅是目录的意思。实际上,路径(Path)包含了以下几种情况: +\end_layout + +\begin_layout Itemize +纯粹文件名,比如:myfile.txt +\end_layout + +\begin_layout Itemize +纯粹目录,比如:/home/sili +\end_layout + +\begin_layout Itemize +绝对路径+文件名,比如:/home/lisi/myfile.txt +\end_layout + +\begin_layout Itemize +相对路径+文件名,比如:./lisi/myfile.txt +\end_layout + +\begin_layout Plain Layout +以上几种情况都是路径(Path)。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +相对路径和绝对路径 +\end_layout + +\begin_layout Standard +从形式上看,相对路径和绝对路径很容易区分:以目录分隔符(Linux系统使用/,windows系统使用 +\backslash +)为起点的路径是绝对路径,其他形式的路径是相对路径。下面是一些示例,都表示文件myfile.txt: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +# 假设当前位于/ +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +home/lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +./home/lisi/myfile.txt # 相对路径,.表示当前目录 +\end_layout + +\begin_layout Plain Layout +# 假设当前位于/home +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +./lisi/myfile.txt # 相对路径 +\end_layout + +\begin_layout Plain Layout +# 假设当前位于/usr  +\end_layout + +\begin_layout Plain Layout +/home/lisi/myfile.txt # 绝对路径 +\end_layout + +\begin_layout Plain Layout +../home/lisi/myfile.txt # 相对路径,..表示上一级目录 +\end_layout + +\begin_layout Plain Layout +/home/lisi/../zhangsan/myfile.txt # 绝对路径 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Path类 +\begin_inset CommandInset label +LatexCommand label +name "subsec:Path类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Path类是Java的新文件API的重点和核心,顾名思义,Path类代表了一个路径,一个Path对象包括了文件名和文件所在的目录,因此Path类中包含了处理文件 +和目录的相关方法。 +\end_layout + +\begin_layout Subsubsection +创建Path对象 +\end_layout + +\begin_layout Standard +利用Paths类(注意和Path类的区别)的get方法可以很方便的创建一个Path对象,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "CreatePathTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CreatePathTest.java" +lstparams "float,caption={CreatePathTest.java},label={CreatePathTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在Idea中利用调试功能可以方便的观察所创建的Path对象,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:在Ideal中通过调试观察Path对象" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/create-path-debug.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +在Ideal中通过调试观察Path对象 +\begin_inset CommandInset label +LatexCommand label +name "fig:在Ideal中通过调试观察Path对象" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +获取Path信息 +\end_layout + +\begin_layout Standard +Path对象的主要信息是目录分隔符隔开的一个字符串数组,可以通过getName方法返回这个数组的每个元素 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见本系列教程的“提高篇”,结合lambda表达式操作这个数组更方便,比如: +\end_layout + +\begin_layout Plain Layout +Path path = Paths.get( +\begin_inset Quotes eld +\end_inset + +/home/subaochen/test.txt +\begin_inset Quotes erd +\end_inset + +); +\end_layout + +\begin_layout Plain Layout +path.forEach(p -> System.out.println(p)); +\end_layout + +\end_inset + +,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathInfoTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathInfoTest.java" +lstparams "float,caption={PathInfoTest.java},label={PathInfoTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathInfoTest.java" + +\end_inset + +中涉及的主要方法的用法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Path信息相关方法" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +String toString() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +路径的字符串表达,自动根据不同操作系统使用了不同的目录分隔符 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getFileName() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +路径中的最“远”对象,即Path路径数组的最后一个元素,可能是真实的文件名,也可能是一个子目录名。注意,getFileName方法的返回值是Path,因此打印g +etFileName实际上会调用返回的Path对象的toString方法。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getName(int index) +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回Path数组的第index个元素。路径中的第一个元素index为0,最后一个元素的index为count-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int getNameCount() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回Path中的元素个数 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path subpath(int beginIndex, int endIndex) +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +非常类似于String类的subString的用法,返回Path中的一部分信息。beginIndex和endIndex分别指定起始index和终止Index。注 +意到,endIndex处的元素不包含在返回的Path中。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getParent() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +当前Path对象的上一级Path,大部分情况下,getParent相当于subpath(0,getNameCount() -1),即将Path数组最后一个元素去 +掉即为上一级Path。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path getRoot() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回根路径。如果是相对路径,则返回null。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Path信息相关方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Path信息相关方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Path转换 +\end_layout + +\begin_layout Standard +Path转换主要通过 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Path转换方法" + +\end_inset + +中的3个方法实现的。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +URI toUri() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +使用 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Uri +\end_layout + +\end_inset + +方式描述路径。对于本地文件(文件系统)使用file协议,因此URI的形式如file:///path-to-file +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path toAbsolutePath() +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回绝对路径,这对于了解文件在文件系统的位置很有帮助 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Path toRealPath(LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回真实的文件路径。该方法会检测文件是否存在,也是唯一一个检测文件是否存在的Path方法。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +really? +\end_layout + +\end_inset + +参数options决定了如何处理符号链接。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Path转换方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Path转换方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathConversionTest.java" + +\end_inset + +演示了Path转换的三种情况。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathConversionTest.java" +lstparams "float,caption={PathConversionTest.java},label={PathConversionTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +拼接Path +\end_layout + +\begin_layout Standard +Path类的resolve方法可以拼接路径,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathResolveTest.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathResolveTest.java" +lstparams "float,caption={PathResolveTest.java},label={PathResolveTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +需要注意的是,如果resolve的参数是一个绝对路径,则拼接的结果只是返回参数中的绝对路径,因此在resolve中应该避免传入一个绝对路径。 +\end_layout + +\begin_layout Plain Layout +拼接Path的另外一个方法是relativize,请参考JDK的相关文档。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +比较Path +\end_layout + +\begin_layout Standard +比较Path主要是通过3个方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:比较两个Path的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean equals(Object otherPath) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +重写了Object.equals方法,比较两个Path对象是否相同:两个Path对象代表的路径相同则两个Path对象相同 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean endsWith(Path other) +\end_layout + +\begin_layout Plain Layout +boolean endsWith(String other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断Path对象是否以给定的Path对象或者路径字符串结尾 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +boolean startsWith(Path other) +\end_layout + +\begin_layout Plain Layout +boolean startsWith(String other) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断Path对象是否以给定的Path对象或者路径字符串开头 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +比较两个Path的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:比较两个Path的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比较Path的示例参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathCompareTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCompareTest.java" +lstparams "float,caption={PathCompareTest.java},label={PathCompareTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Section +*Files类 +\begin_inset CommandInset label +LatexCommand label +name "sec:*Files类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files +\begin_inset Foot +status open + +\begin_layout Plain Layout +你可能会迷惑,为什么不命名为File类呢?很遗憾的是,File类是旧的(JDK 1.7之前)的Java文件操作API中的文件操作类,新的文件操作类只好叫做File +s了。通常,以单数命名的类用来表示一类事物,复数命名的类是工具辅助类类,比如Path表征路径,Paths是路径的工具辅助类。因此Files并不是一个很好的类的命 +名,这也是Java API无奈的选择。 +\end_layout + +\end_inset + +类是Java文件操作新API(java.nio.file包)中文件操作的核心类。相对于Path类,Files类聚焦于文件相关的操作: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +进一步概括说明Files类的功能 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +检查文件或者目录 +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:Path类" + +\end_inset + +中我们看到,Path类的大多数方法不会检查文件或者目录是否存在,换句话说,Path中的大多数方法只是对给定的路径进行语法上的检查和操作。Files类的exist +s和notExists方法可以用来检查一个Path对象是否存在于实际的文件系统中,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathExistTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathExistTest.java" +lstparams "float,caption={PathExistTest.java},label={PathExistTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +exists返回false可能存在两种情况: +\end_layout + +\begin_layout Enumerate +文件或者目录不存在; +\end_layout + +\begin_layout Enumerate +文件或者目录不可见,即当前用户没有权限查看该文件或者目录。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们可以使用isReadable、isWritable、isExecutable进一步检查文件是否可读、可写、可执行,比如下面的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Path file = ...; +\end_layout + +\begin_layout Plain Layout + +boolean isRegularExecutableFile = Files.isRegularFile(file) & +\end_layout + +\begin_layout Plain Layout + + Files.isReadable(file) & Files.isExecutable(file); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +删除文件或者目录 +\end_layout + +\begin_layout Standard +Files.delete方法删除文件或者目录。需要注意的是,如果要删除的是目录,则目录必须是空的,否则删除失败。示例代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathDeleteTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathDeleteTest.java" +lstparams "float,caption={PathDeleteTest.java},label={PathDeleteTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsection +复制文件或者目录 +\end_layout + +\begin_layout Standard +Files.copy方法可以复制文件或者目录。默认情况下,copy方法不会覆盖目的文件,但是可以通过传递CopyOption参数影响复制的过程: +\end_layout + +\begin_layout Itemize +REPLACE_EXISTING:覆盖目的文件。 +\end_layout + +\begin_layout Itemize +COPY_ATTRIBUTES:也复制文件属性到目的文件。如果不设置此选项,只是复制文件本身,文件属性取决于目的目录的设置。 +\end_layout + +\begin_layout Itemize +NOFOLLOW_LINKS:复制符号链接而非符号链接指向的文件。 +\end_layout + +\begin_layout Standard +示例程序参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathCopyTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCopyTest.java" +lstparams "caption={PathCopyTest.java},label={PathCopyTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +Files.copy也支持复制文件到流,或者从流复制到文件: +\end_layout + +\begin_layout Itemize +copy(InputStream, Path, CopyOption...options) +\end_layout + +\begin_layout Itemize +copy(Path, OutputStream) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +移动文件或者目录 +\end_layout + +\begin_layout Standard +Files.move可以移动文件或者目录,文件或者目录改名也是要通过move方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathMoveTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathMoveTest.java" +lstparams "caption={PathMoveTest.java},label={PathMoveTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Subsection +操作文件或者目录的属性 +\end_layout + +\begin_layout Standard +我们经常见到元数据(metadata)这个说法。简单的说,元数据是描述数据的数据,或者说,一类事物的元数据描述了一类事物的属性。对照面向对象的概念我们可以看出, +元数据非常像类的属性。Java提供了一组读取或者设置文件属性的方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +文件大小 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static long size(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +获取文件的大小(字节数) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +创建时间 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +没有提供直接的方法获取文件的创建时间,需要首先获取BasicFileAttributeView,然后解析creationTime,比如: +\end_layout + +\begin_layout Plain Layout +Path file = ...; +\end_layout + +\begin_layout Plain Layout +BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); +\end_layout + +\begin_layout Plain Layout +System.out.println("creationTime: " + attr.creationTime()); +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +最后修改时间 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static FileTime getLastModifiedTime(Path path, LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setLastModifiedTime(Path path, FileTime time) throws + IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取和设置文件的最后修改时间。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +属主 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static UserPrincipal getOwner(Path path, LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setOwner(Path path, UserPrincipal owner) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取或者设置文件的属主 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +所属组 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +没有提供相应的方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +访问控制属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static Set getPosixFilePermissions(Path path, + LinkOption... + options) throws IOException +\end_layout + +\begin_layout Plain Layout +public static Path setPosixFilePermissions(Path path, Set + perms) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读取或者设置文件的访问控制属性 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否目录 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isDirectory(Path path, LinkOption... + options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否目录 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否普通文件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isRegularFile(Path path, LinkOption... + options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否普通文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否符号连接 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isSymbolicLink(Path path) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否符号链接 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +是否隐藏文件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +public static boolean isHidden(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +判断给定的Path是否隐藏文件。注意到,Windows和Linux判断隐藏文件的方法是不同的,Linux的隐藏文件以 +\begin_inset Quotes erd +\end_inset + +. +\begin_inset Quotes erd +\end_inset + +开头,而Windows的隐藏文件设置了“隐藏”属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +File操作文件属性的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:File操作文件属性的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +利用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +中的方法,一次只能读取或者设置一个文件属性,如果要同时读取或者设置多个文件属性显然比较低效,因此Java提供了批量读取或者设置文件属性的方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:批量读取文件属性的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Map readAttributes(Path path, String attributes, + LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +批量读取文件属性,参数attributes给出了所要读取的属性列表,*表示所有属性。属性名称和FileAttributes各子类的属性字段定义相同,参见 +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/FileAttributeVie +w.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static A readAttributes(Path path, + Class type, LinkOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +批量读取文件属性,参数type是BasicFileAttributes的子类,返回结果和请求参数type相同。此方法更加“面向对象”一些,在IDE的帮助下不容易 +出错,因此建议采用此方法批量读取文件属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +批量读取文件属性的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:批量读取文件属性的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +不同操作系统的文件系统存在不小的差别,文件和目录的属性也各不相同,Java为了能够隐藏这些差异和细节,将文件和目录的属性做了进一步的封装,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:文件属性接口" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/fileattributes.eps + lyxscale 300 + width 60col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文件属性接口 +\begin_inset CommandInset label +LatexCommand label +name "fig:文件属性接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +BasicFileAttributes及其子接口只是定义了读取文件属性的方法,如何更新(修改)文件属性呢?Java进一步封装了在各种情况下操作文件属性的Attr +ibuteView类,即可以读取文件属性,也可以更新文件属性,同时屏蔽了不同操作系统的差异,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:读取和设置文件属性的View接口" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/FileAttributeView.eps + lyxscale 300 + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +读取和设置文件属性的View接口 +\begin_inset CommandInset label +LatexCommand label +name "fig:读取和设置文件属性的View接口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +FileAttribes和FileAttributeView的区别,感觉没说清楚? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +读取文件属性,包括:文件大小、最后修改时间、是否普通文件等。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathMetadataTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathMetadataTest.java" +lstparams "caption={PathMetadataTest.java},label={PathMetadataTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +creationTime: 2016-12-12T02:49:04Z +\end_layout + +\begin_layout Plain Layout +lastAccessTime: 2016-12-12T02:51:47Z +\end_layout + +\begin_layout Plain Layout +lastModifiedTime: 2016-12-12T02:49:04Z +\end_layout + +\begin_layout Plain Layout +isDirectory: false +\end_layout + +\begin_layout Plain Layout +isOther: false +\end_layout + +\begin_layout Plain Layout +isRegularFile: true +\end_layout + +\begin_layout Plain Layout +isSymbolicLink: false +\end_layout + +\begin_layout Plain Layout +size: 0 +\end_layout + +\begin_layout Plain Layout +now lastModifiedTime is:2016-12-13T23:54:11Z +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +使用 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:File操作文件属性的方法" + +\end_inset + +中的方法一次只能读取或者设置一个文件的属性,因此如果要一次读取或者设置多个文件属性的话,建议使用readAttributes方法较为高效。 +\end_layout + +\begin_layout Subsection +创建、读写文件 +\end_layout + +\begin_layout Subsubsection +读写小文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:读写小文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files类为读写小文件 +\begin_inset Foot +status open + +\begin_layout Plain Layout +多小的文件算是小文件?因为readAllBytes是把文件全部内容读到一个byte数组中,因此文件的尺寸取决于你的内存多少。但是,并不是所有的内存都可以用来保存 +文件内容的,因此使用这里的方法时要考虑到能够处理的文件的最大尺寸限制。 +\end_layout + +\end_inset + +提供了方便的write和readAllBytes方法,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:读写小文件的方便方法" + +\end_inset + +。可以看出, +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:读写小文件的方便方法" + +\end_inset + +中的方法不需要和输入输出流直接打交道。实际上,Files类的方法是对输入输出流的进一步封装,比如readAllBytes方法 +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见openjdk的jdk/src/java.base/share/classes/java/nio/file/Files.java +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static byte[] readAllBytes(Path path) throws IOException { + +\end_layout + +\begin_layout Plain Layout + + try (SeekableByteChannel sbc = Files.newByteChannel(path); +\end_layout + +\begin_layout Plain Layout + + InputStream in = Channels.newInputStream(sbc)) { +\end_layout + +\begin_layout Plain Layout + + long size = sbc.size(); +\end_layout + +\begin_layout Plain Layout + + if (size > (long)MAX_BUFFER_SIZE) +\end_layout + +\begin_layout Plain Layout + + throw new OutOfMemoryError("Required array size too large"); +\end_layout + +\begin_layout Plain Layout + + +\end_layout + +\begin_layout Plain Layout + + return read(in, (int)size); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Path write(Path path, byte[] bytes, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将bytes数组写入到文件path中。OpenOption在StandardOpenOption这个Enum中定义: +\end_layout + +\begin_layout Itemize +READ:为读打开文件 +\end_layout + +\begin_layout Itemize +WRITE:为写打开文件 +\end_layout + +\begin_layout Itemize +APPEND:如果可写则追加写入内容到文件末尾 +\end_layout + +\begin_layout Itemize +CREATE:如果文件不存在则创建 +\end_layout + +\begin_layout Itemize +CREATE_NEW:创建新文件;如果文件已经存在则失败,优先级高于CREATE +\end_layout + +\begin_layout Itemize +TRUNCATE_EXISTING:如果文件可写并且已经存在则截断文件尺寸为0 +\end_layout + +\begin_layout Itemize +DELETE_ON_CLOSE:文件操作结束(close)后自动删除文件,这对于临时文件很有用 +\end_layout + +\begin_layout Itemize +DSYNC:自动同步文件的内容到存储介质 +\end_layout + +\begin_layout Itemize +SYNC:自动同步文件的内容和原信息到存储介质 +\end_layout + +\begin_layout Itemize +SPARSE:创建稀疏文件 +\begin_inset Foot +status open + +\begin_layout Plain Layout +稀疏文件是指创建文件的时候并不真正分配空间,只有真正写入文件的时候才逐步分配空间。 +\end_layout + +\end_inset + +,如果文件系统支持的话 +\end_layout + +\begin_layout Plain Layout +默认是CREATE, TRUNCATE_EXISTING和WRITE,即如果文件不存在则创建,如果文件已存在则截断长度为0。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static Path write(Path path, Iterable lines, + Charset cs, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将文本lines写入文件path中。lines以System.getProperty( +\begin_inset Quotes eld +\end_inset + +line.separator +\begin_inset Quotes erd +\end_inset + +)为行分隔符,并使用给定的(cs)编码 +\begin_inset Foot +status open + +\begin_layout Plain Layout +Java 1.7之后引入了StandCharsets类定义了常见的编码方式,参见:https://docs.oracle.com/javase/8/docs/api/ +java/nio/charset/StandardCharsets.html +\end_layout + +\end_inset + +为byte数组。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static byte[] readAllBytes(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path读取所有内容到byte数组。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static List readAllLines(Path path) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读文件path的所有行到List中,行分隔符为 +\backslash +r +\backslash +n(windows下)或 +\backslash +r(Mac下)或 +\backslash +n(Linux下)。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static List readAllLines(Path path, Charset cs) throws IOExceptio +n +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +读文件path的所有行到List中,并使用cs编码将byte解码为字符串。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +读写小文件的方便方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:读写小文件的方便方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Example +读写小文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PathCreateTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathCreateTest.java" +lstparams "caption={PathCreateTest.java},label={PathCreateTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下,只是简单的输出了文件的内容: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +test string +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Subsubsection +带缓存的文本文件处理方法 +\end_layout + +\begin_layout Standard +处理文本文件时,通常需要借助于缓存提高效率,我们在 +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:面向字符的流" + +\end_inset + +中已经讨论过。Files类提供了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Files中带缓存的文本读写方法" + +\end_inset + +的方法更进一步简化了文本文件的处理。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedReader用于读取文件内容,使用UTF-8解码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedReader newBufferedReader(Path path, Charset cs) throws + IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedReader用于读取文件内容,文件内容以cs方式解码,默认使用UTF-8解码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedWriter用于写入文件内容,使用UTF-8编码。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个BufferedWriter用于写入文件内容,文件内容以cs方式编码,默认使用UTF-8编码。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files中带缓存的文本读写方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files中带缓存的文本读写方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的代码片段演示了newBufferedReader的用法: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Charset charset = Charset.forName("UTF-8");// or Charset charset = StandCharsets.U +TF-8; +\end_layout + +\begin_layout Plain Layout + +try (BufferedReader reader = Files.newBufferedReader(file, charset)) { +\end_layout + +\begin_layout Plain Layout + + String line = null; +\end_layout + +\begin_layout Plain Layout + + while ((line = reader.readLine()) != null) { +\end_layout + +\begin_layout Plain Layout + + System.out.println(line); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} catch (IOException x) { +\end_layout + +\begin_layout Plain Layout + + System.err.format("IOException: %s%n", x); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +等价于下面的代码片段(如果文件是UTF-8编码的话): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try (BufferedReader reader = Files.newBufferedReader(file)) { +\end_layout + +\begin_layout Plain Layout + + String line = null; +\end_layout + +\begin_layout Plain Layout + + while ((line = reader.readLine()) != null) { +\end_layout + +\begin_layout Plain Layout + + System.out.println(line); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} catch (IOException x) { +\end_layout + +\begin_layout Plain Layout + + System.err.format("IOException: %s%n", x); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +使用不带缓存的输入输出流 +\end_layout + +\begin_layout Standard +Files同样封装了不带缓存的输入输出流,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "tab:Files中不带缓存的输入输出流" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static InputStream newInputStream(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个InputStream用于读取文件内容 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public static OutputStream newOutputStream(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个OutputStream用于写入文件内容 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files中不带缓存的输入输出流 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files中不带缓存的输入输出流" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +Files对不带缓存的输入流的封装 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PathWithoutBufferTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PathWithoutBufferTest.java" +lstparams "caption={PathWithoutBufferTest.java},label={PathWithoutBufferTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行的结果如下(简单的打印出了之前写入的内容): +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Hello World! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +newInputStream返回一个不带缓存的输入流,但是这个例子又根据这个不带缓存的输入流构造了一个BufferedReader以便以行的方式读入文本。你可能 +会问,为什么不直接使用带缓存的newBufferedReader方法呢?是的,在这个例子中,使用newBufferedReader直接返回一个BufferedR +eader更方便,本例只是演示如何构造一个不带缓存的输入流。 +\end_layout + +\begin_layout Subsubsection +channel方式读写文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:channel方式读写文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +流(stream)是按照字节为单位读写文件的,channel +\begin_inset Note Note +status open + +\begin_layout Plain Layout +如何翻译?通道? +\end_layout + +\end_inset + +是按照缓冲区为单位读写文件的,也就是说,channel是自然带缓冲的,可以一次处理一个缓冲区。SeekableByteChannel内部维护着一个表示当前位置的 +指针,通过移动该指针可以实现随机文件读写,参见 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:随机读写文件" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +Files类的Channel读写文件方法见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Files类的Channel读写文件方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static SeekableByteChannel newByteChannel(Path path, OpenOption... + options) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel +\end_layout + +\end_inset + +用于读写文件内容,默认是只读打开Channel的。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static SeekableByteChannel newByteChannel(Path path, Set options, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从path创建一个 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel +\end_layout + +\end_inset + +用于读写文件内容,attrs设置文件的属性。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files类的Channel读写文件方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files类的Channel读写文件方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +使用Channel读写文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileRandomAccessTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileChannelTest.java" +lstparams "caption={FileChannelTest.java},label={FileChannelTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +打印出myfile.txt的内容,不再列出。 +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +和Stream不同,使用Channel读写文件的要点是一次处理一个buffer,因此如何使用Buffer就称为用好Channel的关键。可以借助于Java的Bu +ffer类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "fig:Buffer的类层次结构" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer.eps + lyxscale 200 + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Caption Standard + +\begin_layout Plain Layout +Buffer的类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Buffer的类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的讨论以ByteBuffer为例,其他类型的Buffer用法类似。 +\end_layout + +\begin_layout Standard +ByteBuffer实际上是一块可以写入和读取数据的内存,Java提供了若干方便的方法操作这块内存,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +,我们假设创建了一个大小为8个字节的ByteBuffer。要理解ByteBuffer的用法,需要首先理解ByteBuffer的三个基本属性: +\end_layout + +\begin_layout Itemize +capacity:ByteBuffer的大小,即占用多少个字节的内存空间。每个ByteBuffer在创建时需要指定capacity,一旦设定不允许改变,这里ca +pacity=8。 +\end_layout + +\begin_layout Itemize +limit:下一次读或者写允许操作的字节数。在写模式下,limit表示当前最多能够向Buffer写多少数据。在读模式下,limit表示当前最多能够读到多少数据。 +\end_layout + +\begin_layout Itemize +position:下一个可以读或者写的字节的位置索引,position的最大值为capacity - 1。在写模式下,position的初始值为0,当写入数据( +字节)后,position移动到下一个可写入的位置,比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +中,在写入3个字节的数据后,当前position=3。如果此时切换这个ByteBuffer到读模式,则position需要指向下一个可读的字节位置,显然应该将p +osition置为0,limit置为3(即当前position的值),即从Buffer的开头开始能够一次读3个字节的数据,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:ByteBuffer的用法" + +\end_inset + +的“读模式”所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer-usage.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +ByteBuffer的用法 +\begin_inset CommandInset label +LatexCommand label +name "fig:ByteBuffer的用法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Buffer通过flip方法从写模式切换到读模式,通常对Buffer的操作流程为: +\end_layout + +\begin_layout Enumerate +写入数据到Buffer,在这里是通过Channel的read方法写入数据到Buffer,也可以通过Buffer提供的各种put方法写入数据。 +\end_layout + +\begin_layout Enumerate +调用flip方法切换到读模式。 +\end_layout + +\begin_layout Enumerate +从Buffer中读取数据。 +\end_layout + +\begin_layout Enumerate +调用clear或者compact方法清空缓冲区。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +使用Idea可以方便的观察和学习Buffer中capacity、limit、position的变化情况,如下图所示。 +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/buffer-idea-debug.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +读写文件的方法很多,何时使用InputStream/OutputStream/InputReader/OutputReader,何时使用Files方法读写文件? +一般的原则是什么? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +创建文件和临时文件 +\end_layout + +\begin_layout Standard +Files也提供了创建文件和临时文件的方便API,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:Files创建文件和临时文件的方法" + +\end_inset + +。createFile和createTempFile被设计为“原子操作”,即首先检查文件是否存在(存在则抛出异常),然后创建一个空文件病设置为指定或者默认的属性 +,因此createFile的安全性要比其他方法高些。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +其他方法是哪些方法?stream?Channel?是否可以对比说明? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createFile(Path path, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据path创建属性为attrs的文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createTempFile(Path dir, String prefix, String suffix, + FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建属性为attrs的临时文件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createTempFile(String prefix, String suffix, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建属性为attrs的临时文件 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Files创建文件和临时文件的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:Files创建文件和临时文件的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +使用createFile创建文件 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileCreateTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileCreateTest.java" +lstparams "caption={FileCreateTest.java},label={FileCreateTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行应用程序后检查所创建文件的属性如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +~/test$ ls -l testcreate.txt +\end_layout + +\begin_layout Plain Layout +-rw-rw-r-- 1 subaochen subaochen 0 12月 16 08:20 testcreate.txt +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +createFile时如果没有给出文件属性则默认创建664属性的文件,即用户自己、所属组都可读写,其他所有人均只读。可以通过给出FileAttribute灵活设 +置属性,比如下面的代码片段设置为只对用户自己可读写: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +Path file = ...; +\end_layout + +\begin_layout Plain Layout + +Set perms = +\end_layout + +\begin_layout Plain Layout + + PosixFilePermissions.fromString("rw-------"); +\end_layout + +\begin_layout Plain Layout + +FileAttribute> attr = +\end_layout + +\begin_layout Plain Layout + + PosixFilePermissions.asFileAttribute(perms); +\end_layout + +\begin_layout Plain Layout + +Files.createFile(file, attr); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,在/tmp创建一个临时文件temp.log,并观察此临时文件的属性 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +编写程序,创建一个对所有人只读的文件,并验证所创建文件的属性 +\end_layout + +\begin_layout Subsection +随机读写文件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:随机读写文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:读写小文件" + +\end_inset + +中其实我们已经看到,SeekableByteChannel已经具有随机读写文件的能力了:SeekableByteChannel的下列方法帮助我们确定读写的起始位 +置和数量: +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +long position() throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回文件的当前位置,即读和写的起始位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel position(long newPosition) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +设置Channel的当前位置,返回这个Channel(便于函数式编程) +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +long size() throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +返回这个Channel的大小 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +SeekableByteChannel truncate(long size) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +截断这个Channel到给定的大小 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int read(ByteBuffer dst) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +从Channel读数据到dst +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +int write(ByteBuffer src) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +将dst的数据写入Channel +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +SeekableByteChannel的随机读写方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:SeekableByteChannel的随机读写方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +为了更方便的操作文件,JDK提供了对SeekableByteChannel的进一步封装:FileChannel,除SeekableByteChannel中的方法 +外,FileChannel增加了一些高级特性,比如可以将文件的指定区域映射到内存中以便快速访问,锁定文件的指定区域(不允许其他线程进行操作),从任意位置直接读写 +文件等。我们有两种方式获取一个FileChannel: +\end_layout + +\begin_layout Enumerate +通过Path.newByteChannel获得一个SeekableByteChannel,然后强制类型转换为FileChannel。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这种类型转换安全吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate +通过FileInputStream.getChannel获取一个FileChannel。 +\end_layout + +\begin_layout Enumerate +通过FileChannel.open方法直接获得一个FileChannel。推荐采用此种方式。 +\end_layout + +\begin_layout Example +使用FileChannel读写文件,假设文件myfile.txt原来有如下的内容: +\end_layout + +\begin_layout Example +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Java programming language is good! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "FileRandomAccessTest.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/FileRandomAccessTest.java" +lstparams "caption={FileRandomAccessTest.java},label={FileRandomAccessTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph +运行结果 +\end_layout + +\begin_layout Standard +在Idea中运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +I was here! +\end_layout + +\begin_layout Plain Layout +ming language is good!Java programI was here! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,在文件的开头写入了 +\begin_inset Quotes erd +\end_inset + +I was here! +\backslash +n +\begin_inset Quotes erd +\end_inset + +,然后把文件开头原先的 +\begin_inset Quotes erd +\end_inset + +Java program +\begin_inset Quotes erd +\end_inset + +移动到了文件的最后,并在最后追加了 +\begin_inset Quotes erd +\end_inset + +I was here! +\backslash +n +\begin_inset Quotes erd +\end_inset + +。 +\end_layout + +\begin_layout Standard +本程序可以反复运行,结果完全一致。 +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +FileChannel提供的文件随机读写概念,重要的是理解两个position的用法: +\end_layout + +\begin_layout Itemize +FileChannel的position,用于确定从什么地方开始读写文件; +\end_layout + +\begin_layout Itemize +ByteBuffer的position,用于确定从什么地方开始读写ByteBuffer; +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +FileChannel、InputStream/OutputStream、ByteBuffer之间的关系和用法可以形象的用下图表示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/io/file-channel-stream-buffer.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +简单的说,ByteBuffer处于“中心”的位置,无论是从文件系统、网络读入的数据,还是准备写入文件系统、网络的数据,都是通过ByteBuffer的。因此,其他 +数据类型如何转换为ByteBuffer以及ByteBuffer如何转换为其他数据类型就显得非常重要,上图的大部分篇幅展示了这种相互转换的方法。 +\end_layout + +\begin_layout Plain Layout +我们可以看出,ByteBuffer转换为其他数据类型已经非常方便了,但是从其他数据类型转换为ByteBuffer的通道却不是很流畅,比如从short[]转换为一 +个ByteBuffer,目前没有直接的方法,只能通过遍历这个short数组,然后将数组的每个元素放入ByteBuffer这种稍微曲折的方法: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +ByteBuffer bb; +\end_layout + +\begin_layout Plain Layout + +... +\end_layout + +\begin_layout Plain Layout + +for(short s:short_array) { +\end_layout + +\begin_layout Plain Layout + + bb.putShort(s); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +相信JDK的未来版本会提供更丰富和合理的ByteBuffer和其他数据类型的相互转换方法。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +目录操作 +\end_layout + +\begin_layout Standard +目录是一种特殊的文件,我们前面介绍的很多API(所有接受Path作为参数的API)即可以操作文件,也可操作目录。但是毕竟目录的操作有其特殊性,比如下面的情形: +\end_layout + +\begin_layout Itemize +创建一个空目录 +\end_layout + +\begin_layout Itemize +列出目录下的所有子目录 +\end_layout + +\begin_layout Itemize +列出目录下的所有文件 +\end_layout + +\begin_layout Itemize +根据给定的规则列出目录下的文件和目录 +\end_layout + +\begin_layout Standard +JDK的Files类同样给出了目录操作的方便方法,分述如下。 +\end_layout + +\begin_layout Subsubsection +创建目录 +\end_layout + +\begin_layout Standard +Files类创建目录主要是两个方法,createDirectory用于创建一级目录,createDirectories用于创建多级目录,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:创建目录的方法" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createDirectory(Path dir, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir和attrs创建一个目录。如果没有attrs参数则创建默认属性的目录。如果目录已经存在则抛出FileAlreadyExistsException异常。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +public static Path createDirectories(Path dir, FileAttribute... + attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据dir创建多级目录 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +创建目录的方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:创建目录的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +创建目录 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CreateDirectoryTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/CreateDirectoryTest.java" +lstparams "caption={CreateDirectoryTest.java},label={CreateDirectoryTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +第一次运行时终端没有任何显示,但是当我们去往test目录查看时,应该可以看到test目录下面多了一个新目录a。 +\end_layout + +\begin_layout Standard +当第二次运行该程序时,终端显示: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +java.nio.file.FileAlreadyExistsException: /home/subaochen/test/a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,如果dir目录已经存在,则createDirectory方法抛出FileAlreadyExistsException异常。 +\end_layout + +\begin_layout Standard +我们删除a目录,但是创建一个文件名字叫做a,即在test目录执行下列命令: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +~/test$ rmdir a; touch a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +再次执行本程序,终端显示: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +java.nio.file.FileAlreadyExistsException: /home/subaochen/test/a +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +即,如果要创建的目录和文件重名也是不允许的,同样抛出FileAlreadyExistsException。 +\end_layout + +\begin_layout Exercise +使用Files.createDirectories创建目录test/a/b/c +\end_layout + +\begin_layout Subsubsection +列出目录 +\begin_inset CommandInset label +LatexCommand label +name "subsec:列出目录" + +\end_inset + + +\end_layout + +\begin_layout Standard +Files的newDirectoryStream方法可以很方便的列出目录下的内容,包括子目录、文件、隐藏文件等,但是需要注意的是,newDirectoryStr +eam不是一个递归的过程,即不能深入到当前目录的子目录查找内容。 +\end_layout + +\begin_layout Example +利用newDirectoryStream方法列出当前目录下的文件、子目录等。 +\begin_inset CommandInset label +LatexCommand label +name "exa:列出当前目录下的文件、子目录等。" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "ListDirectoryTest.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/ListDirectoryTest.java" +lstparams "caption={ListDirectoryTest.java},label={ListDirectoryTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析和说明 +\end_layout + +\begin_layout Standard +要注意到newDirectoryStream返回的是一个stream,因此和InputStream等用法类似,一定要记得用完后close这个stream。try +-with-resources结构能够自动关闭stream,如果使用try-catch结构,则要在finanlly块中执行stream.close()方法关闭st +ream。 +\end_layout + +\begin_layout Exercise +如何利用newDirectoryStream方法递归的列出当前目录下的内容,包括子目录下的文件及其子目录? +\end_layout + +\begin_layout Subsubsection +根据规则列出目录 +\end_layout + +\begin_layout Standard +newDirectoryStream允许传入Glob +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +appendixname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:什么是Glob?" + +\end_inset + + +\end_layout + +\end_inset + +过滤规则作为参数。 +\end_layout + +\begin_layout Example +列出当前目录下的所有java源代码和java class文件。 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "ListDirectoryWithGlobTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/ListDirectoryWithGlobTest.java" +lstparams "caption={ListDirectoryWithGlobTest.java},label={ListDirectoryWithGlobTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计和分析 +\end_layout + +\begin_layout Standard +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:列出当前目录下的文件、子目录等。" + +\end_inset + +相比,我们看到newDirectoryStream方法只是多了一个参数:表明如何过滤本目录下的内容。 +\end_layout + +\begin_layout Subsection +遍历目录:FileVisitor接口 +\end_layout + +\begin_layout Standard +在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:列出目录" + +\end_inset + +中我们看到了,可以利用Files.newDirectoryStream列出当前目录下的内容,但是newDirectoryStream不是递归处理的,因此Files +类提供了遍历目录的另外方式:使用FileVisitor接口可以更方便的遍历目录。 +\end_layout + +\begin_layout Standard +首先实现FileVisitor接口,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PrintFiles.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PrintFiles.java" +lstparams "caption={PrintFiles.java},label={PrintFiles.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +然后可以在主类中使用FileVisitor接口遍历目录了,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WalkFileTreeTest.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/WalkFileTreeTest.java" +lstparams "caption={WalkFileTreeTest.java},label={WalkFileTreeTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +这里的关键是,walkFileTree方法会递归的遍历给定的目录,但是对于递归过程中遇到的每一个项目如何处理呢?我们看到walkFileTree的第二个参数是一 +个实现了FileVisitor接口的对象,这个对象决定了如何处理这些遇到的目录项目,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:FileVisitor接口方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +描述 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws + IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在访问(操作)目录之前的动作,比如准备将目录复制到另外的目录中等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在访问(操作)目录之后的动作,比如访问目录后可以将目录删除等。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +访问目录中的文件。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +FileVisitResult visitFileFailed(T file, IOException exc) throws IOException +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果访问文件失败则调用此方法。 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FileVisitor接口方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:FileVisitor接口方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +*访问属性文件 +\begin_inset CommandInset label +LatexCommand label +name "sec:读写属性文件" + +\end_inset + + +\end_layout + +\begin_layout Standard +属性文件通常用来保存应用程序的配置信息,这样当应用程序的配置改变时,只需要修改属性文件(配置文件)即可,不需要修改应用程序的源代码,维护比较方便。属性文件的内容 +通常是以key、value对的形式出现,即key=value的形式,比如数据库相关的应用程序中通常将数据库服务器的IP地址、用户名、密码等信息保存到如下的属性文 +件中: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +hostname=192.168.1.200 +\end_layout + +\begin_layout Plain Layout +username=postgres +\end_layout + +\begin_layout Plain Layout +password=password +\end_layout + +\begin_layout Plain Layout +database=mydb +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的Properties类提供了方便的API读写这样的属性文件。 +\end_layout + +\begin_layout Example +访问属性文件 +\begin_inset CommandInset label +LatexCommand label +name "exa:访问属性文件" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "PropertyFileTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/io/src/cn/edu/sdut/softlab/io/PropertyFileTest.java" +lstparams "caption={PropertyFileTest.java},label={PropertyFileTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +执行本应用程序结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +hostname=localhost +\end_layout + +\begin_layout Plain Layout +password=password +\end_layout + +\begin_layout Plain Layout +database=mydb +\end_layout + +\begin_layout Plain Layout +username=postgres +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计和分析 +\end_layout + +\begin_layout Standard +本例中,我们使用了FileInputStrem和FileOutputStream构造了一个文件输入输出流,FileInpoutStream和FileOutput +Stream的参数是文件名,注意到该文件名是相对于项目根目录的。 +\end_layout + +\begin_layout Standard +实际上, +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +Java在定位文件时,有如下的几种策略 +\end_layout + +\end_inset + + +\begin_inset Foot +status open + +\begin_layout Plain Layout +参考了: +\end_layout + +\begin_layout Itemize +http://www.cnblogs.com/yinger/archive/2011/09/08/2171831.html +\end_layout + +\begin_layout Itemize +官方教程:https://docs.oracle.com/javase/tutorial/essential/environment/properties.html +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Itemize +绝对路径:在FileInputStream、FileOutputStream中如果参数的路径使用路径分隔符(windows下是 +\backslash +,Linux下是/)开头则是绝对路径。 +\end_layout + +\begin_layout Itemize +相对于项目的路径:在FileInputStream、FileOutputStream中如果参数的路径没有使用路径分隔符(windows下是 +\backslash +,Linux下是/)开头则是项目于项目根目录的相对路径。 +\end_layout + +\begin_layout Itemize +相对于当前class文件的路径:如果使用Class.getResourceAsStream方法,则获得相对于当前class文件的路径,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getResourceAsStream(database-config.prope +rties); +\end_layout + +\end_inset + +path对象指向的文件database-config.properties和class文件在同一个目录下,即database-config.properties位于 +src/cn/edu/sdut/softlab目录下。 +\begin_inset Newline newline +\end_inset + +但是,如果参数是绝对路径,则获得是相对于包的文件路径,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getResourceAsStream(/database-config.prop +erties); +\end_layout + +\end_inset + +则文件database-config.properties位于src目录下。 +\end_layout + +\begin_layout Itemize +相对于包的路径:如果使用Class.getClassLoader().getResourceAsStream方法,则获得是相对于包路径的文件,比如: +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +InputStream path = PropertyFileTest.class.getClassLoader().getResourceAsStream(data +base-config.properties); +\end_layout + +\end_inset + +即文件database-config.properties位于src目录下。 +\begin_inset Newline newline +\end_inset + +同时需要注意到,Class.getClassLoader.getResourceAsStream的参数不允许使用绝对路径,否则返回的InputStream为null +。 +\end_layout + +\begin_layout Standard + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture12.lyx b/guide/lecture_guide/lecture12.lyx new file mode 100644 index 0000000..a85e74c --- /dev/null +++ b/guide/lecture_guide/lecture12.lyx @@ -0,0 +1,9753 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十二次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java的图形用户界面(GUI)设计概述" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java的图形用户界面(GUI)设计概述" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Swing入门" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Swing入门" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:GUI的顶级容器类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:GUI的顶级容器类" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Swing控件" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Swing控件" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Swing的含义和基本构成; +\end_layout + +\begin_layout Enumerate +Swing的顶级容器; +\end_layout + +\begin_layout Enumerate +Swing的基本控件; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Swing控件的类层次关系; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握Swing的基本概念和常见控件; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +了解Java GUI的历史,考虑一下是什么促使Java的GUI类库从AWT发展到了Swing?还有哪些第三方的Java GUI类库? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +图形用户界面设计 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/gui/gui.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Section +Java的图形用户界面(GUI)设计概述 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的图形用户界面(GUI)设计概述" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +GUI +\end_layout + +\end_inset + +GUI)是由 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFC +\end_layout + +\end_inset + +JFC(Java Foundation Classes)支撑的,JFC包括了以下几个方面: +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing GUI组件:包含了图形用户界面设计中的人机交互组件,从最简单的按钮到复杂的图表等无所不包,这是我们学习的重点内容。 +\end_layout + +\begin_layout Itemize +可插拔的Look-and-Feel支持:Java图形用户界面支持可配置的Look-and-Feel切换,可以很容易的实现不同操作系统下的界面统一。 +\end_layout + +\begin_layout Itemize +辅助API:支持读屏幕等操作。 +\end_layout + +\begin_layout Itemize +Java 2D API:完善的2D绘图API。 +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +国际化 +\end_layout + +\end_inset + +国际化支持:秉承Java一贯的国际化支持,能够方便的在GUI中处理各种编码的文字。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Swing是在早期的Java GUI应用程序设计接口AWT的基础上发展起来的,目前是Java GUI应用程序设计的官方标准。除了Swing之外,Eclipse( +www.eclipse.org)组织也发布了一套Java图形用户界面的设计库SWT(Standard Widget Toolkit),主要配合Eclipse的RCP +(Rich Client Program)应用程序开发,详情可参考:https://www.eclipse.org/swt/ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing入门 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing入门" + +\end_inset + + +\end_layout + +\begin_layout Standard +本节以JetBrain Idea为例说明如何创建和运行简单的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing应用程序。 +\end_layout + +\begin_layout Example +使用Idea创建一个简单的Swing应用程序,将人民币转换为美元。 +\end_layout + +\begin_layout Paragraph* +步骤1 +\end_layout + +\begin_layout Standard +创建一个新的Java项目,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:新建一个Java项目" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +新建一个Java项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:新建一个Java项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤2 +\end_layout + +\begin_layout Standard +在接下来的项目配置窗口中,可以不选择从模板创建项目,因为我们要创建一个GUI应用程序,命令行应用的模板没有实质用处,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-2.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +跳过从模板创建项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤3 +\end_layout + +\begin_layout Standard +给项目起个名字,这里叫做“gui”,并选择项目所在的目录,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给项目起个名字" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给项目起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给项目起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤4 +\end_layout + +\begin_layout Standard +在项目的“project视图”中,右键点击src,在弹出的菜单中选择New->GUI Form,新建一个Form表单 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form表单 +\end_layout + +\end_inset + +,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备新建一个Form表单" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-1.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备新建一个Form表单 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备新建一个Form表单" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +如果在菜单中没有出现GUI Form子菜单,系没有安装Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +插件所致,请在系统设置中激活Form Designer即可,方法是在File->Settings...菜单中搜索“UI Designer”插件并安装激活,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:安装并激活UI-Designer插件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/active-ui-designer.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +安装并激活UI Designer插件 +\begin_inset CommandInset label +LatexCommand label +name "fig:安装并激活UI-Designer插件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +图片和文字可能不在一个页面,应该想办法处理一下 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤5 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给Form起个名字" + +\end_inset + +所示,给将要创建的Form起个名字,这里叫做“RMB2DollarConverter”,选择布局管理器(此处先认可默认设置,随后可以更改)。注意要勾选(默认已经 +勾选了) +\begin_inset Quotes erd +\end_inset + +create bound class +\begin_inset Quotes erd +\end_inset + +选项,即同时创建和这个Form绑定在一起的Java类。这个Java类我们将来用于显示和操作这个Form。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给Form起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给Form起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤6 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:空白的Form设计窗口" + +\end_inset + +所示,在新建Form后会呈现一个空白的Form设计窗口,其主要组成部分为: +\end_layout + +\begin_layout Itemize +界面组件关系图:在这个窗口中展示了组件的“父子”关系,目前只有一个JPanel组件,随后我们会加入更多组件,可以通过这个窗口直观的查看组件之间的关系。也可以通过 +这个窗口快捷的选择某个组件进行操作。 +\end_layout + +\begin_layout Itemize +组件属性窗:当在主设计界面或者界面组件关系窗口中选择了某个组件时,组件属性窗的内容将随之改变。可以通过这个窗口方便的了解界面组件拥有哪些属性,当然,更重要的是, +可以设置界面组件的属性值。 +\end_layout + +\begin_layout Itemize +主设计界面:可以拖放“组件面板”中的组件导主设计界面,主设计界面会根据使用的布局管理器的不同,自动摆放组件。 +\end_layout + +\begin_layout Itemize +组件面板:列出了各种Swing界面组件,可以方便的拖放到主设计界面。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +空白的Form设计窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:空白的Form设计窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤7 +\end_layout + +\begin_layout Standard +首先在“界面组件关系窗口”中选择目前唯一的组件Panel,然后在组件属性窗口中编辑“field name”属性,设置其值为“mainPanel +\begin_inset Quotes erd +\end_inset + +。这里的值是什么并不重要的,重要的是必须给主Panel设置一个名字,否则将来无法显示这个Panel。 +\end_layout + +\begin_layout Standard +在这里,我们也将mainPanel的 +\begin_inset Quotes erd +\end_inset + +Layout Manager +\begin_inset Quotes erd +\end_inset + +(布局管理器)修改为更为简单的 +\begin_inset Quotes erd +\end_inset + +FlowLayout +\begin_inset Quotes erd +\end_inset + +,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:布局管理器" + +\end_inset + +一节详细的阐述各种布局管理器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +布局管理器 +\end_layout + +\end_inset + +的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-4.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给主Panel起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给主Panel起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤8 +\end_layout + +\begin_layout Standard +在“组件面板”窗口选择JLabel组件拖放到主设计界面,可以看到在“界面组件关系”窗口中,JLabel包含在mainPanel中。这里只是简单的设置这个JLab +el的text属性为“人民币:”即可。JLabel的目的是显示一个标签 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +标签 +\end_layout + +\end_inset + +,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:JLabel" + +\end_inset + +一节详细讨论Jlabel的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-5.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加一个简单的Label +\begin_inset CommandInset label +LatexCommand label +name "fig:添加一个简单的Label" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤9 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加JTextField组件" + +\end_inset + +所示,接着添加一个JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +组件到主设计界面。这个JTextField我们用来输入人民币数额,因此要设置其 +\begin_inset Quotes erd +\end_inset + +field name +\begin_inset Quotes erd +\end_inset + +属性。为了更好的显示这个输入框,也设置了这个JTextField的默认宽度(preferedSize->width)和默认显示的文字(text属性)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-6.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加JTextField组件 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加JTextField组件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤10 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加转换按钮" + +\end_inset + +所示,再增加一个“转换”按钮 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +按钮 +\end_layout + +\end_inset + +,设置这个按钮的field name和text属性。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-7.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加转换按钮 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加转换按钮" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤11 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加显示转换结果的JLabel" + +\end_inset + +所示,在界面中再添加一个用于显示转换结果的JLabel。由于我们要通过程序设置这个JLabel的text属性,因此要设置这个JLabel的field + name属性。为了能够更好的显示转换后的结果,也有设置这个JLabel的宽度,这里设置为100(像素值)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-8.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加显示转换结果的JLabel +\begin_inset CommandInset label +LatexCommand label +name "fig:添加显示转换结果的JLabel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤12 +\begin_inset CommandInset label +LatexCommand label +name "par:步骤12" + +\end_inset + + +\end_layout + +\begin_layout Standard +界面的设计工作基本就绪,下面我们为按钮设计处理代码。如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备创建Listener" + +\end_inset + +所示,在主设计界面的“转换”按钮上点击右键,在弹出的菜单中选择“create Listener”,准备创建一段点击此按钮的响应代码。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-9.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备创建Listener +\begin_inset CommandInset label +LatexCommand label +name "fig:准备创建Listener" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤13 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择Listener的类型" + +\end_inset + +所示,在接下来的窗口中选择Listener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Listener +\end_layout + +\end_inset + +的类型为“ActionListener”。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-10.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Listener的类型 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择Listener的类型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤14 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +所示,在接下来的窗口中,选择ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +需要覆盖的方法。这里只有一个选项,已经自动选中了。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-11.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择需要覆盖的方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择需要覆盖的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +点击 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +中的“OK”按钮后,在所绑定的方法中自动添加了一个构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + +,内容如下(行5-7是自己编写的): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RMB2DollarConverter() { +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + // 获取文本输入框的文字内容并转换为double +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb / 7.0)); // 假设当前人民币和美元汇率为7.0 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这是GUI应用程序事件处理的基本方法,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "sec:JAVA图形用户界面的事件机制" + +\end_inset + +一节中具体讨论。 +\end_layout + +\begin_layout Paragraph* +步骤15 +\end_layout + +\begin_layout Standard +最后一步,我们需要在类RMB2DollarConverter中增加一个main方法并初始化和显示应用程序窗口,JetBrain Idea提供了自动化的代码生成工 +具,只需要在代码的合适位置(希望插入main方法的位置)按下Alt+Insert +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Alt+Insert +\end_layout + +\end_inset + +组合键,在如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备插入main方法" + +\end_inset + +所示的窗口中选择 +\begin_inset Quotes erd +\end_inset + +Form main() +\begin_inset Quotes erd +\end_inset + +即可自动创建main方法如下: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane(new RMB2DollarConverter().mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-12.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备插入main方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备插入main方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +经过了以上的15个步骤,现在终于可以运行这个应用程序了 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本例的完整代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui +\end_layout + +\end_inset + +。和运行其他Java应用程序的方法一样,运行RMB2DollarConverter类结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "fig:RMB2DollarConverter的运行结果" + +\end_inset + +所示。可以在输入框输入人民币数额,然后点击“转换”按钮获得相应的美元数。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/RMB2DollarConverter-output.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +RMB2DollarConverter的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:RMB2DollarConverter的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +虽然在上面我们使用了15个步骤创建了一个简单的GUI应用程序,其实关键的步骤是4个,如下图所示: +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset include +LatexCommand input +filename "../imgs/gui/basic-gui-flow.pgf" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status collapsed + +\begin_layout Plain Layout +你可能会问,在类RMB2DollarConverter中的几个私有属性(对象):mainPanel、rmbTextField等是什么时候初始化的?很好的问题! +\end_layout + +\begin_layout Plain Layout +实际上,Idea通过一个xml文件(RMB2DollarConvert.form)保存了界面中所包含的组件及其属性和相互关系,在编译的时候,Idea会自动读取这个 +界面配置文件并生成创建界面中的组件的构造方法,也就是说,mainPanel等对象其实是Idea帮我们创建了的,我们可以直接拿来就用。 +\end_layout + +\begin_layout Plain Layout +可以通过反编译class文件看到这一点,在构造方法中的setupUI方法创建了各个界面组件对象(部分删减,请自行运行jad RMB2DollarConverte +r获得完整的反编译后的文件): +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class RMB2DollarConverter +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public static void main(String args[]) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane((new RMB2DollarConverter()).mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(3); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public RMB2DollarConverter() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + setupUI(); +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb.doubleValue() / 7D)); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private void setupUI() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JPanel jpanel; +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel; +\end_layout + +\begin_layout Plain Layout + + jpanel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + + mainPanel = jpanel; +\end_layout + +\begin_layout Plain Layout + + jpanel.setLayout(new FlowLayout(1, 5, 5)); +\end_layout + +\begin_layout Plain Layout + + jlabel = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + jlabel.setText(" +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel); +\end_layout + +\begin_layout Plain Layout + + JTextField jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield = new JTextField(); +\end_layout + +\begin_layout Plain Layout + + rmbTextField = jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield.setMinimumSize(new Dimension(14, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setPreferredSize(new Dimension(60, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setText("#.##"); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setToolTipText(" +\backslash +u8BF7 +\backslash +u8F93 +\backslash +u5165 +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +u6570 +\backslash +u989D"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jtextfield); +\end_layout + +\begin_layout Plain Layout + + JButton jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton = new JButton(); +\end_layout + +\begin_layout Plain Layout + + convertButton = jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton.setText(" +\backslash +u8F6C +\backslash +u6362"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jbutton); +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1 = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + dollarLabel = jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1.setPreferredSize(new Dimension(100, 21)); +\end_layout + +\begin_layout Plain Layout + + jlabel1.setText(" +\backslash +u7F8E +\backslash +u5143 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel1); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private JPanel mainPanel; +\end_layout + +\begin_layout Plain Layout + + private JTextField rmbTextField; +\end_layout + +\begin_layout Plain Layout + + private JButton convertButton; +\end_layout + +\begin_layout Plain Layout + + private JLabel dollarLabel; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status collapsed + +\begin_layout Plain Layout +在Idea的Form Designer中,我们看到可以直接拖放各种控件到应用程序界面中,并且可以直观的通过“属性查看器”查看和修改控件的属性,其中一个重要的属性 +是field name属性,即属性的名称。什么时候需要给控件的field name属性赋值,什么时候不需要理会field name属性呢?简单的说,如果我们在程 +序中需要获得这个控件的其他属性,比如输入的文字,或者需要在程序运行期间通过程序改变这个控件的状态,则需要给这个控件的field name赋值。比如常见的JLab +el控件一般是不需要field name属性的,而JTextField则需要field name属性。 +\end_layout + +\begin_layout Plain Layout +进一步的观察我们可以发现,只有给控件一个field name属性值,Idea才能在绑定的类中自动创建私有的属性对象(变量)表示这个控件,变量的名字就是field + name属性的值。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +GUI的顶级容器类 +\begin_inset CommandInset label +LatexCommand label +name "sec:GUI的顶级容器类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面也是“面向对象”的,比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + +是常见的一个窗口应用程序,我们从Java的观点来看,可以分为如下的几部分: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-app-outline.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java图形用户界面应用程序的大致布局 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +整个应用程序框架使用JFrame +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFrame +\end_layout + +\end_inset + +来表示,在JFrame内部布置了菜单栏(JMenuBar)、工具栏(JToolBar)、内容区(ContentPane),我们最经常操作的区域是ContentP +ane,即几乎所有的界面设计工作集中在ContentPane上面。 +\end_layout + +\begin_layout Standard +所以,JFrame是一个顶层的容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +容器 +\end_layout + +\end_inset + +,其他所有的界面组件都放置在顶层容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +顶层容器 +\end_layout + +\end_inset + +之中,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +所示。除了JFrame之外,Java也提供了JDialog、JApplet +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JApplet +\end_layout + +\end_inset + +顶层容器,分别用于对话框的设计和Applet +\begin_inset Foot +status open + +\begin_layout Plain Layout +一种已经没落的技术。 +\end_layout + +\end_inset + +的设计。本章重点介绍基于JFrame的Java图形用户界面设计,JDialog +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDialog +\end_layout + +\end_inset + +的用法于此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jframe-overview.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java GUI应用程序的基本结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java-GUI应用程序的基本结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +不介绍分层的面板会有影响吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的代码展示了 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +中的组件间的关系: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +JFrame frame = new JFrame("标题栏内容"); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JLabel("a label", BorderLayout.TOP)); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JTextField("##.##", BorderLayout.BOTTOM)); +\end_layout + +\begin_layout Plain Layout + +JPanel panel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JLabel("another label")); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JCheckBox(...)); +\end_layout + +\begin_layout Plain Layout + +frame.add(panel, BorderLayout.CENTER); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing控件 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing控件" + +\end_inset + + +\end_layout + +\begin_layout Subsection +JLabel +\begin_inset CommandInset label +LatexCommand label +name "subsec:JLabel" + +\end_inset + + +\end_layout + +\begin_layout Standard +Label(文本标签)也许是最简单的Swing控件了,一般用来表示界面上的几个字符或者一段提示性文字、展示输出结果、图标等。 +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel的主要属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JLabel的主要属性" + +\end_inset + +所示(每个属性对应一对get/set方法),请参照Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +的属性对话框了解属性值的可能取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label所使用的图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的纵向对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的垂直位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +textGap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字和图片之间的间隙(像素值) +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的主要属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JLabel的主要属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JLabel示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/sr +c/cn/edu/sdut/softlab/,双击JLabelDemo.form即可打开Form Designer查看界面设计效果。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们在内容区增加了三个JLabel:最上面的Label同时包含了文字和图片,中间的Label只包含了文字,最下面的Label只包含了图片,其属性对话框的设置分别 +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:顶部Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:中间Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:下面Label属性框设置" + +\end_inset + +所示,其中修改过的属性已经黑体加重标注了,没有使用黑体标注的属性无需设置。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +当拖放第一个JLabel到内容区的时候,Form Designer自动在这个JLabel的下面增加了一个垂直占位符,以保证这个JLabel能够在希望的顶部展示。 +由于我们还要增加下面的两个Label,因此这里可以删除这个垂直占位符。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-1.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +顶部Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:顶部Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-2.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +中间Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:中间Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-3.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +下面Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:下面Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的属性对话框 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此示例,初始状态如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:运行的初始状态" + +\end_inset + +所示,可以尝试缩放窗口,比如水平放大窗口可以更明显的看出效果,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:水平方法后的窗口" + +\end_inset + +所示。请任意缩放窗口请注意观察这三个Label位置的变化,体会水平对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +水平对齐 +\end_layout + +\end_inset + +、垂直对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +垂直对齐 +\end_layout + +\end_inset + +等的效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-4.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行的初始状态 +\begin_inset CommandInset label +LatexCommand label +name "fig:运行的初始状态" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-5.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +水平放大后的窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:水平方法后的窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabelDemo运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +注意以下几点: +\end_layout + +\begin_layout Itemize +这三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel都无需设置field name属性值。 +\end_layout + +\begin_layout Itemize +特别注意观察Horizental Align属性的不同效果,可以尝试不同的水平对齐方式观察效果(通过Idea的Form Designer提供的预览工具更方便,在 +Form Designer界面直接右键选择“preview”即可)。 +\end_layout + +\begin_layout Itemize +在组合使用文本和图片时,还要注意horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +和verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +这两个属性的效果。 +\end_layout + +\begin_layout Subsection +文本控件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:JTextField" + +\end_inset + + +\end_layout + +\begin_layout Standard +Swing的文本控件是指能够输入文本的控件,比如文本框(JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +)、文本域(JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +)、富文本编辑器(JEdtiorPane +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JEdtiorPane +\end_layout + +\end_inset + +)等。Swing的文本控件类的关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本输入控件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/text-input-controls.eps + lyxscale 40 + scale 40 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本输入控件 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本输入控件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +单行纯文本控件:用于输入一行纯文本字符串。根据场合不同,可以选择使用JTextField,输入简单的单行字符串;或者JFormattedTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFormattedTextField +\end_layout + +\end_inset + +,输入格式化的单行字符串,比如表示日期的“2017-3-12”等;或者JPasswordField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JPasswordField +\end_layout + +\end_inset + +,输入密码(默认不显示输入的密码)。 +\end_layout + +\begin_layout Itemize +多行纯文本控件:用于输入多行纯文本字符串。如果需要输入的字符串比较长,可以采用JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +,会显示一个多行的文本编辑区域供输入。 +\end_layout + +\begin_layout Itemize +多行富文本控件:用于输入带格式的文本字符串,通常用于输入HTML等格式的字符串。 +\end_layout + +\begin_layout Standard +文本控件的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:文本控件的常见属性" + +\end_inset + +所示,请参照Form Designer中的属性对话框了解这些属性的取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的内容 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +editable +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否可编辑 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +columns +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的长度(多少个字符),仅仅作为计算默认显示宽度的依据 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +字符在文本框内的对齐方式,可以选择:JTextField.LEADING, JTextField.CENTER, JTextField.TRAILING +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:文本控件的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +文本控件示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个同时展示三种TextField的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +详情请参见:https://github.com/subaochen/java-tutorial-examples/blob/master/gui/src/cn/ +edu/sdut/softlab/TextControlDemo.form +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +.当在文本框中输入一些字符后(失去焦点后),在最下面的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Label +\end_layout + +\end_inset + +Label中显示输入的内容。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-1.png + width 95line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此应用程序的界面如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +这个简单的示例我们要注意以下三点: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +示例代码的布局要说明吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +可以通过 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Panel +\end_layout + +\end_inset + +Panel进一步组织控件,这是一种常见的手段。在例中,我们把三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +TextField +\end_layout + +\end_inset + +TextField控件放到一个Panel中,在把这Panel添加到mainPanel中。并且,放置三个TextField的Panel添加了标题(title):“ +单行纯文本控件”,以更清晰的表达这个Panel的意义,这也是一种常见的手段。 +\end_layout + +\begin_layout Itemize +请参照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "par:步骤12" + +\end_inset + +为三个TextField添加FocusListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +FocusListener +\end_layout + +\end_inset + +,这里我们重点监听了失去焦点的事件。 +\end_layout + +\begin_layout Itemize +本例也可以监听ActionListener(当在输入框按下回车键时触发该事件)获得当前输入框的内容,请读者自行完成相关代码并运行测试。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +焦点 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +焦点 +\end_layout + +\end_inset + +(Focus)通常是指文本输入框是否正在接受输入。获得焦点即文本输入框可以输入文字,失去焦点即文本输入框不再能够输入文字,即光标已经离开了此输入框。失去焦点往往 +意味着用户结束了输入,因此,我们可以通过监听失去焦点事件来获得文本输入框中的内容。 +\end_layout + +\begin_layout Plain Layout +如果焦点的概念用于窗口(应用程序),则获得焦点意味着当前窗口是活动窗口,即可操作的窗口;失去焦点意味着其他窗口获得了焦点,当前窗口不可操作。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +按钮(Button +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Button +\end_layout + +\end_inset + +)是一种常见的交互控件,在Swing中最常见的按钮通过JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +来描述。按钮用法很直接,通常涉及到以下三个方面: +\end_layout + +\begin_layout Itemize +给按钮一个合适的名称,包括显示在按钮上面的文字。 +\end_layout + +\begin_layout Itemize +有的时候希望在按钮上面也显示图标以更明确的表达按钮的意思,可以通过按钮的icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性来设置图标。 +\end_layout + +\begin_layout Itemize +给按钮添加鼠标点击的响应代码( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +ActionListener或者MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +JButton的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JButton的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否允许点击 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的图标 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的对齐方式 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JButton的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JButton的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JButton示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JButton示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含三个按钮的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例Panel" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例Panel +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例Panel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +依然参照 +\begin_inset CommandInset ref +LatexCommand formatted +reference "par:步骤12" + +\end_inset + +为这三个Button 添加三个ActionListener,分别响应鼠标左键单击事件。 +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时点击各个按钮,观察发生了什么?比如点击“紧急呼叫”按钮,弹出了一个消息框,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例运行结果" + +\end_inset + +所示。点击“被禁止的按钮”,会怎样? +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +请仔细查看三个按钮的属性对话框以了解这三个按钮是如何实现这样的效果的: +\end_layout + +\begin_layout Itemize +第一个按钮演示了按钮上是可以图文并茂的(设置icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性即可),并且通过设置horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Leading(在开头),将图片放到了文字的后面。 +\end_layout + +\begin_layout Itemize +第二个按钮演示了如何将按钮上的文字和图片上下布局:首先让按钮上的内容水平居中(horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Center),然后设置verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +属性为Bottom即可。 +\end_layout + +\begin_layout Itemize +第三个按钮设置enabled为false即可,即去掉默认选中的enabled选项。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +默认的,JButton的actionListener是响应鼠标左键单击事件的,比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +example +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JButton示例" + +\end_inset + +中,我们给按钮增加了响应鼠标左键单击的actionListener,那么如何响应鼠标右键、中键的单击事件呢?参见下面的代码: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// 响应右键单击事件 +\end_layout + +\begin_layout Plain Layout + +emegencyCallButton.addMouseListener(new MouseAdapter() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void mouseClicked(MouseEvent mouseEvent) { +\end_layout + +\begin_layout Plain Layout + + super.mouseClicked(mouseEvent); +\end_layout + +\begin_layout Plain Layout + + if(SwingUtilities.isRightMouseButton(mouseEvent) && mouseEvent.getClickCou +nt() == 1) { +\end_layout + +\begin_layout Plain Layout + + JOptionPane.showMessageDialog(null,"右键单击急呼叫按钮"); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +}); +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JCheckBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JCheckBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +JCheckBox通常叫做“复选框”,即可以同时打开或关闭多个选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +对比一下JRadioButton(单选框),JRadionButton只能在一组选项中选中一项。 +\end_layout + +\end_inset + +。当选项被选中时,该复选框的“选择”状态为true,否则为false。 +\end_layout + +\begin_layout Standard +JCheckBox的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JCheckBox的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否启用这个控件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +selected +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox默认的选中状态 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直位置 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JCheckBox的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JCheckBox示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JCheckBox示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含4个CheckBox(业余爱好)的Panel +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当鼠标点击某个爱好时显示选中的CheckBox的状态;当鼠标移动到某个爱好上面时,同步显示表示这个业余爱好的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时,注意观察鼠标在各个CheckBox上面和离开CheckBox时界面的不同反应,选中或者反选选项时不同的消息提示,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-2.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行初始状态 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-3.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +鼠标移动到“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-4.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选中“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +我们为每个JCheckBox添加了两个事件监听器,一个ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +用于监听鼠标左键单击选项选择或者反选时产生的事件,一个MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +用于监听当鼠标进入或者离开选项所在区域时产生的事件。 +\end_layout + +\begin_layout Paragraph +延伸阅读 +\end_layout + +\begin_layout Standard +其实,JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +, JCheckBox +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +, JRadionButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadionButton +\end_layout + +\end_inset + +等都从 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +AbstractButton +\end_layout + +\end_inset + +AbstractButton继承下来的,即JButton一族的类层次关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button类层次关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-overview.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button类层次关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button类层次关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +因此,JButtron、JCheckBox、JRadionButton等的共性就不难理解了。 +\end_layout + +\begin_layout Subsection +JRadioButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JRadioButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + +JRadioButton通常叫做“单选框”,即通过JRadionButton可以展示一组选项,但是只能有一个选项处于“选中”状态。当选择另外一个选项时,原先被选 +中的选项自动失效。 +\end_layout + +\begin_layout Standard +JRadionButton的常见属性和JCheckBox基本相同,只有一点需要注意:JRadioButton的buttonGroup属性是必须设置的,即每个JR +adioButton都需要设置buttonGroup属性,表明这个JRadioButton是属于哪个“组”的,以便Java根据用户的选择情况设置当前组的Radi +oButton哪个有效,哪个失效。 +\end_layout + +\begin_layout Example +JRadionButton示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +类似于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +,我们设计一个图形用户应用程序 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,根据选项决定显示哪种运动的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadioButton示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadioButton示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadioButton示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +点击不同的选项,将显示不同的运动图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadionButton示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadionButton示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadionButton示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例中,我们手工创建了ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +,通常JRadioButton的ActionListener需要手工创建更合适,因为JRadioButton一般需要设置为属于某个ButtonGroup,整个B +uttonGroup设计一个ActionListener就可以了,没有必要每个JRadioButton都独立设计一个ActionListener,如下列代码所示 +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RadioButtonDemo() { +\end_layout + +\begin_layout Plain Layout + + swimming.setActionCommand("swimming"); +\end_layout + +\begin_layout Plain Layout + + swimming.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + tennis.setActionCommand("tennis"); +\end_layout + +\begin_layout Plain Layout + + tennis.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + basketball.setActionCommand("basketball"); +\end_layout + +\begin_layout Plain Layout + + basketball.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + football.setActionCommand("football"); +\end_layout + +\begin_layout Plain Layout + + football.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + sportLabel.setIcon(new ImageIcon(RadioButtonDemo.class.getResource("/images +/" +\end_layout + +\begin_layout Plain Layout + + + actionEvent.getActionCommand() + ".png"))); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在以上代码中,我们在构造方法中为每个JRadioButton指定了actionCommand +\begin_inset Index idx +status open + +\begin_layout Plain Layout +actionCommand +\end_layout + +\end_inset + +以便在监听器代码中获取actionCommand拼装图片的路径。 +\end_layout + +\begin_layout Standard +另外需要注意的是,我们需要将这组JRadionButton设置一个共同的ButtonGroup,即在Form Designer中如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:设置ButtonGroup" + +\end_inset + +所示,创建一个新的ButtonGroup +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ButtonGroup +\end_layout + +\end_inset + +,并将所有JRadioButton的ButtonGroup属性都设置为这个新建的ButtonGroup。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +设置ButtonGroup +\begin_inset CommandInset label +LatexCommand label +name "fig:设置ButtonGroup" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JComboBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JComboBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JcomboBox +\end_layout + +\end_inset + +JcomboBox表示“下列选择框”,通常在空间比较紧张或者选项很多时采用下拉选择框比较合适。 +\end_layout + +\begin_layout Example +下拉选择框示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:下拉选择框示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +类似,我们设计一个下拉选择框来提供运动项目选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当选中某个运动项目时则显示相应的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到,下拉选择框sports需要设置在其中要显示的条目,可以通过属性对话框的model属性来设置,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox的model属性设置" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox的model属性设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox的model属性设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +该示例的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +其他常见控件 +\end_layout + +\begin_layout Subsubsection* +Spinner +\begin_inset CommandInset label +LatexCommand label +name "subsec:Spinner" + +\end_inset + + +\end_layout + +\begin_layout Standard +Spinner是一种便捷填写数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Slider +\begin_inset CommandInset label +LatexCommand label +name "subsec:Slider" + +\end_inset + + +\end_layout + +\begin_layout Standard +Slider是一种通过滑动选择数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Tabbed Pane +\begin_inset CommandInset label +LatexCommand label +name "subsec:Tabbed-Pane" + +\end_inset + + +\end_layout + +\begin_layout Standard +Tabbed Pane可以实现“标签页”,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Section +布局管理器 +\begin_inset CommandInset label +LatexCommand label +name "sec:布局管理器" + +\end_inset + + +\end_layout + +\begin_layout Standard +在图形用户界面应用程序的设计中,界面中的控件如何布局总是一个容易让人困扰的问题,有过WEB界面设计经历的读者可能对此有更深刻的体会。比如当窗口大小或者分辨率发生 +改变的时候,如何保证界面布局符合当初的设计(期望)呢?通常有两种常见的界面布局思路:绝对布局和相对布局。绝对布局是指使用绝对(像素)坐标确定控件在界面的位置,很 +显然,当窗口大小发生改变时,绝对布局的界面不会随窗口发生改变,于是导致了不能充分利用放大了的窗口或者无法适应缩小了的窗口,因此绝对布局在实际的编程中很少用到,也 +不建议使用绝对布局,本节主要阐述各种相对布局的基本思路和方法。 +\end_layout + +\begin_layout Subsection +BorderLayout +\end_layout + +\begin_layout Standard +BorderLayout很像“麻将桌”,将界面分为5个部分: +\end_layout + +\begin_layout Itemize +PAGE_START:界面的顶部 +\end_layout + +\begin_layout Itemize +PAGE_END:界面的底部 +\end_layout + +\begin_layout Itemize +LINE_START:界面的左边 +\end_layout + +\begin_layout Itemize +LINE_END:界面的右边 +\end_layout + +\begin_layout Itemize +CENTER:界面的中间 +\end_layout + +\begin_layout Standard +BorderLayout的特点是,当窗口缩放时,四周的控件只占用尽可能小的空间,中间的控件将随窗口占用尽可能多的空间。 +\end_layout + +\begin_layout Example +BorderLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例" + +\end_inset + +所示,5个按钮分别位于界面的4边和中间 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +。注意到我们将主Panel的Layout Manager修改为了BorderLayout,而不是默认的GridBagLayout。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-0.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" + +\end_inset + +所示的运行结果是放大窗口后的效果。建议读者在不同的窗口大小情况下观察BorderLayout的布局效果,以加深对BorderLayout的理解。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-1.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +这个示例很简单,我们只是修改了Panel的Layout Manager为BorderLayout,然后将5个按钮依次放到界面的合适位置即可。 +\end_layout + +\begin_layout Exercise +尝试将 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +中“Center”按钮所在的位置替换为另外一个“麻将桌”,即如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout练习1" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +示的效果。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/BorderLayout-exe1.1.png + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout练习1 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout练习1" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +FlowLayout +\end_layout + +\begin_layout Standard +流式布局(FlowLayout)是一种很自然的布局方式,即各个控件按照加入的顺序在窗口从左向右依次排开,各自只占用尽量小的空间。 +\end_layout + +\begin_layout Example +FlowLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例设计" + +\end_inset + +所示,设计一个包含若干按钮和RadioButton的应用程序 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,控件使用FlowLayout布局。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +默认的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例运行结果" + +\end_inset + +所示。请尝试改变窗口的大小观察FlowLayout的布局效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例重点有两个: +\end_layout + +\begin_layout Itemize +mainPanel采用了FlowLayout布局管理器。 +\end_layout + +\begin_layout Itemize +mainPanel的preferedSize修改为300x200,以便更好的展现FlowLayout的布局效果。 +\end_layout + +\begin_layout Subsection +CardLayout +\end_layout + +\begin_layout Example +CardLayout示例 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例设计" + +\end_inset + +所示 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,主界面使用默认的GridLayout,界面的上半部分放置了一个下拉选择框,根据不同的选择展示不同的card。下半部分是一个Panel,此Panel(cardP +anel)使用CardLayout,在其中添加了两个card,分别是buttonPanel和textFieldPanel。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-1.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +根据选择的不同,可以看到显示了不同card的内容,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-2.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +默认运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-3.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Card with JTextField +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +增加代码的分析,因为CardLayout的代码不是特别直观 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +CardLayout的show方法可以有选择的显示指定的card,注意到show方法的第二个参数是指定的card的name(字符串),因此在Form + Designer中要设置每个card的name属性。为了和下拉选择框的设置一致,在本例中card的name属性设置为了下拉选择框的相应文字。 +\end_layout + +\begin_layout Standard +注意到mainPanel的布局管理器我们使用了Idea默认的GridBLayout,可以尝试换为BorderLayout或者FlowLayout看看效果如何? +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在本例中我们使用了一个常见的Java GUI界面设计技巧:通过Panel在局部组织控件,然后对Panel使用合适的布局管理器进行管理。也就是说,通常一个Java + GUI的界面设计是分为两个层面的:第一个层面,对整个界面进行合理的大体的界面划分(使用Panel);第二个层面,在每个Panel内部进行控件的合理布局。我们在 +Java GUI的综合应用举例中还会看到这种布局策略。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridLayout +\end_layout + +\begin_layout Standard +网格布局(GridLayout)是将整个界面划分为表格,表格的每个单元格可以放置一个控件(或者Panel),从而实现了规整的界面布局。影响GridLayout效 +果的除了表格单元格的个数之外,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridLayout的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的水平间隔的像素值,-1代表使用父容器的此设置,或者内置的10px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的垂直间隔的像素值,-1代表使用父容器的此设置,或者内置的5px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size horizentally +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在水平方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size vitically +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在垂直方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +margin +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +容器和控件之间的四周间隔大小 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +使用GridLayout设计一个3x2的表格,其中放置5个按钮 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例运行结果" + +\end_inset + +所示,GridLayout的用法简洁明了,请自行在Form Designer中修改相应的参数,比如virticalGap(水平间隔),horizentalGap +(垂直间隔)等观察这些参数对布局的影响。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +使用Idea设计GridLayout界面 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们使用了Idea提供的GridLayoutManager,详情请参考: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://www.formdev.com/jformdesigner/doc/layouts/intellijgridlayout/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +的小技巧:Idea的Form Designer通常能够智能的判断应该使用多少格子来放置控件,但是我们也必须给出明确的“指令”。比如我们希望设计如下的界面: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第一步,先添加三个JTextField,然后在第一个JTextField上面放置一个JLabel,如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第二步,需要首先将三个JTextField调整到一个水平面上,即如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-3.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第三步,添加另外的两个JLabel。 +\end_layout + +\begin_layout Plain Layout +如果没有在第二步首先将三个JTextField调整到一个水平面上,则继续添加JLabel时Form Designer可能会错误的领会我们的意思,从而错误的计算单 +元格的数量,读者可自行尝试和认真体会。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridBagLayout +\end_layout + +\begin_layout Standard +网格袋布局(GridBagLayout)显然是GridLayout的扩展:GridLayout只允许控件放置在一个单元格中,而GridBagLayout允许一个 +控件占用多个单元格,因而GridBaglayout更加灵活,控制选项(属性)也比较多,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout的常见属性" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本书以JetBrain Idea提供的Form Designer为蓝本说明GridBagLayout的常见属性,和标准的Java Swing的GridBagLa +yout的属性略有出入。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格的起始x坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格中的起始y坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid width +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件横向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid height +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件纵向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的对齐方式,Fill意味着充满可能的横向空间(受weight x设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Fill +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的对齐方式,Fill意味着充满可能的纵向空间(受weight y设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Center +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向扩展的权重。如果值为0则横向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向扩展的权重。如果值为0则纵向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +insets +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件的外边距 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea的Form Designer中,grid x/grid y/grid width/grid height属性是通过拖放控件自动设置的,无需手工设置。实 +际上,Form Designer的属性对话框没有提供编辑这4个属性的功能。 +\end_layout + +\begin_layout Plain Layout +如果熟悉CSS的盒子模型的话,insets相当于CSS盒子模型的margin,ipadx/ipady相当于CSS盒子模型的padding。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridBagLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例设计" + +\end_inset + +所示,我们设计一个包含几个按钮的界面,使用GridBagLayout布局管理器。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-2.png + scale 70 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +本例中各控件的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonB +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Another Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 2,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +A Long Name Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 1 +\end_layout + +\begin_layout Plain Layout +grid width = 3, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonC +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonD +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 3 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 2, grid height = 2 +\end_layout + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例应用中的控件属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +请读者尝试 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件属性的各种组合方式" + +\end_inset + +的控件属性组合方式,观察GridBagLayout在界面布局中的灵活性。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +测试场景 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置ButtonA的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件属性的各种组合方式 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件属性的各种组合方式" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +JAVA图形用户界面的事件机制 +\begin_inset CommandInset label +LatexCommand label +name "sec:JAVA图形用户界面的事件机制" + +\end_inset + + +\end_layout + +\begin_layout Subsection +事件机制的基本原理 +\end_layout + +\begin_layout Standard +事件机制是指代码如何对界面的点击、输入等事件做出响应,我们在前面的例子中已经多次使用了Swing的事件机制。Swing事件机制的三个要点是: +\end_layout + +\begin_layout Itemize +事件源(Event Source):即触发事件的控件,比如按钮、文本框等。 +\end_layout + +\begin_layout Itemize +事件对象(Event Object):描述事件的封装对象,其中包括了事件源、事件发生事件、事件相关参数(比如鼠标事件包括鼠标点击的坐标、鼠标点击次数等)等。 +\end_layout + +\begin_layout Itemize +监听器(Listener):当事件发生时Java会自动调用的方法被称为监听器。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Swing事件机制" + +\end_inset + +说明了按钮事件的处理过程 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里对“注册”的原理没有展开说明,需要说明Event Loop的过程吗?需要说明注册和Java虚拟机的关系吗? +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +是否可以在这里增加一个设计模式的示例?比如设计一个Container模拟OS,设计一个Listener模拟按钮、checkbox等 +\end_layout + +\end_inset + +,其他类型的事件处理过程与此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-event-model.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Swing事件机制(以按钮为例) +\begin_inset CommandInset label +LatexCommand label +name "fig:Swing事件机制" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +控件的常见监听器 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的Java GUI控件和事件监听器的对照表参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件的常见监听器" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +常用监听器 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应鼠标左键单击和回车事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应除左键单击外的其他的各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应在输入框回车事件 +\end_layout + +\begin_layout Plain Layout +FocusListener:响应获得和失去焦点事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JComboBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件的常见监听器 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件的常见监听器" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +监听器类的几种情形 +\end_layout + +\begin_layout Standard +注意到注册监听器的方法:src.addXxxListener(listenerObject)的参数是一个实现了监听器接口的对象,即通过这个方法告诉Java虚拟机, +当src(事件源)对象产生了一个Xxx类型的事件时,需要调用listenerObject中的相关方法进行事件处理。在实现监听器时,通常有如下的几种策略,以按钮的 +单击事件actionEvent为例: +\end_layout + +\begin_layout Itemize +主类直接实现XxxListener接口或者扩展XxxHandler类,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(this); // 注册事件监听器。由于FrameDemo本身实现ActionListener接 +口,因此这里直接使用this作为实现了事件监听器接口的对象。 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用匿名内部类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ActionListener() { // 匿名内部类实现ActionListener接 +口 +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用独立的类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ButtonListener()); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +// 独立的事件监听器类,实现了ActionListener接口 +\end_layout + +\begin_layout Plain Layout + +class ButtonListener implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在大多数情况下,我们建议使用匿名内部类实现监听器接口,代码更简洁,封装性更好。 +\end_layout + +\begin_layout Section +Java GUI综合应用举例 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java-GUI综合应用举例" + +\end_inset + + +\end_layout + +\begin_layout Example +计算器 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +这是一个典型的可以使用GridBagLayout进行界面设计的应用场合,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的界面设计" + +\end_inset + +所示。为了更好的适应窗口大小,界面中的所有控件设置了如下属性: +\end_layout + +\begin_layout Itemize +horizental align:Fill +\end_layout + +\begin_layout Itemize +virtical align: Fill +\end_layout + +\begin_layout Itemize +weight x : 1.0 +\end_layout + +\begin_layout Itemize +weight y : 1.0 +\end_layout + +\begin_layout Standard +完整的代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Caculator.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/gui/src/cn/edu/sdut/softlab/Caculator.java" +lstparams "caption={Caculator.java},label={Caculator.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的界面设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的界面设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-2.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例为了简化起见,表达式的求值借用了JDK内置的JavaScript引擎,有兴趣的读者可以自行实现一个表达式求值的引擎或者方法。 +\end_layout + +\begin_layout Exercise +请尝试使用GridLayout重新设计计算器(提示:首先使用GridLayout将界面分为上下两部分,上部分是一个Panel显示计算结果,使用任意的Layout +即可;下部分是一个显示计算按钮的Panel,使用GridLayout布局)。 +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture13.lyx b/guide/lecture_guide/lecture13.lyx new file mode 100644 index 0000000..b03b32c --- /dev/null +++ b/guide/lecture_guide/lecture13.lyx @@ -0,0 +1,9852 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十三次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:布局管理器" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:布局管理器" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:BorderLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:BorderLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:FlowLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:FlowLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:CardLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:CardLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:GridLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:GridLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:GridBagLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:GridBagLayout" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java布局管理器的意义; +\end_layout + +\begin_layout Enumerate +常见的Java布局管理器及其使用场合; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +常见布局管理器的综合运用; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握Swing的布局管理器的基本设计思想; +\end_layout + +\begin_layout Enumerate +基本能够综合使用布局管理器设计常见的用户界面; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +使用布局管理器设计界面有什么好处? +\end_layout + +\begin_layout Enumerate +设计复杂的界面时,一般要遵循什么原则?即如何综合运用布局管理器设计复杂的用户界面? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +图形用户界面设计 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/gui/gui.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Section +Java的图形用户界面(GUI)设计概述 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的图形用户界面(GUI)设计概述" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +GUI +\end_layout + +\end_inset + +GUI)是由 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFC +\end_layout + +\end_inset + +JFC(Java Foundation Classes)支撑的,JFC包括了以下几个方面: +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing GUI组件:包含了图形用户界面设计中的人机交互组件,从最简单的按钮到复杂的图表等无所不包,这是我们学习的重点内容。 +\end_layout + +\begin_layout Itemize +可插拔的Look-and-Feel支持:Java图形用户界面支持可配置的Look-and-Feel切换,可以很容易的实现不同操作系统下的界面统一。 +\end_layout + +\begin_layout Itemize +辅助API:支持读屏幕等操作。 +\end_layout + +\begin_layout Itemize +Java 2D API:完善的2D绘图API。 +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +国际化 +\end_layout + +\end_inset + +国际化支持:秉承Java一贯的国际化支持,能够方便的在GUI中处理各种编码的文字。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Swing是在早期的Java GUI应用程序设计接口AWT的基础上发展起来的,目前是Java GUI应用程序设计的官方标准。除了Swing之外,Eclipse( +www.eclipse.org)组织也发布了一套Java图形用户界面的设计库SWT(Standard Widget Toolkit),主要配合Eclipse的RCP +(Rich Client Program)应用程序开发,详情可参考:https://www.eclipse.org/swt/ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing入门 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing入门" + +\end_inset + + +\end_layout + +\begin_layout Standard +本节以JetBrain Idea为例说明如何创建和运行简单的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing应用程序。 +\end_layout + +\begin_layout Example +使用Idea创建一个简单的Swing应用程序,将人民币转换为美元。 +\end_layout + +\begin_layout Paragraph* +步骤1 +\end_layout + +\begin_layout Standard +创建一个新的Java项目,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:新建一个Java项目" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +新建一个Java项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:新建一个Java项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤2 +\end_layout + +\begin_layout Standard +在接下来的项目配置窗口中,可以不选择从模板创建项目,因为我们要创建一个GUI应用程序,命令行应用的模板没有实质用处,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-2.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +跳过从模板创建项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤3 +\end_layout + +\begin_layout Standard +给项目起个名字,这里叫做“gui”,并选择项目所在的目录,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给项目起个名字" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给项目起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给项目起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤4 +\end_layout + +\begin_layout Standard +在项目的“project视图”中,右键点击src,在弹出的菜单中选择New->GUI Form,新建一个Form表单 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form表单 +\end_layout + +\end_inset + +,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备新建一个Form表单" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-1.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备新建一个Form表单 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备新建一个Form表单" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +如果在菜单中没有出现GUI Form子菜单,系没有安装Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +插件所致,请在系统设置中激活Form Designer即可,方法是在File->Settings...菜单中搜索“UI Designer”插件并安装激活,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:安装并激活UI-Designer插件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/active-ui-designer.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +安装并激活UI Designer插件 +\begin_inset CommandInset label +LatexCommand label +name "fig:安装并激活UI-Designer插件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +图片和文字可能不在一个页面,应该想办法处理一下 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤5 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给Form起个名字" + +\end_inset + +所示,给将要创建的Form起个名字,这里叫做“RMB2DollarConverter”,选择布局管理器(此处先认可默认设置,随后可以更改)。注意要勾选(默认已经 +勾选了) +\begin_inset Quotes erd +\end_inset + +create bound class +\begin_inset Quotes erd +\end_inset + +选项,即同时创建和这个Form绑定在一起的Java类。这个Java类我们将来用于显示和操作这个Form。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给Form起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给Form起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤6 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:空白的Form设计窗口" + +\end_inset + +所示,在新建Form后会呈现一个空白的Form设计窗口,其主要组成部分为: +\end_layout + +\begin_layout Itemize +界面组件关系图:在这个窗口中展示了组件的“父子”关系,目前只有一个JPanel组件,随后我们会加入更多组件,可以通过这个窗口直观的查看组件之间的关系。也可以通过 +这个窗口快捷的选择某个组件进行操作。 +\end_layout + +\begin_layout Itemize +组件属性窗:当在主设计界面或者界面组件关系窗口中选择了某个组件时,组件属性窗的内容将随之改变。可以通过这个窗口方便的了解界面组件拥有哪些属性,当然,更重要的是, +可以设置界面组件的属性值。 +\end_layout + +\begin_layout Itemize +主设计界面:可以拖放“组件面板”中的组件导主设计界面,主设计界面会根据使用的布局管理器的不同,自动摆放组件。 +\end_layout + +\begin_layout Itemize +组件面板:列出了各种Swing界面组件,可以方便的拖放到主设计界面。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +空白的Form设计窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:空白的Form设计窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤7 +\end_layout + +\begin_layout Standard +首先在“界面组件关系窗口”中选择目前唯一的组件Panel,然后在组件属性窗口中编辑“field name”属性,设置其值为“mainPanel +\begin_inset Quotes erd +\end_inset + +。这里的值是什么并不重要的,重要的是必须给主Panel设置一个名字,否则将来无法显示这个Panel。 +\end_layout + +\begin_layout Standard +在这里,我们也将mainPanel的 +\begin_inset Quotes erd +\end_inset + +Layout Manager +\begin_inset Quotes erd +\end_inset + +(布局管理器)修改为更为简单的 +\begin_inset Quotes erd +\end_inset + +FlowLayout +\begin_inset Quotes erd +\end_inset + +,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:布局管理器" + +\end_inset + +一节详细的阐述各种布局管理器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +布局管理器 +\end_layout + +\end_inset + +的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-4.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给主Panel起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给主Panel起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤8 +\end_layout + +\begin_layout Standard +在“组件面板”窗口选择JLabel组件拖放到主设计界面,可以看到在“界面组件关系”窗口中,JLabel包含在mainPanel中。这里只是简单的设置这个JLab +el的text属性为“人民币:”即可。JLabel的目的是显示一个标签 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +标签 +\end_layout + +\end_inset + +,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:JLabel" + +\end_inset + +一节详细讨论Jlabel的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-5.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加一个简单的Label +\begin_inset CommandInset label +LatexCommand label +name "fig:添加一个简单的Label" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤9 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加JTextField组件" + +\end_inset + +所示,接着添加一个JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +组件到主设计界面。这个JTextField我们用来输入人民币数额,因此要设置其 +\begin_inset Quotes erd +\end_inset + +field name +\begin_inset Quotes erd +\end_inset + +属性。为了更好的显示这个输入框,也设置了这个JTextField的默认宽度(preferedSize->width)和默认显示的文字(text属性)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-6.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加JTextField组件 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加JTextField组件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤10 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加转换按钮" + +\end_inset + +所示,再增加一个“转换”按钮 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +按钮 +\end_layout + +\end_inset + +,设置这个按钮的field name和text属性。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-7.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加转换按钮 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加转换按钮" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤11 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加显示转换结果的JLabel" + +\end_inset + +所示,在界面中再添加一个用于显示转换结果的JLabel。由于我们要通过程序设置这个JLabel的text属性,因此要设置这个JLabel的field + name属性。为了能够更好的显示转换后的结果,也有设置这个JLabel的宽度,这里设置为100(像素值)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-8.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加显示转换结果的JLabel +\begin_inset CommandInset label +LatexCommand label +name "fig:添加显示转换结果的JLabel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤12 +\begin_inset CommandInset label +LatexCommand label +name "par:步骤12" + +\end_inset + + +\end_layout + +\begin_layout Standard +界面的设计工作基本就绪,下面我们为按钮设计处理代码。如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备创建Listener" + +\end_inset + +所示,在主设计界面的“转换”按钮上点击右键,在弹出的菜单中选择“create Listener”,准备创建一段点击此按钮的响应代码。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-9.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备创建Listener +\begin_inset CommandInset label +LatexCommand label +name "fig:准备创建Listener" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤13 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择Listener的类型" + +\end_inset + +所示,在接下来的窗口中选择Listener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Listener +\end_layout + +\end_inset + +的类型为“ActionListener”。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-10.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Listener的类型 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择Listener的类型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤14 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +所示,在接下来的窗口中,选择ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +需要覆盖的方法。这里只有一个选项,已经自动选中了。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-11.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择需要覆盖的方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择需要覆盖的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +点击 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +中的“OK”按钮后,在所绑定的方法中自动添加了一个构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + +,内容如下(行5-7是自己编写的): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RMB2DollarConverter() { +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + // 获取文本输入框的文字内容并转换为double +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb / 7.0)); // 假设当前人民币和美元汇率为7.0 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这是GUI应用程序事件处理的基本方法,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "sec:JAVA图形用户界面的事件机制" + +\end_inset + +一节中具体讨论。 +\end_layout + +\begin_layout Paragraph* +步骤15 +\end_layout + +\begin_layout Standard +最后一步,我们需要在类RMB2DollarConverter中增加一个main方法并初始化和显示应用程序窗口,JetBrain Idea提供了自动化的代码生成工 +具,只需要在代码的合适位置(希望插入main方法的位置)按下Alt+Insert +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Alt+Insert +\end_layout + +\end_inset + +组合键,在如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备插入main方法" + +\end_inset + +所示的窗口中选择 +\begin_inset Quotes erd +\end_inset + +Form main() +\begin_inset Quotes erd +\end_inset + +即可自动创建main方法如下: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane(new RMB2DollarConverter().mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-12.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备插入main方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备插入main方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +经过了以上的15个步骤,现在终于可以运行这个应用程序了 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本例的完整代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui +\end_layout + +\end_inset + +。和运行其他Java应用程序的方法一样,运行RMB2DollarConverter类结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "fig:RMB2DollarConverter的运行结果" + +\end_inset + +所示。可以在输入框输入人民币数额,然后点击“转换”按钮获得相应的美元数。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/RMB2DollarConverter-output.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +RMB2DollarConverter的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:RMB2DollarConverter的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +虽然在上面我们使用了15个步骤创建了一个简单的GUI应用程序,其实关键的步骤是4个,如下图所示: +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset include +LatexCommand input +filename "../imgs/gui/basic-gui-flow.pgf" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status collapsed + +\begin_layout Plain Layout +你可能会问,在类RMB2DollarConverter中的几个私有属性(对象):mainPanel、rmbTextField等是什么时候初始化的?很好的问题! +\end_layout + +\begin_layout Plain Layout +实际上,Idea通过一个xml文件(RMB2DollarConvert.form)保存了界面中所包含的组件及其属性和相互关系,在编译的时候,Idea会自动读取这个 +界面配置文件并生成创建界面中的组件的构造方法,也就是说,mainPanel等对象其实是Idea帮我们创建了的,我们可以直接拿来就用。 +\end_layout + +\begin_layout Plain Layout +可以通过反编译class文件看到这一点,在构造方法中的setupUI方法创建了各个界面组件对象(部分删减,请自行运行jad RMB2DollarConverte +r获得完整的反编译后的文件): +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class RMB2DollarConverter +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public static void main(String args[]) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane((new RMB2DollarConverter()).mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(3); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public RMB2DollarConverter() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + setupUI(); +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb.doubleValue() / 7D)); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private void setupUI() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JPanel jpanel; +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel; +\end_layout + +\begin_layout Plain Layout + + jpanel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + + mainPanel = jpanel; +\end_layout + +\begin_layout Plain Layout + + jpanel.setLayout(new FlowLayout(1, 5, 5)); +\end_layout + +\begin_layout Plain Layout + + jlabel = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + jlabel.setText(" +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel); +\end_layout + +\begin_layout Plain Layout + + JTextField jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield = new JTextField(); +\end_layout + +\begin_layout Plain Layout + + rmbTextField = jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield.setMinimumSize(new Dimension(14, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setPreferredSize(new Dimension(60, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setText("#.##"); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setToolTipText(" +\backslash +u8BF7 +\backslash +u8F93 +\backslash +u5165 +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +u6570 +\backslash +u989D"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jtextfield); +\end_layout + +\begin_layout Plain Layout + + JButton jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton = new JButton(); +\end_layout + +\begin_layout Plain Layout + + convertButton = jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton.setText(" +\backslash +u8F6C +\backslash +u6362"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jbutton); +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1 = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + dollarLabel = jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1.setPreferredSize(new Dimension(100, 21)); +\end_layout + +\begin_layout Plain Layout + + jlabel1.setText(" +\backslash +u7F8E +\backslash +u5143 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel1); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private JPanel mainPanel; +\end_layout + +\begin_layout Plain Layout + + private JTextField rmbTextField; +\end_layout + +\begin_layout Plain Layout + + private JButton convertButton; +\end_layout + +\begin_layout Plain Layout + + private JLabel dollarLabel; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status collapsed + +\begin_layout Plain Layout +在Idea的Form Designer中,我们看到可以直接拖放各种控件到应用程序界面中,并且可以直观的通过“属性查看器”查看和修改控件的属性,其中一个重要的属性 +是field name属性,即属性的名称。什么时候需要给控件的field name属性赋值,什么时候不需要理会field name属性呢?简单的说,如果我们在程 +序中需要获得这个控件的其他属性,比如输入的文字,或者需要在程序运行期间通过程序改变这个控件的状态,则需要给这个控件的field name赋值。比如常见的JLab +el控件一般是不需要field name属性的,而JTextField则需要field name属性。 +\end_layout + +\begin_layout Plain Layout +进一步的观察我们可以发现,只有给控件一个field name属性值,Idea才能在绑定的类中自动创建私有的属性对象(变量)表示这个控件,变量的名字就是field + name属性的值。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +GUI的顶级容器类 +\begin_inset CommandInset label +LatexCommand label +name "sec:GUI的顶级容器类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面也是“面向对象”的,比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + +是常见的一个窗口应用程序,我们从Java的观点来看,可以分为如下的几部分: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-app-outline.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java图形用户界面应用程序的大致布局 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +整个应用程序框架使用JFrame +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFrame +\end_layout + +\end_inset + +来表示,在JFrame内部布置了菜单栏(JMenuBar)、工具栏(JToolBar)、内容区(ContentPane),我们最经常操作的区域是ContentP +ane,即几乎所有的界面设计工作集中在ContentPane上面。 +\end_layout + +\begin_layout Standard +所以,JFrame是一个顶层的容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +容器 +\end_layout + +\end_inset + +,其他所有的界面组件都放置在顶层容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +顶层容器 +\end_layout + +\end_inset + +之中,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +所示。除了JFrame之外,Java也提供了JDialog、JApplet +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JApplet +\end_layout + +\end_inset + +顶层容器,分别用于对话框的设计和Applet +\begin_inset Foot +status open + +\begin_layout Plain Layout +一种已经没落的技术。 +\end_layout + +\end_inset + +的设计。本章重点介绍基于JFrame的Java图形用户界面设计,JDialog +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDialog +\end_layout + +\end_inset + +的用法于此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jframe-overview.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java GUI应用程序的基本结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java-GUI应用程序的基本结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +不介绍分层的面板会有影响吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的代码展示了 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +中的组件间的关系: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +JFrame frame = new JFrame("标题栏内容"); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JLabel("a label", BorderLayout.TOP)); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JTextField("##.##", BorderLayout.BOTTOM)); +\end_layout + +\begin_layout Plain Layout + +JPanel panel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JLabel("another label")); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JCheckBox(...)); +\end_layout + +\begin_layout Plain Layout + +frame.add(panel, BorderLayout.CENTER); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing控件 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing控件" + +\end_inset + + +\end_layout + +\begin_layout Subsection +JLabel +\begin_inset CommandInset label +LatexCommand label +name "subsec:JLabel" + +\end_inset + + +\end_layout + +\begin_layout Standard +Label(文本标签)也许是最简单的Swing控件了,一般用来表示界面上的几个字符或者一段提示性文字、展示输出结果、图标等。 +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel的主要属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JLabel的主要属性" + +\end_inset + +所示(每个属性对应一对get/set方法),请参照Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +的属性对话框了解属性值的可能取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label所使用的图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的纵向对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的垂直位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +textGap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字和图片之间的间隙(像素值) +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的主要属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JLabel的主要属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JLabel示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/sr +c/cn/edu/sdut/softlab/,双击JLabelDemo.form即可打开Form Designer查看界面设计效果。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们在内容区增加了三个JLabel:最上面的Label同时包含了文字和图片,中间的Label只包含了文字,最下面的Label只包含了图片,其属性对话框的设置分别 +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:顶部Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:中间Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:下面Label属性框设置" + +\end_inset + +所示,其中修改过的属性已经黑体加重标注了,没有使用黑体标注的属性无需设置。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +当拖放第一个JLabel到内容区的时候,Form Designer自动在这个JLabel的下面增加了一个垂直占位符,以保证这个JLabel能够在希望的顶部展示。 +由于我们还要增加下面的两个Label,因此这里可以删除这个垂直占位符。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-1.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +顶部Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:顶部Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-2.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +中间Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:中间Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-3.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +下面Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:下面Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的属性对话框 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此示例,初始状态如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:运行的初始状态" + +\end_inset + +所示,可以尝试缩放窗口,比如水平放大窗口可以更明显的看出效果,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:水平方法后的窗口" + +\end_inset + +所示。请任意缩放窗口请注意观察这三个Label位置的变化,体会水平对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +水平对齐 +\end_layout + +\end_inset + +、垂直对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +垂直对齐 +\end_layout + +\end_inset + +等的效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-4.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行的初始状态 +\begin_inset CommandInset label +LatexCommand label +name "fig:运行的初始状态" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-5.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +水平放大后的窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:水平方法后的窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabelDemo运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +注意以下几点: +\end_layout + +\begin_layout Itemize +这三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel都无需设置field name属性值。 +\end_layout + +\begin_layout Itemize +特别注意观察Horizental Align属性的不同效果,可以尝试不同的水平对齐方式观察效果(通过Idea的Form Designer提供的预览工具更方便,在 +Form Designer界面直接右键选择“preview”即可)。 +\end_layout + +\begin_layout Itemize +在组合使用文本和图片时,还要注意horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +和verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +这两个属性的效果。 +\end_layout + +\begin_layout Subsection +文本控件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:JTextField" + +\end_inset + + +\end_layout + +\begin_layout Standard +Swing的文本控件是指能够输入文本的控件,比如文本框(JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +)、文本域(JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +)、富文本编辑器(JEdtiorPane +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JEdtiorPane +\end_layout + +\end_inset + +)等。Swing的文本控件类的关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本输入控件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/text-input-controls.eps + lyxscale 40 + scale 40 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本输入控件 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本输入控件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +单行纯文本控件:用于输入一行纯文本字符串。根据场合不同,可以选择使用JTextField,输入简单的单行字符串;或者JFormattedTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFormattedTextField +\end_layout + +\end_inset + +,输入格式化的单行字符串,比如表示日期的“2017-3-12”等;或者JPasswordField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JPasswordField +\end_layout + +\end_inset + +,输入密码(默认不显示输入的密码)。 +\end_layout + +\begin_layout Itemize +多行纯文本控件:用于输入多行纯文本字符串。如果需要输入的字符串比较长,可以采用JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +,会显示一个多行的文本编辑区域供输入。 +\end_layout + +\begin_layout Itemize +多行富文本控件:用于输入带格式的文本字符串,通常用于输入HTML等格式的字符串。 +\end_layout + +\begin_layout Standard +文本控件的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:文本控件的常见属性" + +\end_inset + +所示,请参照Form Designer中的属性对话框了解这些属性的取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的内容 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +editable +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否可编辑 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +columns +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的长度(多少个字符),仅仅作为计算默认显示宽度的依据 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +字符在文本框内的对齐方式,可以选择:JTextField.LEADING, JTextField.CENTER, JTextField.TRAILING +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:文本控件的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +文本控件示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个同时展示三种TextField的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +详情请参见:https://github.com/subaochen/java-tutorial-examples/blob/master/gui/src/cn/ +edu/sdut/softlab/TextControlDemo.form +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +.当在文本框中输入一些字符后(失去焦点后),在最下面的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Label +\end_layout + +\end_inset + +Label中显示输入的内容。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-1.png + width 95line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此应用程序的界面如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +这个简单的示例我们要注意以下三点: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +示例代码的布局要说明吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +可以通过 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Panel +\end_layout + +\end_inset + +Panel进一步组织控件,这是一种常见的手段。在例中,我们把三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +TextField +\end_layout + +\end_inset + +TextField控件放到一个Panel中,在把这Panel添加到mainPanel中。并且,放置三个TextField的Panel添加了标题(title):“ +单行纯文本控件”,以更清晰的表达这个Panel的意义,这也是一种常见的手段。 +\end_layout + +\begin_layout Itemize +请参照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "par:步骤12" + +\end_inset + +为三个TextField添加FocusListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +FocusListener +\end_layout + +\end_inset + +,这里我们重点监听了失去焦点的事件。 +\end_layout + +\begin_layout Itemize +本例也可以监听ActionListener(当在输入框按下回车键时触发该事件)获得当前输入框的内容,请读者自行完成相关代码并运行测试。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +焦点 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +焦点 +\end_layout + +\end_inset + +(Focus)通常是指文本输入框是否正在接受输入。获得焦点即文本输入框可以输入文字,失去焦点即文本输入框不再能够输入文字,即光标已经离开了此输入框。失去焦点往往 +意味着用户结束了输入,因此,我们可以通过监听失去焦点事件来获得文本输入框中的内容。 +\end_layout + +\begin_layout Plain Layout +如果焦点的概念用于窗口(应用程序),则获得焦点意味着当前窗口是活动窗口,即可操作的窗口;失去焦点意味着其他窗口获得了焦点,当前窗口不可操作。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +按钮(Button +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Button +\end_layout + +\end_inset + +)是一种常见的交互控件,在Swing中最常见的按钮通过JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +来描述。按钮用法很直接,通常涉及到以下三个方面: +\end_layout + +\begin_layout Itemize +给按钮一个合适的名称,包括显示在按钮上面的文字。 +\end_layout + +\begin_layout Itemize +有的时候希望在按钮上面也显示图标以更明确的表达按钮的意思,可以通过按钮的icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性来设置图标。 +\end_layout + +\begin_layout Itemize +给按钮添加鼠标点击的响应代码( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +ActionListener或者MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +JButton的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JButton的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否允许点击 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的图标 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的对齐方式 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JButton的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JButton的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JButton示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JButton示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含三个按钮的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例Panel" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例Panel +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例Panel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +依然参照 +\begin_inset CommandInset ref +LatexCommand formatted +reference "par:步骤12" + +\end_inset + +为这三个Button 添加三个ActionListener,分别响应鼠标左键单击事件。 +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时点击各个按钮,观察发生了什么?比如点击“紧急呼叫”按钮,弹出了一个消息框,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例运行结果" + +\end_inset + +所示。点击“被禁止的按钮”,会怎样? +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +请仔细查看三个按钮的属性对话框以了解这三个按钮是如何实现这样的效果的: +\end_layout + +\begin_layout Itemize +第一个按钮演示了按钮上是可以图文并茂的(设置icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性即可),并且通过设置horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Leading(在开头),将图片放到了文字的后面。 +\end_layout + +\begin_layout Itemize +第二个按钮演示了如何将按钮上的文字和图片上下布局:首先让按钮上的内容水平居中(horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Center),然后设置verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +属性为Bottom即可。 +\end_layout + +\begin_layout Itemize +第三个按钮设置enabled为false即可,即去掉默认选中的enabled选项。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +默认的,JButton的actionListener是响应鼠标左键单击事件的,比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +example +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JButton示例" + +\end_inset + +中,我们给按钮增加了响应鼠标左键单击的actionListener,那么如何响应鼠标右键、中键的单击事件呢?参见下面的代码: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// 响应右键单击事件 +\end_layout + +\begin_layout Plain Layout + +emegencyCallButton.addMouseListener(new MouseAdapter() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void mouseClicked(MouseEvent mouseEvent) { +\end_layout + +\begin_layout Plain Layout + + super.mouseClicked(mouseEvent); +\end_layout + +\begin_layout Plain Layout + + if(SwingUtilities.isRightMouseButton(mouseEvent) && mouseEvent.getClickCou +nt() == 1) { +\end_layout + +\begin_layout Plain Layout + + JOptionPane.showMessageDialog(null,"右键单击急呼叫按钮"); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +}); +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JCheckBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JCheckBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +JCheckBox通常叫做“复选框”,即可以同时打开或关闭多个选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +对比一下JRadioButton(单选框),JRadionButton只能在一组选项中选中一项。 +\end_layout + +\end_inset + +。当选项被选中时,该复选框的“选择”状态为true,否则为false。 +\end_layout + +\begin_layout Standard +JCheckBox的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JCheckBox的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否启用这个控件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +selected +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox默认的选中状态 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直位置 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JCheckBox的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JCheckBox示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JCheckBox示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含4个CheckBox(业余爱好)的Panel +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当鼠标点击某个爱好时显示选中的CheckBox的状态;当鼠标移动到某个爱好上面时,同步显示表示这个业余爱好的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时,注意观察鼠标在各个CheckBox上面和离开CheckBox时界面的不同反应,选中或者反选选项时不同的消息提示,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-2.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行初始状态 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-3.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +鼠标移动到“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-4.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选中“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +我们为每个JCheckBox添加了两个事件监听器,一个ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +用于监听鼠标左键单击选项选择或者反选时产生的事件,一个MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +用于监听当鼠标进入或者离开选项所在区域时产生的事件。 +\end_layout + +\begin_layout Paragraph +延伸阅读 +\end_layout + +\begin_layout Standard +其实,JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +, JCheckBox +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +, JRadionButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadionButton +\end_layout + +\end_inset + +等都从 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +AbstractButton +\end_layout + +\end_inset + +AbstractButton继承下来的,即JButton一族的类层次关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button类层次关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-overview.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button类层次关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button类层次关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +因此,JButtron、JCheckBox、JRadionButton等的共性就不难理解了。 +\end_layout + +\begin_layout Subsection +JRadioButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JRadioButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + +JRadioButton通常叫做“单选框”,即通过JRadionButton可以展示一组选项,但是只能有一个选项处于“选中”状态。当选择另外一个选项时,原先被选 +中的选项自动失效。 +\end_layout + +\begin_layout Standard +JRadionButton的常见属性和JCheckBox基本相同,只有一点需要注意:JRadioButton的buttonGroup属性是必须设置的,即每个JR +adioButton都需要设置buttonGroup属性,表明这个JRadioButton是属于哪个“组”的,以便Java根据用户的选择情况设置当前组的Radi +oButton哪个有效,哪个失效。 +\end_layout + +\begin_layout Example +JRadionButton示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +类似于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +,我们设计一个图形用户应用程序 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,根据选项决定显示哪种运动的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadioButton示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadioButton示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadioButton示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +点击不同的选项,将显示不同的运动图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadionButton示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadionButton示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadionButton示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例中,我们手工创建了ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +,通常JRadioButton的ActionListener需要手工创建更合适,因为JRadioButton一般需要设置为属于某个ButtonGroup,整个B +uttonGroup设计一个ActionListener就可以了,没有必要每个JRadioButton都独立设计一个ActionListener,如下列代码所示 +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RadioButtonDemo() { +\end_layout + +\begin_layout Plain Layout + + swimming.setActionCommand("swimming"); +\end_layout + +\begin_layout Plain Layout + + swimming.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + tennis.setActionCommand("tennis"); +\end_layout + +\begin_layout Plain Layout + + tennis.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + basketball.setActionCommand("basketball"); +\end_layout + +\begin_layout Plain Layout + + basketball.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + football.setActionCommand("football"); +\end_layout + +\begin_layout Plain Layout + + football.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + sportLabel.setIcon(new ImageIcon(RadioButtonDemo.class.getResource("/images +/" +\end_layout + +\begin_layout Plain Layout + + + actionEvent.getActionCommand() + ".png"))); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在以上代码中,我们在构造方法中为每个JRadioButton指定了actionCommand +\begin_inset Index idx +status open + +\begin_layout Plain Layout +actionCommand +\end_layout + +\end_inset + +以便在监听器代码中获取actionCommand拼装图片的路径。 +\end_layout + +\begin_layout Standard +另外需要注意的是,我们需要将这组JRadionButton设置一个共同的ButtonGroup,即在Form Designer中如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:设置ButtonGroup" + +\end_inset + +所示,创建一个新的ButtonGroup +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ButtonGroup +\end_layout + +\end_inset + +,并将所有JRadioButton的ButtonGroup属性都设置为这个新建的ButtonGroup。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +设置ButtonGroup +\begin_inset CommandInset label +LatexCommand label +name "fig:设置ButtonGroup" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JComboBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JComboBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JcomboBox +\end_layout + +\end_inset + +JcomboBox表示“下列选择框”,通常在空间比较紧张或者选项很多时采用下拉选择框比较合适。 +\end_layout + +\begin_layout Example +下拉选择框示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:下拉选择框示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +类似,我们设计一个下拉选择框来提供运动项目选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当选中某个运动项目时则显示相应的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到,下拉选择框sports需要设置在其中要显示的条目,可以通过属性对话框的model属性来设置,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox的model属性设置" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox的model属性设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox的model属性设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +该示例的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +其他常见控件 +\end_layout + +\begin_layout Subsubsection* +Spinner +\begin_inset CommandInset label +LatexCommand label +name "subsec:Spinner" + +\end_inset + + +\end_layout + +\begin_layout Standard +Spinner是一种便捷填写数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Slider +\begin_inset CommandInset label +LatexCommand label +name "subsec:Slider" + +\end_inset + + +\end_layout + +\begin_layout Standard +Slider是一种通过滑动选择数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Tabbed Pane +\begin_inset CommandInset label +LatexCommand label +name "subsec:Tabbed-Pane" + +\end_inset + + +\end_layout + +\begin_layout Standard +Tabbed Pane可以实现“标签页”,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Section +布局管理器 +\begin_inset CommandInset label +LatexCommand label +name "sec:布局管理器" + +\end_inset + + +\end_layout + +\begin_layout Standard +在图形用户界面应用程序的设计中,界面中的控件如何布局总是一个容易让人困扰的问题,有过WEB界面设计经历的读者可能对此有更深刻的体会。比如当窗口大小或者分辨率发生 +改变的时候,如何保证界面布局符合当初的设计(期望)呢?通常有两种常见的界面布局思路:绝对布局和相对布局。绝对布局是指使用绝对(像素)坐标确定控件在界面的位置,很 +显然,当窗口大小发生改变时,绝对布局的界面不会随窗口发生改变,于是导致了不能充分利用放大了的窗口或者无法适应缩小了的窗口,因此绝对布局在实际的编程中很少用到,也 +不建议使用绝对布局,本节主要阐述各种相对布局的基本思路和方法。 +\end_layout + +\begin_layout Subsection +BorderLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:BorderLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +BorderLayout很像“麻将桌”,将界面分为5个部分: +\end_layout + +\begin_layout Itemize +PAGE_START:界面的顶部 +\end_layout + +\begin_layout Itemize +PAGE_END:界面的底部 +\end_layout + +\begin_layout Itemize +LINE_START:界面的左边 +\end_layout + +\begin_layout Itemize +LINE_END:界面的右边 +\end_layout + +\begin_layout Itemize +CENTER:界面的中间 +\end_layout + +\begin_layout Standard +BorderLayout的特点是,当窗口缩放时,四周的控件只占用尽可能小的空间,中间的控件将随窗口占用尽可能多的空间。 +\end_layout + +\begin_layout Example +BorderLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例" + +\end_inset + +所示,5个按钮分别位于界面的4边和中间 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +。注意到我们将主Panel的Layout Manager修改为了BorderLayout,而不是默认的GridBagLayout。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-0.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" + +\end_inset + +所示的运行结果是放大窗口后的效果。建议读者在不同的窗口大小情况下观察BorderLayout的布局效果,以加深对BorderLayout的理解。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-1.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +这个示例很简单,我们只是修改了Panel的Layout Manager为BorderLayout,然后将5个按钮依次放到界面的合适位置即可。 +\end_layout + +\begin_layout Exercise +尝试将 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +中“Center”按钮所在的位置替换为另外一个“麻将桌”,即如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout练习1" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +示的效果。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/BorderLayout-exe1.1.png + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout练习1 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout练习1" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +FlowLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:FlowLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +流式布局(FlowLayout)是一种很自然的布局方式,即各个控件按照加入的顺序在窗口从左向右依次排开,各自只占用尽量小的空间。 +\end_layout + +\begin_layout Example +FlowLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例设计" + +\end_inset + +所示,设计一个包含若干按钮和RadioButton的应用程序 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,控件使用FlowLayout布局。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +默认的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例运行结果" + +\end_inset + +所示。请尝试改变窗口的大小观察FlowLayout的布局效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例重点有两个: +\end_layout + +\begin_layout Itemize +mainPanel采用了FlowLayout布局管理器。 +\end_layout + +\begin_layout Itemize +mainPanel的preferedSize修改为300x200,以便更好的展现FlowLayout的布局效果。 +\end_layout + +\begin_layout Subsection +CardLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:CardLayout" + +\end_inset + + +\end_layout + +\begin_layout Example +CardLayout示例 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例设计" + +\end_inset + +所示 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,主界面使用默认的GridLayout,界面的上半部分放置了一个下拉选择框,根据不同的选择展示不同的card。下半部分是一个Panel,此Panel(cardP +anel)使用CardLayout,在其中添加了两个card,分别是buttonPanel和textFieldPanel。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-1.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +根据选择的不同,可以看到显示了不同card的内容,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-2.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +默认运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-3.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Card with JTextField +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +增加代码的分析,因为CardLayout的代码不是特别直观 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +CardLayout的show方法可以有选择的显示指定的card,注意到show方法的第二个参数是指定的card的name(字符串),因此在Form + Designer中要设置每个card的name属性。为了和下拉选择框的设置一致,在本例中card的name属性设置为了下拉选择框的相应文字。 +\end_layout + +\begin_layout Standard +注意到mainPanel的布局管理器我们使用了Idea默认的GridBLayout,可以尝试换为BorderLayout或者FlowLayout看看效果如何? +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在本例中我们使用了一个常见的Java GUI界面设计技巧:通过Panel在局部组织控件,然后对Panel使用合适的布局管理器进行管理。也就是说,通常一个Java + GUI的界面设计是分为两个层面的:第一个层面,对整个界面进行合理的大体的界面划分(使用Panel);第二个层面,在每个Panel内部进行控件的合理布局。我们在 +Java GUI的综合应用举例中还会看到这种布局策略。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:GridLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +网格布局(GridLayout)是将整个界面划分为表格,表格的每个单元格可以放置一个控件(或者Panel),从而实现了规整的界面布局。影响GridLayout效 +果的除了表格单元格的个数之外,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridLayout的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的水平间隔的像素值,-1代表使用父容器的此设置,或者内置的10px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的垂直间隔的像素值,-1代表使用父容器的此设置,或者内置的5px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size horizentally +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在水平方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size vitically +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在垂直方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +margin +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +容器和控件之间的四周间隔大小 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +使用GridLayout设计一个3x2的表格,其中放置5个按钮 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例运行结果" + +\end_inset + +所示,GridLayout的用法简洁明了,请自行在Form Designer中修改相应的参数,比如virticalGap(水平间隔),horizentalGap +(垂直间隔)等观察这些参数对布局的影响。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +使用Idea设计GridLayout界面 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们使用了Idea提供的GridLayoutManager,详情请参考: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://www.formdev.com/jformdesigner/doc/layouts/intellijgridlayout/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +的小技巧:Idea的Form Designer通常能够智能的判断应该使用多少格子来放置控件,但是我们也必须给出明确的“指令”。比如我们希望设计如下的界面: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第一步,先添加三个JTextField,然后在第一个JTextField上面放置一个JLabel,如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第二步,需要首先将三个JTextField调整到一个水平面上,即如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-3.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第三步,添加另外的两个JLabel。 +\end_layout + +\begin_layout Plain Layout +如果没有在第二步首先将三个JTextField调整到一个水平面上,则继续添加JLabel时Form Designer可能会错误的领会我们的意思,从而错误的计算单 +元格的数量,读者可自行尝试和认真体会。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridBagLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:GridBagLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +网格袋布局(GridBagLayout)显然是GridLayout的扩展:GridLayout只允许控件放置在一个单元格中,而GridBagLayout允许一个 +控件占用多个单元格,因而GridBaglayout更加灵活,控制选项(属性)也比较多,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout的常见属性" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本书以JetBrain Idea提供的Form Designer为蓝本说明GridBagLayout的常见属性,和标准的Java Swing的GridBagLa +yout的属性略有出入。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格的起始x坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格中的起始y坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid width +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件横向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid height +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件纵向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的对齐方式,Fill意味着充满可能的横向空间(受weight x设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Fill +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的对齐方式,Fill意味着充满可能的纵向空间(受weight y设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Center +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向扩展的权重。如果值为0则横向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向扩展的权重。如果值为0则纵向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +insets +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件的外边距 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea的Form Designer中,grid x/grid y/grid width/grid height属性是通过拖放控件自动设置的,无需手工设置。实 +际上,Form Designer的属性对话框没有提供编辑这4个属性的功能。 +\end_layout + +\begin_layout Plain Layout +如果熟悉CSS的盒子模型的话,insets相当于CSS盒子模型的margin,ipadx/ipady相当于CSS盒子模型的padding。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridBagLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例设计" + +\end_inset + +所示,我们设计一个包含几个按钮的界面,使用GridBagLayout布局管理器。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-2.png + scale 70 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +本例中各控件的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonB +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Another Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 2,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +A Long Name Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 1 +\end_layout + +\begin_layout Plain Layout +grid width = 3, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonC +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonD +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 3 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 2, grid height = 2 +\end_layout + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例应用中的控件属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +请读者尝试 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件属性的各种组合方式" + +\end_inset + +的控件属性组合方式,观察GridBagLayout在界面布局中的灵活性。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +测试场景 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置ButtonA的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件属性的各种组合方式 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件属性的各种组合方式" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +JAVA图形用户界面的事件机制 +\begin_inset CommandInset label +LatexCommand label +name "sec:JAVA图形用户界面的事件机制" + +\end_inset + + +\end_layout + +\begin_layout Subsection +事件机制的基本原理 +\begin_inset CommandInset label +LatexCommand label +name "subsec:事件机制的基本原理" + +\end_inset + + +\end_layout + +\begin_layout Standard +事件机制是指代码如何对界面的点击、输入等事件做出响应,我们在前面的例子中已经多次使用了Swing的事件机制。Swing事件机制的三个要点是: +\end_layout + +\begin_layout Itemize +事件源(Event Source):即触发事件的控件,比如按钮、文本框等。 +\end_layout + +\begin_layout Itemize +事件对象(Event Object):描述事件的封装对象,其中包括了事件源、事件发生事件、事件相关参数(比如鼠标事件包括鼠标点击的坐标、鼠标点击次数等)等。 +\end_layout + +\begin_layout Itemize +监听器(Listener):当事件发生时Java会自动调用的方法被称为监听器。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Swing事件机制" + +\end_inset + +说明了按钮事件的处理过程 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里对“注册”的原理没有展开说明,需要说明Event Loop的过程吗?需要说明注册和Java虚拟机的关系吗? +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +是否可以在这里增加一个设计模式的示例?比如设计一个Container模拟OS,设计一个Listener模拟按钮、checkbox等 +\end_layout + +\end_inset + +,其他类型的事件处理过程与此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-event-model.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Swing事件机制(以按钮为例) +\begin_inset CommandInset label +LatexCommand label +name "fig:Swing事件机制" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +控件的常见监听器 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的Java GUI控件和事件监听器的对照表参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件的常见监听器" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +常用监听器 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应鼠标左键单击和回车事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应除左键单击外的其他的各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应在输入框回车事件 +\end_layout + +\begin_layout Plain Layout +FocusListener:响应获得和失去焦点事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JComboBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件的常见监听器 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件的常见监听器" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +监听器类的几种情形 +\begin_inset CommandInset label +LatexCommand label +name "subsec:监听器类的几种情形" + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到注册监听器的方法:src.addXxxListener(listenerObject)的参数是一个实现了监听器接口的对象,即通过这个方法告诉Java虚拟机, +当src(事件源)对象产生了一个Xxx类型的事件时,需要调用listenerObject中的相关方法进行事件处理。在实现监听器时,通常有如下的几种策略,以按钮的 +单击事件actionEvent为例: +\end_layout + +\begin_layout Itemize +主类直接实现XxxListener接口或者扩展XxxHandler类,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(this); // 注册事件监听器。由于FrameDemo本身实现ActionListener接 +口,因此这里直接使用this作为实现了事件监听器接口的对象。 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用匿名内部类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ActionListener() { // 匿名内部类实现ActionListener接 +口 +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用独立的类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ButtonListener()); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +// 独立的事件监听器类,实现了ActionListener接口 +\end_layout + +\begin_layout Plain Layout + +class ButtonListener implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在大多数情况下,我们建议使用匿名内部类实现监听器接口,代码更简洁,封装性更好。 +\end_layout + +\begin_layout Section +Java GUI综合应用举例 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java-GUI综合应用举例" + +\end_inset + + +\end_layout + +\begin_layout Example +计算器 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +这是一个典型的可以使用GridBagLayout进行界面设计的应用场合,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的界面设计" + +\end_inset + +所示。为了更好的适应窗口大小,界面中的所有控件设置了如下属性: +\end_layout + +\begin_layout Itemize +horizental align:Fill +\end_layout + +\begin_layout Itemize +virtical align: Fill +\end_layout + +\begin_layout Itemize +weight x : 1.0 +\end_layout + +\begin_layout Itemize +weight y : 1.0 +\end_layout + +\begin_layout Standard +完整的代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Caculator.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/gui/src/cn/edu/sdut/softlab/Caculator.java" +lstparams "caption={Caculator.java},label={Caculator.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的界面设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的界面设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-2.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例为了简化起见,表达式的求值借用了JDK内置的JavaScript引擎,有兴趣的读者可以自行实现一个表达式求值的引擎或者方法。 +\end_layout + +\begin_layout Exercise +请尝试使用GridLayout重新设计计算器(提示:首先使用GridLayout将界面分为上下两部分,上部分是一个Panel显示计算结果,使用任意的Layout +即可;下部分是一个显示计算按钮的Panel,使用GridLayout布局)。 +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture14.lyx b/guide/lecture_guide/lecture14.lyx new file mode 100644 index 0000000..56afde2 --- /dev/null +++ b/guide/lecture_guide/lecture14.lyx @@ -0,0 +1,9802 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十四次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:JAVA图形用户界面的事件机制" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:JAVA图形用户界面的事件机制" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:事件机制的基本原理" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:事件机制的基本原理" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:监听器类的几种情形" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "subsec:监听器类的几种情形" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java-GUI综合应用举例" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java-GUI综合应用举例" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java事件处理机制的基本原理; +\end_layout + +\begin_layout Enumerate +常见的Java监听类; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java事件处理机制背后隐含的设计模式:监听器模式; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +深刻理解Java的事件处理机制背后的原理; +\end_layout + +\begin_layout Enumerate +熟练掌握常见的事件监听类; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java的事件处理过程是否需要和JVM打交道?为什么? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +图形用户界面设计 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/gui/gui.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Section +Java的图形用户界面(GUI)设计概述 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的图形用户界面(GUI)设计概述" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +GUI +\end_layout + +\end_inset + +GUI)是由 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFC +\end_layout + +\end_inset + +JFC(Java Foundation Classes)支撑的,JFC包括了以下几个方面: +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing GUI组件:包含了图形用户界面设计中的人机交互组件,从最简单的按钮到复杂的图表等无所不包,这是我们学习的重点内容。 +\end_layout + +\begin_layout Itemize +可插拔的Look-and-Feel支持:Java图形用户界面支持可配置的Look-and-Feel切换,可以很容易的实现不同操作系统下的界面统一。 +\end_layout + +\begin_layout Itemize +辅助API:支持读屏幕等操作。 +\end_layout + +\begin_layout Itemize +Java 2D API:完善的2D绘图API。 +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +国际化 +\end_layout + +\end_inset + +国际化支持:秉承Java一贯的国际化支持,能够方便的在GUI中处理各种编码的文字。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +Swing是在早期的Java GUI应用程序设计接口AWT的基础上发展起来的,目前是Java GUI应用程序设计的官方标准。除了Swing之外,Eclipse( +www.eclipse.org)组织也发布了一套Java图形用户界面的设计库SWT(Standard Widget Toolkit),主要配合Eclipse的RCP +(Rich Client Program)应用程序开发,详情可参考:https://www.eclipse.org/swt/ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing入门 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing入门" + +\end_inset + + +\end_layout + +\begin_layout Standard +本节以JetBrain Idea为例说明如何创建和运行简单的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Swing +\end_layout + +\end_inset + +Swing应用程序。 +\end_layout + +\begin_layout Example +使用Idea创建一个简单的Swing应用程序,将人民币转换为美元。 +\end_layout + +\begin_layout Paragraph* +步骤1 +\end_layout + +\begin_layout Standard +创建一个新的Java项目,见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:新建一个Java项目" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +新建一个Java项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:新建一个Java项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤2 +\end_layout + +\begin_layout Standard +在接下来的项目配置窗口中,可以不选择从模板创建项目,因为我们要创建一个GUI应用程序,命令行应用的模板没有实质用处,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-2.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +跳过从模板创建项目 +\begin_inset CommandInset label +LatexCommand label +name "fig:跳过从模板创建项目" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤3 +\end_layout + +\begin_layout Standard +给项目起个名字,这里叫做“gui”,并选择项目所在的目录,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给项目起个名字" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/getting-started-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给项目起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给项目起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤4 +\end_layout + +\begin_layout Standard +在项目的“project视图”中,右键点击src,在弹出的菜单中选择New->GUI Form,新建一个Form表单 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form表单 +\end_layout + +\end_inset + +,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备新建一个Form表单" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-1.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备新建一个Form表单 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备新建一个Form表单" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +如果在菜单中没有出现GUI Form子菜单,系没有安装Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +插件所致,请在系统设置中激活Form Designer即可,方法是在File->Settings...菜单中搜索“UI Designer”插件并安装激活,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:安装并激活UI-Designer插件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/active-ui-designer.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +安装并激活UI Designer插件 +\begin_inset CommandInset label +LatexCommand label +name "fig:安装并激活UI-Designer插件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +图片和文字可能不在一个页面,应该想办法处理一下 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤5 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:给Form起个名字" + +\end_inset + +所示,给将要创建的Form起个名字,这里叫做“RMB2DollarConverter”,选择布局管理器(此处先认可默认设置,随后可以更改)。注意要勾选(默认已经 +勾选了) +\begin_inset Quotes erd +\end_inset + +create bound class +\begin_inset Quotes erd +\end_inset + +选项,即同时创建和这个Form绑定在一起的Java类。这个Java类我们将来用于显示和操作这个Form。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给Form起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给Form起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤6 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:空白的Form设计窗口" + +\end_inset + +所示,在新建Form后会呈现一个空白的Form设计窗口,其主要组成部分为: +\end_layout + +\begin_layout Itemize +界面组件关系图:在这个窗口中展示了组件的“父子”关系,目前只有一个JPanel组件,随后我们会加入更多组件,可以通过这个窗口直观的查看组件之间的关系。也可以通过 +这个窗口快捷的选择某个组件进行操作。 +\end_layout + +\begin_layout Itemize +组件属性窗:当在主设计界面或者界面组件关系窗口中选择了某个组件时,组件属性窗的内容将随之改变。可以通过这个窗口方便的了解界面组件拥有哪些属性,当然,更重要的是, +可以设置界面组件的属性值。 +\end_layout + +\begin_layout Itemize +主设计界面:可以拖放“组件面板”中的组件导主设计界面,主设计界面会根据使用的布局管理器的不同,自动摆放组件。 +\end_layout + +\begin_layout Itemize +组件面板:列出了各种Swing界面组件,可以方便的拖放到主设计界面。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-3.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +空白的Form设计窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:空白的Form设计窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤7 +\end_layout + +\begin_layout Standard +首先在“界面组件关系窗口”中选择目前唯一的组件Panel,然后在组件属性窗口中编辑“field name”属性,设置其值为“mainPanel +\begin_inset Quotes erd +\end_inset + +。这里的值是什么并不重要的,重要的是必须给主Panel设置一个名字,否则将来无法显示这个Panel。 +\end_layout + +\begin_layout Standard +在这里,我们也将mainPanel的 +\begin_inset Quotes erd +\end_inset + +Layout Manager +\begin_inset Quotes erd +\end_inset + +(布局管理器)修改为更为简单的 +\begin_inset Quotes erd +\end_inset + +FlowLayout +\begin_inset Quotes erd +\end_inset + +,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:布局管理器" + +\end_inset + +一节详细的阐述各种布局管理器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +布局管理器 +\end_layout + +\end_inset + +的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-4.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +给主Panel起个名字 +\begin_inset CommandInset label +LatexCommand label +name "fig:给主Panel起个名字" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤8 +\end_layout + +\begin_layout Standard +在“组件面板”窗口选择JLabel组件拖放到主设计界面,可以看到在“界面组件关系”窗口中,JLabel包含在mainPanel中。这里只是简单的设置这个JLab +el的text属性为“人民币:”即可。JLabel的目的是显示一个标签 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +标签 +\end_layout + +\end_inset + +,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:JLabel" + +\end_inset + +一节详细讨论Jlabel的用法。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-5.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加一个简单的Label +\begin_inset CommandInset label +LatexCommand label +name "fig:添加一个简单的Label" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤9 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加JTextField组件" + +\end_inset + +所示,接着添加一个JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +组件到主设计界面。这个JTextField我们用来输入人民币数额,因此要设置其 +\begin_inset Quotes erd +\end_inset + +field name +\begin_inset Quotes erd +\end_inset + +属性。为了更好的显示这个输入框,也设置了这个JTextField的默认宽度(preferedSize->width)和默认显示的文字(text属性)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-6.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加JTextField组件 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加JTextField组件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤10 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加转换按钮" + +\end_inset + +所示,再增加一个“转换”按钮 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +按钮 +\end_layout + +\end_inset + +,设置这个按钮的field name和text属性。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-7.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加转换按钮 +\begin_inset CommandInset label +LatexCommand label +name "fig:添加转换按钮" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤11 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:添加显示转换结果的JLabel" + +\end_inset + +所示,在界面中再添加一个用于显示转换结果的JLabel。由于我们要通过程序设置这个JLabel的text属性,因此要设置这个JLabel的field + name属性。为了能够更好的显示转换后的结果,也有设置这个JLabel的宽度,这里设置为100(像素值)。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-8.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +添加显示转换结果的JLabel +\begin_inset CommandInset label +LatexCommand label +name "fig:添加显示转换结果的JLabel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤12 +\begin_inset CommandInset label +LatexCommand label +name "par:步骤12" + +\end_inset + + +\end_layout + +\begin_layout Standard +界面的设计工作基本就绪,下面我们为按钮设计处理代码。如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备创建Listener" + +\end_inset + +所示,在主设计界面的“转换”按钮上点击右键,在弹出的菜单中选择“create Listener”,准备创建一段点击此按钮的响应代码。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-9.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备创建Listener +\begin_inset CommandInset label +LatexCommand label +name "fig:准备创建Listener" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤13 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择Listener的类型" + +\end_inset + +所示,在接下来的窗口中选择Listener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Listener +\end_layout + +\end_inset + +的类型为“ActionListener”。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-10.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Listener的类型 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择Listener的类型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +步骤14 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +所示,在接下来的窗口中,选择ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +需要覆盖的方法。这里只有一个选项,已经自动选中了。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-11.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择需要覆盖的方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:选择需要覆盖的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +点击 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:选择需要覆盖的方法" + +\end_inset + +中的“OK”按钮后,在所绑定的方法中自动添加了一个构造方法 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +构造方法 +\end_layout + +\end_inset + +,内容如下(行5-7是自己编写的): +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RMB2DollarConverter() { +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + // 获取文本输入框的文字内容并转换为double +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb / 7.0)); // 假设当前人民币和美元汇率为7.0 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +这是GUI应用程序事件处理的基本方法,我们将在 +\begin_inset CommandInset ref +LatexCommand formatted +reference "sec:JAVA图形用户界面的事件机制" + +\end_inset + +一节中具体讨论。 +\end_layout + +\begin_layout Paragraph* +步骤15 +\end_layout + +\begin_layout Standard +最后一步,我们需要在类RMB2DollarConverter中增加一个main方法并初始化和显示应用程序窗口,JetBrain Idea提供了自动化的代码生成工 +具,只需要在代码的合适位置(希望插入main方法的位置)按下Alt+Insert +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Alt+Insert +\end_layout + +\end_inset + +组合键,在如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:准备插入main方法" + +\end_inset + +所示的窗口中选择 +\begin_inset Quotes erd +\end_inset + +Form main() +\begin_inset Quotes erd +\end_inset + +即可自动创建main方法如下: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public static void main(String[] args) { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane(new RMB2DollarConverter().mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/new-form-12.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +准备插入main方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:准备插入main方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +经过了以上的15个步骤,现在终于可以运行这个应用程序了 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本例的完整代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui +\end_layout + +\end_inset + +。和运行其他Java应用程序的方法一样,运行RMB2DollarConverter类结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand formatted +reference "fig:RMB2DollarConverter的运行结果" + +\end_inset + +所示。可以在输入框输入人民币数额,然后点击“转换”按钮获得相应的美元数。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/RMB2DollarConverter-output.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +RMB2DollarConverter的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:RMB2DollarConverter的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +虽然在上面我们使用了15个步骤创建了一个简单的GUI应用程序,其实关键的步骤是4个,如下图所示: +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset include +LatexCommand input +filename "../imgs/gui/basic-gui-flow.pgf" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status collapsed + +\begin_layout Plain Layout +你可能会问,在类RMB2DollarConverter中的几个私有属性(对象):mainPanel、rmbTextField等是什么时候初始化的?很好的问题! +\end_layout + +\begin_layout Plain Layout +实际上,Idea通过一个xml文件(RMB2DollarConvert.form)保存了界面中所包含的组件及其属性和相互关系,在编译的时候,Idea会自动读取这个 +界面配置文件并生成创建界面中的组件的构造方法,也就是说,mainPanel等对象其实是Idea帮我们创建了的,我们可以直接拿来就用。 +\end_layout + +\begin_layout Plain Layout +可以通过反编译class文件看到这一点,在构造方法中的setupUI方法创建了各个界面组件对象(部分删减,请自行运行jad RMB2DollarConverte +r获得完整的反编译后的文件): +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class RMB2DollarConverter +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public static void main(String args[]) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JFrame frame = new JFrame("RMB2DollarConverter"); +\end_layout + +\begin_layout Plain Layout + + frame.setContentPane((new RMB2DollarConverter()).mainPanel); +\end_layout + +\begin_layout Plain Layout + + frame.setDefaultCloseOperation(3); +\end_layout + +\begin_layout Plain Layout + + frame.pack(); +\end_layout + +\begin_layout Plain Layout + + frame.setVisible(true); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public RMB2DollarConverter() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + setupUI(); +\end_layout + +\begin_layout Plain Layout + + convertButton.addActionListener(new ActionListener() { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + Double rmb = Double.valueOf(rmbTextField.getText()); +\end_layout + +\begin_layout Plain Layout + + dollarLabel.setText(String.valueOf(rmb.doubleValue() / 7D)); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private void setupUI() +\end_layout + +\begin_layout Plain Layout + + { +\end_layout + +\begin_layout Plain Layout + + JPanel jpanel; +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel; +\end_layout + +\begin_layout Plain Layout + + jpanel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + + mainPanel = jpanel; +\end_layout + +\begin_layout Plain Layout + + jpanel.setLayout(new FlowLayout(1, 5, 5)); +\end_layout + +\begin_layout Plain Layout + + jlabel = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + jlabel.setText(" +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel); +\end_layout + +\begin_layout Plain Layout + + JTextField jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield = new JTextField(); +\end_layout + +\begin_layout Plain Layout + + rmbTextField = jtextfield; +\end_layout + +\begin_layout Plain Layout + + jtextfield.setMinimumSize(new Dimension(14, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setPreferredSize(new Dimension(60, 29)); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setText("#.##"); +\end_layout + +\begin_layout Plain Layout + + jtextfield.setToolTipText(" +\backslash +u8BF7 +\backslash +u8F93 +\backslash +u5165 +\backslash +u4EBA +\backslash +u6C11 +\backslash +u5E01 +\backslash +u6570 +\backslash +u989D"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jtextfield); +\end_layout + +\begin_layout Plain Layout + + JButton jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton = new JButton(); +\end_layout + +\begin_layout Plain Layout + + convertButton = jbutton; +\end_layout + +\begin_layout Plain Layout + + jbutton.setText(" +\backslash +u8F6C +\backslash +u6362"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jbutton); +\end_layout + +\begin_layout Plain Layout + + JLabel jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1 = new JLabel(); +\end_layout + +\begin_layout Plain Layout + + dollarLabel = jlabel1; +\end_layout + +\begin_layout Plain Layout + + jlabel1.setPreferredSize(new Dimension(100, 21)); +\end_layout + +\begin_layout Plain Layout + + jlabel1.setText(" +\backslash +u7F8E +\backslash +u5143 +\backslash +uFF1A"); +\end_layout + +\begin_layout Plain Layout + + jpanel.add(jlabel1); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + private JPanel mainPanel; +\end_layout + +\begin_layout Plain Layout + + private JTextField rmbTextField; +\end_layout + +\begin_layout Plain Layout + + private JButton convertButton; +\end_layout + +\begin_layout Plain Layout + + private JLabel dollarLabel; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status collapsed + +\begin_layout Plain Layout +在Idea的Form Designer中,我们看到可以直接拖放各种控件到应用程序界面中,并且可以直观的通过“属性查看器”查看和修改控件的属性,其中一个重要的属性 +是field name属性,即属性的名称。什么时候需要给控件的field name属性赋值,什么时候不需要理会field name属性呢?简单的说,如果我们在程 +序中需要获得这个控件的其他属性,比如输入的文字,或者需要在程序运行期间通过程序改变这个控件的状态,则需要给这个控件的field name赋值。比如常见的JLab +el控件一般是不需要field name属性的,而JTextField则需要field name属性。 +\end_layout + +\begin_layout Plain Layout +进一步的观察我们可以发现,只有给控件一个field name属性值,Idea才能在绑定的类中自动创建私有的属性对象(变量)表示这个控件,变量的名字就是field + name属性的值。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +GUI的顶级容器类 +\begin_inset CommandInset label +LatexCommand label +name "sec:GUI的顶级容器类" + +\end_inset + + +\end_layout + +\begin_layout Standard +Java的图形用户界面也是“面向对象”的,比如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + +是常见的一个窗口应用程序,我们从Java的观点来看,可以分为如下的几部分: +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-app-outline.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java图形用户界面应用程序的大致布局 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java图形用户界面应用程序的大致布局" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +整个应用程序框架使用JFrame +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFrame +\end_layout + +\end_inset + +来表示,在JFrame内部布置了菜单栏(JMenuBar)、工具栏(JToolBar)、内容区(ContentPane),我们最经常操作的区域是ContentP +ane,即几乎所有的界面设计工作集中在ContentPane上面。 +\end_layout + +\begin_layout Standard +所以,JFrame是一个顶层的容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +容器 +\end_layout + +\end_inset + +,其他所有的界面组件都放置在顶层容器 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +顶层容器 +\end_layout + +\end_inset + +之中,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +所示。除了JFrame之外,Java也提供了JDialog、JApplet +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JApplet +\end_layout + +\end_inset + +顶层容器,分别用于对话框的设计和Applet +\begin_inset Foot +status open + +\begin_layout Plain Layout +一种已经没落的技术。 +\end_layout + +\end_inset + +的设计。本章重点介绍基于JFrame的Java图形用户界面设计,JDialog +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JDialog +\end_layout + +\end_inset + +的用法于此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jframe-overview.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java GUI应用程序的基本结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java-GUI应用程序的基本结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +不介绍分层的面板会有影响吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +下面的代码展示了 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-GUI应用程序的基本结构" + +\end_inset + +中的组件间的关系: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +JFrame frame = new JFrame("标题栏内容"); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JLabel("a label", BorderLayout.TOP)); +\end_layout + +\begin_layout Plain Layout + +frame.getContentPane().add(new JTextField("##.##", BorderLayout.BOTTOM)); +\end_layout + +\begin_layout Plain Layout + +JPanel panel = new JPanel(); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JLabel("another label")); +\end_layout + +\begin_layout Plain Layout + +panel.add(new JCheckBox(...)); +\end_layout + +\begin_layout Plain Layout + +frame.add(panel, BorderLayout.CENTER); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Swing控件 +\begin_inset CommandInset label +LatexCommand label +name "sec:Swing控件" + +\end_inset + + +\end_layout + +\begin_layout Subsection +JLabel +\begin_inset CommandInset label +LatexCommand label +name "subsec:JLabel" + +\end_inset + + +\end_layout + +\begin_layout Standard +Label(文本标签)也许是最简单的Swing控件了,一般用来表示界面上的几个字符或者一段提示性文字、展示输出结果、图标等。 +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel的主要属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JLabel的主要属性" + +\end_inset + +所示(每个属性对应一对get/set方法),请参照Form Designer +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Form Designer +\end_layout + +\end_inset + +的属性对话框了解属性值的可能取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label所使用的图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label的纵向对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字的垂直位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +textGap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Label文字和图片之间的间隙(像素值) +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的主要属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JLabel的主要属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JLabel示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/sr +c/cn/edu/sdut/softlab/,双击JLabelDemo.form即可打开Form Designer查看界面设计效果。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们在内容区增加了三个JLabel:最上面的Label同时包含了文字和图片,中间的Label只包含了文字,最下面的Label只包含了图片,其属性对话框的设置分别 +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:顶部Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:中间Label属性框设置" + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:下面Label属性框设置" + +\end_inset + +所示,其中修改过的属性已经黑体加重标注了,没有使用黑体标注的属性无需设置。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +当拖放第一个JLabel到内容区的时候,Form Designer自动在这个JLabel的下面增加了一个垂直占位符,以保证这个JLabel能够在希望的顶部展示。 +由于我们还要增加下面的两个Label,因此这里可以删除这个垂直占位符。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-1.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +顶部Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:顶部Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-2.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +中间Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:中间Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-3.png + width 30line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +下面Label属性框设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:下面Label属性框设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabel的属性对话框 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此示例,初始状态如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:运行的初始状态" + +\end_inset + +所示,可以尝试缩放窗口,比如水平放大窗口可以更明显的看出效果,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:水平方法后的窗口" + +\end_inset + +所示。请任意缩放窗口请注意观察这三个Label位置的变化,体会水平对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +水平对齐 +\end_layout + +\end_inset + +、垂直对齐 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +垂直对齐 +\end_layout + +\end_inset + +等的效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-4.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行的初始状态 +\begin_inset CommandInset label +LatexCommand label +name "fig:运行的初始状态" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jlabel-demo-5.png + height 30theight% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +水平放大后的窗口 +\begin_inset CommandInset label +LatexCommand label +name "fig:水平方法后的窗口" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JLabelDemo运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +注意以下几点: +\end_layout + +\begin_layout Itemize +这三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JLabel +\end_layout + +\end_inset + +JLabel都无需设置field name属性值。 +\end_layout + +\begin_layout Itemize +特别注意观察Horizental Align属性的不同效果,可以尝试不同的水平对齐方式观察效果(通过Idea的Form Designer提供的预览工具更方便,在 +Form Designer界面直接右键选择“preview”即可)。 +\end_layout + +\begin_layout Itemize +在组合使用文本和图片时,还要注意horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +和verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +这两个属性的效果。 +\end_layout + +\begin_layout Subsection +文本控件 +\begin_inset CommandInset label +LatexCommand label +name "subsec:JTextField" + +\end_inset + + +\end_layout + +\begin_layout Standard +Swing的文本控件是指能够输入文本的控件,比如文本框(JTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + +)、文本域(JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +)、富文本编辑器(JEdtiorPane +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JEdtiorPane +\end_layout + +\end_inset + +)等。Swing的文本控件类的关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本输入控件" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/text-input-controls.eps + lyxscale 40 + scale 40 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本输入控件 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本输入控件" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +单行纯文本控件:用于输入一行纯文本字符串。根据场合不同,可以选择使用JTextField,输入简单的单行字符串;或者JFormattedTextField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JFormattedTextField +\end_layout + +\end_inset + +,输入格式化的单行字符串,比如表示日期的“2017-3-12”等;或者JPasswordField +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JPasswordField +\end_layout + +\end_inset + +,输入密码(默认不显示输入的密码)。 +\end_layout + +\begin_layout Itemize +多行纯文本控件:用于输入多行纯文本字符串。如果需要输入的字符串比较长,可以采用JTextArea +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JTextArea +\end_layout + +\end_inset + +,会显示一个多行的文本编辑区域供输入。 +\end_layout + +\begin_layout Itemize +多行富文本控件:用于输入带格式的文本字符串,通常用于输入HTML等格式的字符串。 +\end_layout + +\begin_layout Standard +文本控件的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:文本控件的常见属性" + +\end_inset + +所示,请参照Form Designer中的属性对话框了解这些属性的取值范围。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的内容 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +editable +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否可编辑 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +columns +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文本框的长度(多少个字符),仅仅作为计算默认显示宽度的依据 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +字符在文本框内的对齐方式,可以选择:JTextField.LEADING, JTextField.CENTER, JTextField.TRAILING +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:文本控件的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +文本控件示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个同时展示三种TextField的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +详情请参见:https://github.com/subaochen/java-tutorial-examples/blob/master/gui/src/cn/ +edu/sdut/softlab/TextControlDemo.form +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +.当在文本框中输入一些字符后(失去焦点后),在最下面的 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Label +\end_layout + +\end_inset + +Label中显示输入的内容。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-1.png + width 95line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行此应用程序的界面如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:文本控件示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/textfield-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +文本控件示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:文本控件示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +这个简单的示例我们要注意以下三点: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +示例代码的布局要说明吗? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +可以通过 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Panel +\end_layout + +\end_inset + +Panel进一步组织控件,这是一种常见的手段。在例中,我们把三个 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +TextField +\end_layout + +\end_inset + +TextField控件放到一个Panel中,在把这Panel添加到mainPanel中。并且,放置三个TextField的Panel添加了标题(title):“ +单行纯文本控件”,以更清晰的表达这个Panel的意义,这也是一种常见的手段。 +\end_layout + +\begin_layout Itemize +请参照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "par:步骤12" + +\end_inset + +为三个TextField添加FocusListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +FocusListener +\end_layout + +\end_inset + +,这里我们重点监听了失去焦点的事件。 +\end_layout + +\begin_layout Itemize +本例也可以监听ActionListener(当在输入框按下回车键时触发该事件)获得当前输入框的内容,请读者自行完成相关代码并运行测试。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +焦点 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +焦点 +\end_layout + +\end_inset + +(Focus)通常是指文本输入框是否正在接受输入。获得焦点即文本输入框可以输入文字,失去焦点即文本输入框不再能够输入文字,即光标已经离开了此输入框。失去焦点往往 +意味着用户结束了输入,因此,我们可以通过监听失去焦点事件来获得文本输入框中的内容。 +\end_layout + +\begin_layout Plain Layout +如果焦点的概念用于窗口(应用程序),则获得焦点意味着当前窗口是活动窗口,即可操作的窗口;失去焦点意味着其他窗口获得了焦点,当前窗口不可操作。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +按钮(Button +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Button +\end_layout + +\end_inset + +)是一种常见的交互控件,在Swing中最常见的按钮通过JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +来描述。按钮用法很直接,通常涉及到以下三个方面: +\end_layout + +\begin_layout Itemize +给按钮一个合适的名称,包括显示在按钮上面的文字。 +\end_layout + +\begin_layout Itemize +有的时候希望在按钮上面也显示图标以更明确的表达按钮的意思,可以通过按钮的icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性来设置图标。 +\end_layout + +\begin_layout Itemize +给按钮添加鼠标点击的响应代码( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +ActionListener或者MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +)。 +\end_layout + +\begin_layout Standard +JButton的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JButton的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否允许点击 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的图标 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +在按钮上面要显示的文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的文字位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +水平方向的对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +垂直方向的对齐方式 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JButton的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JButton的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JButton示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JButton示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含三个按钮的Panel,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例Panel" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码请参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例Panel +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例Panel" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +依然参照 +\begin_inset CommandInset ref +LatexCommand formatted +reference "par:步骤12" + +\end_inset + +为这三个Button 添加三个ActionListener,分别响应鼠标左键单击事件。 +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时点击各个按钮,观察发生了什么?比如点击“紧急呼叫”按钮,弹出了一个消息框,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button示例运行结果" + +\end_inset + +所示。点击“被禁止的按钮”,会怎样? +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +请仔细查看三个按钮的属性对话框以了解这三个按钮是如何实现这样的效果的: +\end_layout + +\begin_layout Itemize +第一个按钮演示了按钮上是可以图文并茂的(设置icon +\begin_inset Index idx +status open + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + +属性即可),并且通过设置horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Leading(在开头),将图片放到了文字的后面。 +\end_layout + +\begin_layout Itemize +第二个按钮演示了如何将按钮上的文字和图片上下布局:首先让按钮上的内容水平居中(horizentalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + +属性为Center),然后设置verticalTextPosition +\begin_inset Index idx +status open + +\begin_layout Plain Layout +verticalTextPosition +\end_layout + +\end_inset + +属性为Bottom即可。 +\end_layout + +\begin_layout Itemize +第三个按钮设置enabled为false即可,即去掉默认选中的enabled选项。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +默认的,JButton的actionListener是响应鼠标左键单击事件的,比如在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +example +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JButton示例" + +\end_inset + +中,我们给按钮增加了响应鼠标左键单击的actionListener,那么如何响应鼠标右键、中键的单击事件呢?参见下面的代码: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +// 响应右键单击事件 +\end_layout + +\begin_layout Plain Layout + +emegencyCallButton.addMouseListener(new MouseAdapter() { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void mouseClicked(MouseEvent mouseEvent) { +\end_layout + +\begin_layout Plain Layout + + super.mouseClicked(mouseEvent); +\end_layout + +\begin_layout Plain Layout + + if(SwingUtilities.isRightMouseButton(mouseEvent) && mouseEvent.getClickCou +nt() == 1) { +\end_layout + +\begin_layout Plain Layout + + JOptionPane.showMessageDialog(null,"右键单击急呼叫按钮"); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +}); +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JCheckBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JCheckBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +JCheckBox通常叫做“复选框”,即可以同时打开或关闭多个选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +对比一下JRadioButton(单选框),JRadionButton只能在一组选项中选中一项。 +\end_layout + +\end_inset + +。当选项被选中时,该复选框的“选择”状态为true,否则为false。 +\end_layout + +\begin_layout Standard +JCheckBox的常见属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:JCheckBox的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示文字 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +icon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox的提示图片 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +enabled +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +是否启用这个控件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +selected +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CheckBox默认的选中状态 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizentalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的水平位置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +verticalAlignment +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直对齐方式 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virticalTextPosition +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +文字的垂直位置 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:JCheckBox的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +JCheckBox示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:JCheckBox示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +我们设计一个包含4个CheckBox(业余爱好)的Panel +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当鼠标点击某个爱好时显示选中的CheckBox的状态;当鼠标移动到某个爱好上面时,同步显示表示这个业余爱好的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +在运行时,注意观察鼠标在各个CheckBox上面和离开CheckBox时界面的不同反应,选中或者反选选项时不同的消息提示,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JCheckBox运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-2.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +运行初始状态 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-3.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +鼠标移动到“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/checkbox-demo-4.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选中“足球”选项 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JCheckBox运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JCheckBox运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +我们为每个JCheckBox添加了两个事件监听器,一个ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +用于监听鼠标左键单击选项选择或者反选时产生的事件,一个MouseListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +MouseListener +\end_layout + +\end_inset + +用于监听当鼠标进入或者离开选项所在区域时产生的事件。 +\end_layout + +\begin_layout Paragraph +延伸阅读 +\end_layout + +\begin_layout Standard +其实,JButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + +, JCheckBox +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + +, JRadionButton +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadionButton +\end_layout + +\end_inset + +等都从 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +AbstractButton +\end_layout + +\end_inset + +AbstractButton继承下来的,即JButton一族的类层次关系如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Button类层次关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/button-overview.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Button类层次关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Button类层次关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +因此,JButtron、JCheckBox、JRadionButton等的共性就不难理解了。 +\end_layout + +\begin_layout Subsection +JRadioButton +\begin_inset CommandInset label +LatexCommand label +name "subsec:JRadioButton" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + +JRadioButton通常叫做“单选框”,即通过JRadionButton可以展示一组选项,但是只能有一个选项处于“选中”状态。当选择另外一个选项时,原先被选 +中的选项自动失效。 +\end_layout + +\begin_layout Standard +JRadionButton的常见属性和JCheckBox基本相同,只有一点需要注意:JRadioButton的buttonGroup属性是必须设置的,即每个JR +adioButton都需要设置buttonGroup属性,表明这个JRadioButton是属于哪个“组”的,以便Java根据用户的选择情况设置当前组的Radi +oButton哪个有效,哪个失效。 +\end_layout + +\begin_layout Example +JRadionButton示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +类似于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +,我们设计一个图形用户应用程序 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,根据选项决定显示哪种运动的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadioButton示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadioButton示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadioButton示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +点击不同的选项,将显示不同的运动图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JRadionButton示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-2.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JRadionButton示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JRadionButton示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例中,我们手工创建了ActionListener +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ActionListener +\end_layout + +\end_inset + +,通常JRadioButton的ActionListener需要手工创建更合适,因为JRadioButton一般需要设置为属于某个ButtonGroup,整个B +uttonGroup设计一个ActionListener就可以了,没有必要每个JRadioButton都独立设计一个ActionListener,如下列代码所示 +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + + public RadioButtonDemo() { +\end_layout + +\begin_layout Plain Layout + + swimming.setActionCommand("swimming"); +\end_layout + +\begin_layout Plain Layout + + swimming.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + tennis.setActionCommand("tennis"); +\end_layout + +\begin_layout Plain Layout + + tennis.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + basketball.setActionCommand("basketball"); +\end_layout + +\begin_layout Plain Layout + + basketball.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + football.setActionCommand("football"); +\end_layout + +\begin_layout Plain Layout + + football.addActionListener(this); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent actionEvent) { +\end_layout + +\begin_layout Plain Layout + + sportLabel.setIcon(new ImageIcon(RadioButtonDemo.class.getResource("/images +/" +\end_layout + +\begin_layout Plain Layout + + + actionEvent.getActionCommand() + ".png"))); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在以上代码中,我们在构造方法中为每个JRadioButton指定了actionCommand +\begin_inset Index idx +status open + +\begin_layout Plain Layout +actionCommand +\end_layout + +\end_inset + +以便在监听器代码中获取actionCommand拼装图片的路径。 +\end_layout + +\begin_layout Standard +另外需要注意的是,我们需要将这组JRadionButton设置一个共同的ButtonGroup,即在Form Designer中如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:设置ButtonGroup" + +\end_inset + +所示,创建一个新的ButtonGroup +\begin_inset Index idx +status open + +\begin_layout Plain Layout +ButtonGroup +\end_layout + +\end_inset + +,并将所有JRadioButton的ButtonGroup属性都设置为这个新建的ButtonGroup。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jradiobutton-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +设置ButtonGroup +\begin_inset CommandInset label +LatexCommand label +name "fig:设置ButtonGroup" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +JComboBox +\begin_inset CommandInset label +LatexCommand label +name "subsec:JComboBox" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status open + +\begin_layout Plain Layout +JcomboBox +\end_layout + +\end_inset + +JcomboBox表示“下列选择框”,通常在空间比较紧张或者选项很多时采用下拉选择框比较合适。 +\end_layout + +\begin_layout Example +下拉选择框示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:下拉选择框示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:JCheckBox示例" + +\end_inset + +类似,我们设计一个下拉选择框来提供运动项目选项 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +,当选中某个运动项目时则显示相应的图片,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到,下拉选择框sports需要设置在其中要显示的条目,可以通过属性对话框的model属性来设置,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox的model属性设置" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox的model属性设置 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox的model属性设置" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +该示例的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:JComboBox示例的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/jcombobox-demo-3.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +JComboBox示例的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:JComboBox示例的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +其他常见控件 +\end_layout + +\begin_layout Subsubsection* +Spinner +\begin_inset CommandInset label +LatexCommand label +name "subsec:Spinner" + +\end_inset + + +\end_layout + +\begin_layout Standard +Spinner是一种便捷填写数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Slider +\begin_inset CommandInset label +LatexCommand label +name "subsec:Slider" + +\end_inset + + +\end_layout + +\begin_layout Standard +Slider是一种通过滑动选择数字的控件,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Subsubsection* +Tabbed Pane +\begin_inset CommandInset label +LatexCommand label +name "subsec:Tabbed-Pane" + +\end_inset + + +\end_layout + +\begin_layout Standard +Tabbed Pane可以实现“标签页”,详情请参见示例代码: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/cn/edu/ +sdut/softlab +\end_layout + +\end_inset + +及其注释。 +\end_layout + +\begin_layout Section +布局管理器 +\begin_inset CommandInset label +LatexCommand label +name "sec:布局管理器" + +\end_inset + + +\end_layout + +\begin_layout Standard +在图形用户界面应用程序的设计中,界面中的控件如何布局总是一个容易让人困扰的问题,有过WEB界面设计经历的读者可能对此有更深刻的体会。比如当窗口大小或者分辨率发生 +改变的时候,如何保证界面布局符合当初的设计(期望)呢?通常有两种常见的界面布局思路:绝对布局和相对布局。绝对布局是指使用绝对(像素)坐标确定控件在界面的位置,很 +显然,当窗口大小发生改变时,绝对布局的界面不会随窗口发生改变,于是导致了不能充分利用放大了的窗口或者无法适应缩小了的窗口,因此绝对布局在实际的编程中很少用到,也 +不建议使用绝对布局,本节主要阐述各种相对布局的基本思路和方法。 +\end_layout + +\begin_layout Subsection +BorderLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:BorderLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +BorderLayout很像“麻将桌”,将界面分为5个部分: +\end_layout + +\begin_layout Itemize +PAGE_START:界面的顶部 +\end_layout + +\begin_layout Itemize +PAGE_END:界面的底部 +\end_layout + +\begin_layout Itemize +LINE_START:界面的左边 +\end_layout + +\begin_layout Itemize +LINE_END:界面的右边 +\end_layout + +\begin_layout Itemize +CENTER:界面的中间 +\end_layout + +\begin_layout Standard +BorderLayout的特点是,当窗口缩放时,四周的控件只占用尽可能小的空间,中间的控件将随窗口占用尽可能多的空间。 +\end_layout + +\begin_layout Example +BorderLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例" + +\end_inset + +所示,5个按钮分别位于界面的4边和中间 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +。注意到我们将主Panel的Layout Manager修改为了BorderLayout,而不是默认的GridBagLayout。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-0.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" + +\end_inset + +所示的运行结果是放大窗口后的效果。建议读者在不同的窗口大小情况下观察BorderLayout的布局效果,以加深对BorderLayout的理解。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/borderlayout-demo-1.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +这个示例很简单,我们只是修改了Panel的Layout Manager为BorderLayout,然后将5个按钮依次放到界面的合适位置即可。 +\end_layout + +\begin_layout Exercise +尝试将 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout示例运行结果" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +中“Center”按钮所在的位置替换为另外一个“麻将桌”,即如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:BorderLayout练习1" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +示的效果。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/BorderLayout-exe1.1.png + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +BorderLayout练习1 +\begin_inset CommandInset label +LatexCommand label +name "fig:BorderLayout练习1" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +FlowLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:FlowLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +流式布局(FlowLayout)是一种很自然的布局方式,即各个控件按照加入的顺序在窗口从左向右依次排开,各自只占用尽量小的空间。 +\end_layout + +\begin_layout Example +FlowLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例设计" + +\end_inset + +所示,设计一个包含若干按钮和RadioButton的应用程序 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,控件使用FlowLayout布局。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-1.png + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +默认的运行结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:FlowLayout示例运行结果" + +\end_inset + +所示。请尝试改变窗口的大小观察FlowLayout的布局效果。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/flowlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +FlowLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:FlowLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例重点有两个: +\end_layout + +\begin_layout Itemize +mainPanel采用了FlowLayout布局管理器。 +\end_layout + +\begin_layout Itemize +mainPanel的preferedSize修改为300x200,以便更好的展现FlowLayout的布局效果。 +\end_layout + +\begin_layout Subsection +CardLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:CardLayout" + +\end_inset + + +\end_layout + +\begin_layout Example +CardLayout示例 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例设计" + +\end_inset + +所示 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,主界面使用默认的GridLayout,界面的上半部分放置了一个下拉选择框,根据不同的选择展示不同的card。下半部分是一个Panel,此Panel(cardP +anel)使用CardLayout,在其中添加了两个card,分别是buttonPanel和textFieldPanel。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-1.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +根据选择的不同,可以看到显示了不同card的内容,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:CardLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-2.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +默认运行结果 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset space \hfill{} +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/gui/cardlayout-demo-3.png + width 45line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择Card with JTextField +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +CardLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:CardLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +增加代码的分析,因为CardLayout的代码不是特别直观 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +CardLayout的show方法可以有选择的显示指定的card,注意到show方法的第二个参数是指定的card的name(字符串),因此在Form + Designer中要设置每个card的name属性。为了和下拉选择框的设置一致,在本例中card的name属性设置为了下拉选择框的相应文字。 +\end_layout + +\begin_layout Standard +注意到mainPanel的布局管理器我们使用了Idea默认的GridBLayout,可以尝试换为BorderLayout或者FlowLayout看看效果如何? +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在本例中我们使用了一个常见的Java GUI界面设计技巧:通过Panel在局部组织控件,然后对Panel使用合适的布局管理器进行管理。也就是说,通常一个Java + GUI的界面设计是分为两个层面的:第一个层面,对整个界面进行合理的大体的界面划分(使用Panel);第二个层面,在每个Panel内部进行控件的合理布局。我们在 +Java GUI的综合应用举例中还会看到这种布局策略。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:GridLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +网格布局(GridLayout)是将整个界面划分为表格,表格的每个单元格可以放置一个控件(或者Panel),从而实现了规整的界面布局。影响GridLayout效 +果的除了表格单元格的个数之外,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridLayout的常见属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的水平间隔的像素值,-1代表使用父容器的此设置,或者内置的10px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical gap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +单元格的垂直间隔的像素值,-1代表使用父容器的此设置,或者内置的5px +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size horizentally +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在水平方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +same size vitically +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +如果是true的话,所有控件在垂直方向大小一致 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +false +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +margin +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +容器和控件之间的四周间隔大小 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +使用GridLayout设计一个3x2的表格,其中放置5个按钮 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +完整代码参见:https://github.com/subaochen/java-tutorial/tree/master/guide/code/gui/src/ +cn/edu/sdut/softlab +\end_layout + +\end_inset + +,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例设计" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridLayout示例运行结果" + +\end_inset + +所示,GridLayout的用法简洁明了,请自行在Form Designer中修改相应的参数,比如virticalGap(水平间隔),horizentalGap +(垂直间隔)等观察这些参数对布局的影响。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-demo-2.png + width 50line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +使用Idea设计GridLayout界面 +\begin_inset Foot +status open + +\begin_layout Plain Layout +我们使用了Idea提供的GridLayoutManager,详情请参考: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://www.formdev.com/jformdesigner/doc/layouts/intellijgridlayout/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +的小技巧:Idea的Form Designer通常能够智能的判断应该使用多少格子来放置控件,但是我们也必须给出明确的“指令”。比如我们希望设计如下的界面: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第一步,先添加三个JTextField,然后在第一个JTextField上面放置一个JLabel,如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-2.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第二步,需要首先将三个JTextField调整到一个水平面上,即如下图所示: +\end_layout + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridlayout-tip-3.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +第三步,添加另外的两个JLabel。 +\end_layout + +\begin_layout Plain Layout +如果没有在第二步首先将三个JTextField调整到一个水平面上,则继续添加JLabel时Form Designer可能会错误的领会我们的意思,从而错误的计算单 +元格的数量,读者可自行尝试和认真体会。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +GridBagLayout +\begin_inset CommandInset label +LatexCommand label +name "subsec:GridBagLayout" + +\end_inset + + +\end_layout + +\begin_layout Standard +网格袋布局(GridBagLayout)显然是GridLayout的扩展:GridLayout只允许控件放置在一个单元格中,而GridBagLayout允许一个 +控件占用多个单元格,因而GridBaglayout更加灵活,控制选项(属性)也比较多,常见的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout的常见属性" + +\end_inset + +所示 +\begin_inset Foot +status open + +\begin_layout Plain Layout +本书以JetBrain Idea提供的Form Designer为蓝本说明GridBagLayout的常见属性,和标准的Java Swing的GridBagLa +yout的属性略有出入。 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +属性 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +默认值 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格的起始x坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件所占单元格中的起始y坐标(左上角) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid width +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件横向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +grid height +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件纵向占用的单元格数 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +horizental align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的对齐方式,Fill意味着充满可能的横向空间(受weight x设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Fill +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +virtical align +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的对齐方式,Fill意味着充满可能的纵向空间(受weight y设置的影响) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Center +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向扩展的权重。如果值为0则横向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +weight y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向扩展的权重。如果值为0则纵向不扩展,即控件只占用可能小的空间;通常此值在0-1之间设置。 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0.0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +insets +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件的外边距 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0,0,0,0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +横向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ipad y +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +纵向的内边距素数,决定了控件距离单元格的边线有多远 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout的常见属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout的常见属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea的Form Designer中,grid x/grid y/grid width/grid height属性是通过拖放控件自动设置的,无需手工设置。实 +际上,Form Designer的属性对话框没有提供编辑这4个属性的功能。 +\end_layout + +\begin_layout Plain Layout +如果熟悉CSS的盒子模型的话,insets相当于CSS盒子模型的margin,ipadx/ipady相当于CSS盒子模型的padding。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +GridBagLayout示例 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例设计" + +\end_inset + +所示,我们设计一个包含几个按钮的界面,使用GridBagLayout布局管理器。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:GridBagLayout示例运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/gridbaglayout-demo-2.png + scale 70 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:GridBagLayout示例运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +本例中各控件的属性如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonB +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Another Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 2,grid y = 0 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +A Long Name Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 1 +\end_layout + +\begin_layout Plain Layout +grid width = 3, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonC +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonD +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 0,grid y = 3 +\end_layout + +\begin_layout Plain Layout +grid width = 1, grid height = 1 +\end_layout + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +grid x = 1,grid y = 2 +\end_layout + +\begin_layout Plain Layout +grid width = 2, grid height = 2 +\end_layout + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 0, weight y = 0 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +GridBagLayout示例应用中的控件属性 +\begin_inset CommandInset label +LatexCommand label +name "tab:GridBagLayout示例应用中的控件属性" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +请读者尝试 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件属性的各种组合方式" + +\end_inset + +的控件属性组合方式,观察GridBagLayout在界面布局中的灵活性。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +测试场景 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +属性设置 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置ButtonA的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ButtonA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Center, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 0 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Fill +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +只设置Last Button的属性,其他控件属性不变 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Last Button +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +h align = Fill, v align = Center +\end_layout + +\begin_layout Plain Layout +weight x = 1, weight y = 1 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件属性的各种组合方式 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件属性的各种组合方式" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +JAVA图形用户界面的事件机制 +\begin_inset CommandInset label +LatexCommand label +name "sec:JAVA图形用户界面的事件机制" + +\end_inset + + +\end_layout + +\begin_layout Subsection +事件机制的基本原理 +\begin_inset CommandInset label +LatexCommand label +name "subsec:事件机制的基本原理" + +\end_inset + + +\end_layout + +\begin_layout Standard +事件机制是指代码如何对界面的点击、输入等事件做出响应,我们在前面的例子中已经多次使用了Swing的事件机制。Swing事件机制的三个要点是: +\end_layout + +\begin_layout Itemize +事件源(Event Source):即触发事件的控件,比如按钮、文本框等。 +\end_layout + +\begin_layout Itemize +事件对象(Event Object):描述事件的封装对象,其中包括了事件源、事件发生事件、事件相关参数(比如鼠标事件包括鼠标点击的坐标、鼠标点击次数等)等。 +\end_layout + +\begin_layout Itemize +监听器(Listener):当事件发生时Java会自动调用的方法被称为监听器。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Swing事件机制" + +\end_inset + +说明了按钮事件的处理过程 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里对“注册”的原理没有展开说明,需要说明Event Loop的过程吗?需要说明注册和Java虚拟机的关系吗? +\end_layout + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +是否可以在这里增加一个设计模式的示例?比如设计一个Container模拟OS,设计一个Listener模拟按钮、checkbox等 +\end_layout + +\end_inset + +,其他类型的事件处理过程与此类似。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/swing-event-model.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Swing事件机制(以按钮为例) +\begin_inset CommandInset label +LatexCommand label +name "fig:Swing事件机制" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +控件的常见监听器 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整的Java GUI控件和事件监听器的对照表参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:控件的常见监听器" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +控件 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +常用监听器 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应鼠标左键单击和回车事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应除左键单击外的其他的各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JTextField +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应在输入框回车事件 +\end_layout + +\begin_layout Plain Layout +FocusListener:响应获得和失去焦点事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JRadioButton +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JCheckBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\begin_layout Plain Layout +MouseListener:响应各种鼠标事件 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +JComboBox +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ActionListener:响应选项选择事件 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +控件的常见监听器 +\begin_inset CommandInset label +LatexCommand label +name "tab:控件的常见监听器" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +监听器类的几种情形 +\begin_inset CommandInset label +LatexCommand label +name "subsec:监听器类的几种情形" + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到注册监听器的方法:src.addXxxListener(listenerObject)的参数是一个实现了监听器接口的对象,即通过这个方法告诉Java虚拟机, +当src(事件源)对象产生了一个Xxx类型的事件时,需要调用listenerObject中的相关方法进行事件处理。在实现监听器时,通常有如下的几种策略,以按钮的 +单击事件actionEvent为例: +\end_layout + +\begin_layout Itemize +主类直接实现XxxListener接口或者扩展XxxHandler类,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(this); // 注册事件监听器。由于FrameDemo本身实现ActionListener接 +口,因此这里直接使用this作为实现了事件监听器接口的对象。 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用匿名内部类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ActionListener() { // 匿名内部类实现ActionListener接 +口 +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + }); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +使用独立的类实现监听器接口,比如: +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class FrameDemo { +\end_layout + +\begin_layout Plain Layout + + private JButton button; +\end_layout + +\begin_layout Plain Layout + + public FrameDemo() { +\end_layout + +\begin_layout Plain Layout + + button = new JButton("OK"); +\end_layout + +\begin_layout Plain Layout + + button.addActionListener(new ButtonListener()); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +// 独立的事件监听器类,实现了ActionListener接口 +\end_layout + +\begin_layout Plain Layout + +class ButtonListener implements ActionListener { +\end_layout + +\begin_layout Plain Layout + + @Override +\end_layout + +\begin_layout Plain Layout + + public void actionPerformed(ActionEvent event) { +\end_layout + +\begin_layout Plain Layout + + // 事件处理代码 +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在大多数情况下,我们建议使用匿名内部类实现监听器接口,代码更简洁,封装性更好。 +\end_layout + +\begin_layout Section +Java GUI综合应用举例 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java-GUI综合应用举例" + +\end_inset + + +\end_layout + +\begin_layout Example +计算器 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +这是一个典型的可以使用GridBagLayout进行界面设计的应用场合,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的界面设计" + +\end_inset + +所示。为了更好的适应窗口大小,界面中的所有控件设置了如下属性: +\end_layout + +\begin_layout Itemize +horizental align:Fill +\end_layout + +\begin_layout Itemize +virtical align: Fill +\end_layout + +\begin_layout Itemize +weight x : 1.0 +\end_layout + +\begin_layout Itemize +weight y : 1.0 +\end_layout + +\begin_layout Standard +完整的代码参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Caculator.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/gui/src/cn/edu/sdut/softlab/Caculator.java" +lstparams "caption={Caculator.java},label={Caculator.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-1.png + width 70line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的界面设计 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的界面设计" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:计算器的运行结果" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/gui/caculator-2.png + width 60line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +计算器的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:计算器的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码说明 +\end_layout + +\begin_layout Standard +本例为了简化起见,表达式的求值借用了JDK内置的JavaScript引擎,有兴趣的读者可以自行实现一个表达式求值的引擎或者方法。 +\end_layout + +\begin_layout Exercise +请尝试使用GridLayout重新设计计算器(提示:首先使用GridLayout将界面分为上下两部分,上部分是一个Panel显示计算结果,使用任意的Layout +即可;下部分是一个显示计算按钮的Panel,使用GridLayout布局)。 +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture15.lyx b/guide/lecture_guide/lecture15.lyx new file mode 100644 index 0000000..1ac14d6 --- /dev/null +++ b/guide/lecture_guide/lecture15.lyx @@ -0,0 +1,2751 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +coderemarks +warning-inset +note-inset +tip-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks false +\pdf_pdfborder true +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第十五次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:网络通讯基础知识" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:网络通讯基础知识" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:使用URL" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:使用URL" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Socket编程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Socket编程" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java网络编程的基本模型; +\end_layout + +\begin_layout Enumerate +使用URL的网络编程; +\end_layout + +\begin_layout Enumerate +Java Socket编程; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java网络编程和Java I/O的关系; +\end_layout + +\begin_layout Enumerate +Java Socket编程; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +掌握Java网络编程的基本模型; +\end_layout + +\begin_layout Enumerate +掌握Java Socket编程的基本思路和方法; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java Socket编程如何有用,你知道有哪些框架是对Java Socket编程的进一步封装? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +网络编程 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/network-programming.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Section +网络通讯基础知识 +\begin_inset CommandInset label +LatexCommand label +name "sec:网络通讯基础知识" + +\end_inset + + +\end_layout + +\begin_layout Standard +在讲述Java的网络编程之前,我们迅速的回顾一下网络通讯的基础知识,读者如果已经熟悉此部分内容可跳过。 +\end_layout + +\begin_layout Standard +现代的互联网是基于TCP/IP的四层通讯模型的,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:TCP/IP通讯模型" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/tcp-ip-model.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +TCP/IP四层通讯模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:TCP/IP通讯模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +虽然我们使用java.net包编写的Java网络应用程序位于应用层,但是了解TCP、IP的基本概念有助于我们选择合适的类包编写应用程序。 +\end_layout + +\begin_layout Subsection +TCP +\end_layout + +\begin_layout Standard +TCP(Transmission Control Protocol)是一种可靠的传输控制协议。TCP协议通过建立可靠的网络链接保证数据在传输过程中不会丢失,顺序 +也不会乱掉,因此当我们需要可靠的网络数据传输时就要选择TCP协议,比如负责网页传输的HTTP协议,负责文件传输的FTP协议,负责邮件传输的Email协议,负责远 +程登录的Telnet/ssh协议等:你一定不希望收到的是破损的文件或者邮件的,对吧? +\end_layout + +\begin_layout Standard +但是,TCP协议建立可靠的网络链接也是要付出代价的,即相对于“不太可靠”的UDP而言,TCP的传输效率要低一些。 +\end_layout + +\begin_layout Subsection +UDP +\end_layout + +\begin_layout Standard +UDP(User Datagram Protocol)是一种“不太可靠”的传输控制协议,即UDP并不保证数据发出后,接收端一定能够收到,也不保证数据传输的顺序。 +这种“不太可靠”的数据传输方式在并不要求百分百数据准确性的场合大有用武之地,比如网络视频,即使数据在传输中丢掉了一点点数据,并不影响视频的流畅和质量。 +\end_layout + +\begin_layout Standard +由于UDP协议不需要维护可靠的传输通道,UDP协议的传输效率要比TCP高一些。 +\end_layout + +\begin_layout Subsection +IP地址 +\end_layout + +\begin_layout Standard +网络上的每一台设备都有一个唯一的地址编号,即IP地址,网络中的路由器就是根据数据包中的目的IP地址和源IP地址构建了数据传输的路由(通道)。常见的IP地址是32 +位的,,每8位使用句点隔开,比如210.44.176.123。 +\end_layout + +\begin_layout Subsection +端口(port) +\begin_inset CommandInset label +LatexCommand label +name "subsec:端口(port)" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们知道,现代操作系统都是多任务操作系统,可以同时运行多个应用程序,每一个应用程序可以看做这台计算机提供的一种服务。如果这些应用程序提供网络服务,比如HTTP, +FTP服务,那么如何区分在一台计算机上面运行着的多个网络应用程序呢?单纯依赖IP地址是不够的,需要借助以端口(Port)的概念,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:端口示意图" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/port.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +端口示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:端口示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +当数据到达计算机后,计算机会根据应用程序的不同将数据分发到不同端口,这就要求通信双方事先约定好使用的端口号。端口号是一个16位的数字,其范围为0~55635,但 +是0~1024号端口通常被称作“熟知端口”,即这些端口很多已经用于大家约定俗成的网络通讯服务,比如80端口用于HTTP协议传输,21用于FTP等等,因此我们自己 +编写的Java网络应用程序尽量避免使用1024以下的端口号,以免和熟知端口冲突。 +\end_layout + +\begin_layout Section +使用URL +\begin_inset CommandInset label +LatexCommand label +name "sec:使用URL" + +\end_inset + + +\end_layout + +\begin_layout Subsection +什么是URL? +\end_layout + +\begin_layout Standard +URL(Uniform Resource Locator)是网络资源的唯一地址,即通常所说的“网址”。我们可以根据URL查找网络资源(文字、图片、视频等),ja +va.net.URL类表示了一个URL。一个URL包含包含了如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:URL示意图" + +\end_inset + +所示的几部分: +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/url.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +URL示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:URL示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +协议(protocal):使用何种协议请求这个网络资源?http用于请求超文本文件,只是常见的网络协议之一,此外还有ftp、email、telnet等各种网络协 +议。协议和主机部分通过 +\begin_inset Quotes erd +\end_inset + +:// +\begin_inset Quotes erd +\end_inset + +隔开。 +\end_layout + +\begin_layout Itemize +主机(host):网络资源位于哪台网络设备,即主机中?主机往往由主机名和域名联合组成,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:URL示意图" + +\end_inset + +所示,www是一台提供WEB服务的主机的主机名,example.com是这台主机所在的域名,www.example.com是URL的主机部分。 +\end_layout + +\begin_layout Itemize +端口:(port):如 +\begin_inset CommandInset ref +LatexCommand formatted +reference "subsec:端口(port)" + +\end_inset + +所述,端口决定了主机将URL请求转发到哪个应用程序来处理。对于常见的“熟知端口”,比如http协议的80端口,通常在URL中可以略去。 +\end_layout + +\begin_layout Itemize +文件名(file):所请求的具体资源(文件、图片等)在主机的存储路径(含文件名)。这里的文件名是一个广义的概念,其一,文件名包括了路径和文件的具体名称;其二,U +RL中的文件名也可能仅仅是一个目录,但是要知道,WEB服务器会自动根据配置情况附加一个index.html或者类似的具体文件名。 +\end_layout + +\begin_layout Itemize +请求参数(query):在交互式网络应用程序中,往往需要附带额外的参数来进一步确定所请求的网络资源,通过 +\begin_inset Quotes erd +\end_inset + +? +\begin_inset Quotes erd +\end_inset + +隔开文件名和请求参数(Query String)。 +\end_layout + +\begin_layout Standard +此外需要注意到,在Java的URL类中,还给出了authority的概念,即主机和端口合称为authority。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +为什么称作authority呢?其实一个完整的URL是这样子的 +\begin_inset Foot +status open + +\begin_layout Plain Layout +https://en.wikipedia.org/wiki/Uniform_Resource_Identifier +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Plain Layout +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +也就是说,在一个URL中还包含user:password部分,因此authority应该包含三部分: +\end_layout + +\begin_layout Enumerate +可选的用户名和密码 +\end_layout + +\begin_layout Enumerate +必须的主机 +\end_layout + +\begin_layout Enumerate +可选的端口号 +\end_layout + +\begin_layout Plain Layout +也就是说,这三个部分决定了用户是否有权限访问所给定的主机(和具体的资源没有关系):使用什么用户名和密码可以访问主机的哪个端口,因此这三个部分联合起来又叫做“au +thority”,即权威认证。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +创建URL +\end_layout + +\begin_layout Standard +java.net.URL类的构造方法提供了常见的创建URL对象的构造方法,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +tablename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "tab:URL的构造方法" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float table +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +方法名 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +说明 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public URL(String spec) throws MalformedURLException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的URL字符串创建URL对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public URL(URL context, String spec) throws MalformedURLException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据给定的上下文和字符串创建URL对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public URL(String protocol, String host, int port, String file) throws Malformed +URLException +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据跟定的协议、主机、端口号和文件名创建URL对象 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +public URL(String protocol, String host, String file) throws MalformedURLExcepti +on +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +根据跟定的协议、主机和文件名创建URL对象 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +URL的构造方法 +\begin_inset CommandInset label +LatexCommand label +name "tab:URL的构造方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +创建绝对URL +\end_layout + +\begin_layout Standard +创建URL对象的最简单方式,是使用我们常见的URL(网址)的形式作为参数,比如 +\begin_inset Foot +status open + +\begin_layout Plain Layout +完整示例参见:https://github.com/subaochen/java-tutorial-examples/tree/master/network/sr +c/cn/edu/sdut/softlab +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +URL url = new URL("http://www.example.com/doc/tutorial/networking.html?id=101"); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +注意到参数:"http://www.example.com/doc/tutorial/networking.html?id=101"是一个完整的URL字符串,叫做“绝 +对URL”,类似于我们描述文件名的时候,称带完整路径信息的文件名为“绝对路径”。 +\end_layout + +\begin_layout Subsubsection +创建相对URL +\end_layout + +\begin_layout Standard +所谓的相对URL,是指在给定的URL的基础上再附加所缺少的URL元素创建一个URL对象,类似于“相对路径”的概念,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +URL url = new URL("http://www.example.com"); // 创建一个绝对URL +\end_layout + +\begin_layout Plain Layout + +URL tutUrl = new URL(url, "doc/tutorial/networking.html?id=101"); // 创建一个相对URL +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在创建相对URL的时候,如果第一个参数为null,则构造方法会将第二个参数看做“绝对URL”来处理;如果第二个参数为绝对URL,则会忽略第一个参数,比如: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +URL url = new URL(null, "http://www.example.com/doc"); // 创建一个绝对URL对象 +\end_layout + +\begin_layout Plain Layout + +URL url = new URL(url, "http://www.example.com"); // 创建一个绝对URL对象 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用绝对URL和相对URL两种方式,分别创建 https://github.com/subaochen/java-tutorial-examples/tree/m +aster/network/src/cn/edu/sdut/softlab 的URL对象。 +\end_layout + +\begin_layout Subsubsection +使用协议、主机等创建URL +\end_layout + +\begin_layout Standard +有时我们获得的是URL的各个组成部分:协议、主机、文件名等,可以根据这些组成部分方便的创建URL对象,比如: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +URL url = new URL("http","www.example.com","doc/tutorial/networking.html?id=101"); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +解析URL +\end_layout + +\begin_layout Standard +URL类提供了一系列的getXXX方法帮助我们解析给定的URL对象的各个部分,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "ParseURL.java" + +\end_inset + +所示,请读者参照 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:URL示意图" + +\end_inset + +并根据此示例程序的运行结果仔细体会URL的各个组成部分是如何划分的。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/ParseURL.java" +lstparams "caption={ParseURL.java},label={ParseURL.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +protocol = http +\end_layout + +\begin_layout Plain Layout +authority = example.com:80 +\end_layout + +\begin_layout Plain Layout +host = example.com +\end_layout + +\begin_layout Plain Layout +port = 80 +\end_layout + +\begin_layout Plain Layout +path = /docs/books/tutorial/index.html +\end_layout + +\begin_layout Plain Layout +query = name=networking +\end_layout + +\begin_layout Plain Layout +filename = /docs/books/tutorial/index.html?name=networking +\end_layout + +\begin_layout Plain Layout +ref = DOWNLOADING +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +读取URL +\end_layout + +\begin_layout Standard +创建URL对象后,我们可以通过URL类的 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +openStream() +\end_layout + +\end_inset + +方法获得一个到指定URL的inputStream流,然后就可以和操作本地文件一样方便的读取URL所指向的内容了,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "URLReader.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/URLReader.java" +lstparams "caption={URLReader.java},label={URLReader.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +运行结果如下 +\begin_inset Foot +status open + +\begin_layout Plain Layout +是的,不要怀疑,获取的内容就这么简单!读者可自行访问 +\begin_inset CommandInset href +LatexCommand href +name "https://raw.githubusercontent.com/subaochen/java-tutorial-examples/master/network/sample/hello.txt" +target "https://raw.githubusercontent.com/subaochen/java-tutorial-examples/master/network/sample/hello.txt" +literal "false" + +\end_inset + +验证一下。 +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +hello, java! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +读取URL的另外方式是使用URLConnection类提供的方法,同时URLConnection还提供了更丰富的交互功能,详情参见: +\end_layout + +\begin_layout Plain Layout +https://docs.oracle.com/javase/tutorial/networking/urls/connecting.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Socket编程 +\begin_inset CommandInset label +LatexCommand label +name "sec:Socket编程" + +\end_inset + + +\end_layout + +\begin_layout Standard +网络通讯的基本形式是“端对端”通信,即所谓的“客户端-服务器模式”(Client Server:CS),如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:客户-服务器通信模型" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/client-server-model.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +客户-服务器通信模型 +\begin_inset CommandInset label +LatexCommand label +name "fig:客户-服务器通信模型" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +在端对端通信中,客户端和服务器端首先建立通讯链接,然后客户端发送请求(request)到服务器端,服务器端返回响应(response)到客户端,实现了一次数据交 +换。这很像我们打电话的过程:首先拨号呼叫对方,如果对方摘机应答(或者手机上按下应答键),则双方通话的通道就建立起来了,然后就可以你一言我一语的通过电话交谈了。任 +何一方挂机,则整个通话过程(通信过程)就结束了。 +\end_layout + +\begin_layout Subsection +什么是Socket? +\end_layout + +\begin_layout Standard +在端对端的通信中,通信的双方不仅需要知道对方的主机IP地址,还需要知道对方应用使用的端口号,这是建立端对端通信的必要基础,因此将 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +IP地址和端口号合称为Socket +\end_layout + +\end_inset + +(插口),如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Socket示意图" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/socket.eps + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Socket示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:Socket示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +基于Socket概念的编程通常被称为“Socket编程”,java.net包中提供了Socket、ServerSocket等类封装了Socket的基本操作,可以方 +便的实现客户端和服务器端的Socket编程。 +\end_layout + +\begin_layout Subsection +使用Socket +\begin_inset CommandInset label +LatexCommand label +name "subsec:使用Socket" + +\end_inset + + +\end_layout + +\begin_layout Standard +下面我们通过一个实现了Echo协议的例子来说明Java Socket编程的基本思路。如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "EchoServer.java" + +\end_inset + +所示的EchoServer.java是服务器端,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "EchoClient.java" + +\end_inset + +所示的EchoClient.java是客户端。客户端每次向服务器端发送字符串时,服务器端仅仅是把收到的字符串原样返回到客户端,即所谓的echo操作。 +\end_layout + +\begin_layout Standard +本示例的运行测试方法:首先启动EchoServer,再启动EchoClient。注意到EchoServer需要一个命令行参数 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +设置命令行参数的方法参见: +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:如何设置命令行参数?" + +\end_inset + + +\end_layout + +\end_inset + +:端口号,这里假设为2000;EchoClient需要两个命令行参数,主机IP地址和服务器端端口号,在这里主机使用localhost,服务器端端口号为2000。 +本示例程序的服务器端EchoServer是静默运行的,即启动后没有给出任何提示。客户端EchoClient运行后可以在终端窗口输入内容,一个可能的测试结果如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:EchoClient的运行结果" + +\end_inset + +所示。 +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/echoclient-result.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +EchoClient的运行结果 +\begin_inset CommandInset label +LatexCommand label +name "fig:EchoClient的运行结果" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java Socket的基本原理如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java-Socket通讯示意图" + +\end_inset + +所示, +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/java-socket-programming.eps + width 90line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java Socket通讯示意图 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java-Socket通讯示意图" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +服务器端(这里是EchoServer)创建ServerSocket对象后,通过serverSocket对象的accept方法等待客户端发起连接请求。也就是说,S +ocketServer是一个被动的服务器端,当SocketServer启动后会阻塞在accept方法,一直在等待客户端发起连接请求。一旦有客户端连接成功,则创建 +一个描述此端对端通信的Socket对象(这里是clientSocket),通过此socket对象即可获得一个从客户端读取数据的InputStream(这里是in +),以及可以写入客户端的outputStream(这里是out)。注意到serserSocket、clientSocket、in、out都是需要用完即关闭的资源 +,因此在本例中我们使用try-with-resources +\begin_inset Foot +status open + +\begin_layout Plain Layout +如果不熟悉try-with-resources结构,请参照 +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:try-with-resources" + +\end_inset + + +\end_layout + +\end_inset + +结构帮助我们自动关闭打开的资源。 +\end_layout + +\begin_layout Standard +客户端EchoClient的过程类似,首先创建一个Socket对象(这里是echoSocket)。注意到我们使用服务器端的IP地址和端口号创建的echoSock +et,因此echoSocket会试图根据我们提供的参数发起到服务器端的连接请求,连接成功则建立了客户端和服务器端的通信通道,这就是echoSocket。通过ec +hoSocket我们可以获得从服务器端读取数据的InputStream(这里是in),往服务器端写入数据的OutputStream(这里是out),然后不断将从 +键盘输入的字符串送往服务器端即可。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +一般的Linux发布版中都提供了Socket测试工具,包括服务器端和客户端。在ubuntu中可以简单的执行命令: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ sudo apt-get install socket +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +安装socket测试工具。安装完成后,启动EchoServer,可以在另外一个终端如下方式测试EchoServer的功能: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +$ socket -v localhost 2000 +\end_layout + +\begin_layout Plain Layout +inet: connected to localhost port 2000 (cisco-sccp) +\end_layout + +\begin_layout Plain Layout +hello? +\end_layout + +\begin_layout Plain Layout +hello? +\end_layout + +\begin_layout Plain Layout +你是谁? +\end_layout + +\begin_layout Plain Layout +你是谁? +\end_layout + +\begin_layout Plain Layout +我们交个朋友吧! +\end_layout + +\begin_layout Plain Layout +我们交个朋友吧! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +socket工具作为编写服务器端的测试工具很方便,当然,socket也可以作为服务器端运行来测试客户端应用程序,读者可以自行探索。 +\end_layout + +\begin_layout Plain Layout +另外一个简单的客户端工具是telnet,比如: +\end_layout + +\begin_layout Plain Layout +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ telnet localhost 2000 +\end_layout + +\begin_layout Plain Layout +Trying 127.0.0.1... +\end_layout + +\begin_layout Plain Layout +Connected to localhost. +\end_layout + +\begin_layout Plain Layout +Escape character is '^]'. +\end_layout + +\begin_layout Plain Layout +hello +\end_layout + +\begin_layout Plain Layout +hello +\end_layout + +\begin_layout Plain Layout +if it is to be, it is up to me +\end_layout + +\begin_layout Plain Layout +if it is to be, it is up to me +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/EchoServer.java" +lstparams "caption={EchoServer.java},label={EchoServer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/EchoClient.java" +lstparams "caption={EchoClient.java},label={EchoClient.java}" + +\end_inset + + +\end_layout + +\begin_layout Exercise +使用Socket编写一个服务器端和客户端,客户端给出一个算术表达式,服务器端返回计算结果 +\begin_inset Foot +status open + +\begin_layout Plain Layout +算术表达式求值可以参考: +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:Java-GUI综合应用举例" + +\end_inset + + +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Subsection +*编写健壮的服务器端Socket应用 +\end_layout + +\begin_layout Standard +在编写服务器端的Socket应用程序时要考虑以下的问题: +\end_layout + +\begin_layout Itemize +如何响应多个客户端的连接请求?通常的做法是针对每个客户发起一个独立的线程。 +\end_layout + +\begin_layout Itemize +如何灵活的处理不同的业务逻辑,即客户端和服务器端的通讯协议?这是服务器端Socket编程的重要内容,不好的架构往往不恰当的提高了软件的复杂度,降低了软件的可维护 +性。 +\end_layout + +\begin_layout Itemize +网络I/O和消息的编码、解码处理。 +\end_layout + +\begin_layout Itemize +错误处理。网络通讯环境是复杂和易出错的,保证服务器端SocketServer总是能够正确响应不是一件很容易的事情。 +\end_layout + +\begin_layout Standard +有很多第三方组织开发了一些帮助开发者处理以上问题的框架,其中比较著名的是Apache +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://www.apache.org +\end_layout + +\end_inset + +组织的mina +\begin_inset Foot +status open + +\begin_layout Plain Layout +http://mina.apache.org +\end_layout + +\end_inset + +。Apache mina 2 (2指mina的第二个大的版本号,是目前的最新版本)是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件 +驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache mina 2 可以作为开发网络应用程序的一个良好基础。 +下面就mina的开发做一简单介绍 +\begin_inset Foot +status open + +\begin_layout Plain Layout +mina的官方文档非常详尽,有需要详细了解mina的读者建议直接阅读mina的官方指南:http://mina.apache.org/mina-project/us +erguide/user-guide-toc.html,中文译本请参考:https://waylau.gitbooks.io/apache-mina-2-user-g +uide/ +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Subsubsection +建立mina开发环境 +\end_layout + +\begin_layout Paragraph* +下载mina +\end_layout + +\begin_layout Standard +首先需要下载mina的合适版本,我们采用最新的版本即可,本书写作时mina的最新版本是2.0.16,可以从这里下载: +\begin_inset CommandInset href +LatexCommand href +name "http://mina.apache.org/mina-project/downloads.html" +target "http://mina.apache.org/mina-project/downloads.html" +literal "false" + +\end_inset + +。下载后(这里是下载到~/downloads目录下)解压缩到合适的目录,作者的习惯是在家目录建立一个devel目录,并将所有开发相关的软件都放到devel目录下 +: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +cd ~/devel +\end_layout + +\begin_layout Plain Layout +tar xzvf ~/downloads/apache-mina-2.0.16-bin.tar.gz +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +我们看到在apache-mina-2.0.16目录下的文件如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shadowbox +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status collapsed + +\begin_layout Plain Layout +$ tree -L 1 +\end_layout + +\begin_layout Plain Layout +. +\end_layout + +\begin_layout Plain Layout +├── dist +\end_layout + +\begin_layout Plain Layout +├── docs +\end_layout + +\begin_layout Plain Layout +├── lib +\end_layout + +\begin_layout Plain Layout +├── LICENSE.jzlib.txt +\end_layout + +\begin_layout Plain Layout +├── LICENSE.ognl.txt +\end_layout + +\begin_layout Plain Layout +├── LICENSE.slf4j.txt +\end_layout + +\begin_layout Plain Layout +├── LICENSE.springframework.txt +\end_layout + +\begin_layout Plain Layout +├── LICENSE.txt +\end_layout + +\begin_layout Plain Layout +└── NOTICE.txt +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +其中的三个目录分别为: +\end_layout + +\begin_layout Itemize +dist:mina的发布文件,提供了mina的功能实现,我们下一步需要的mina-core就在这个目录下。 +\end_layout + +\begin_layout Itemize +docs:mina的API文档。 +\end_layout + +\begin_layout Itemize +lib:mina运行所需要支撑库。 +\end_layout + +\begin_layout Paragraph* +Idea中建立mina的开发环境 +\end_layout + +\begin_layout Standard +在Idea中开发mina应用,需要将mina的核心库加入到项目的配置中,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Idea项目增加类库的方法" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/idea-module-setting-add-lib-0.png + width 20line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +右键点击项目打开设置菜单 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/idea-module-setting-add-lib-1.png + width 34line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +从Libraries添加类库 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/idea-module-setting-add-lib-2.png + width 42line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +选择mina-core加入到项目中 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Idea项目增加类库的方法 +\begin_inset CommandInset label +LatexCommand label +name "fig:Idea项目增加类库的方法" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +同样的方法,从apache-mina-2.0.16/lib目录下把slf4j-api-1.7.21.jar也加入到项目的库配置中。 +\end_layout + +\begin_layout Subsubsection +简单mina应用程序示例 +\end_layout + +\begin_layout Standard +我们先从一个简单的“时间服务器”入手,看一下mina socket server是如何构建的。这个事件服务器实现的功能很简单,客户端无论发送什么消息上来,服务器 +只是返回当前时间作为响应。 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "MinaTimeServer.java" + +\end_inset + +所示,时间服务器的主类MinaTimeServer的主要工作是: +\end_layout + +\begin_layout Itemize +创建一个NioSocketAcceptor对象acceptor,这是mina对使用TCP的SocketServer的进一步封装,我们此后可以利用这个accept +or完成mina服务器的配置和启动。 +\end_layout + +\begin_layout Itemize +创建几个过滤器对象并添加到acceptor。这里添加了两个过滤器:一是日志过滤器,实现对操作过程的日志处理;二是文本编码过滤器,使用UTF-8对Socket流中 +的字符进行编码转换。 +\end_layout + +\begin_layout Itemize +设置这个时间服务器的事物逻辑处理器,即TimeServerHandler,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "TimeServerHandler.java" + +\end_inset + +。 +\end_layout + +\begin_layout Itemize +(可选)设置acceptor监听器的配置属性,这里设置了缓冲器大小和idle时间。 +\end_layout + +\begin_layout Itemize +将acceptor监听器绑定到指定的端口。 +\end_layout + +\begin_layout Standard +如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "TimeServerHandler.java" + +\end_inset + +所示,在主类中我们使用TimeServerHandler来进行具体的业务逻辑处理,这里的逻辑很简单:当收到任何消息(即messageReceived方法被调用时 +)时,我们创建新的Date对象并写入到发送队列(session.write()),mina会将发送队列的消息返回到客户端。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/mina/MinaTimeServer.java" +lstparams "caption={MinaTimeServer.java},label={MinaTimeServer.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../../advance/code/network/src/cn/edu/sdut/softlab/mina/TimeServerHandler.java" +lstparams "caption={TimeServerHandler.java},label={TimeServerHandler.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +运行MinaTimeServer后,我们可以通过telnet或者socket工具连接MinaTimeServer,一个可能的运行结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +$ telnet localhost 9123 +\end_layout + +\begin_layout Plain Layout +Trying 127.0.0.1... +\end_layout + +\begin_layout Plain Layout +Connected to localhost. +\end_layout + +\begin_layout Plain Layout +Escape character is '^]'. +\end_layout + +\begin_layout Plain Layout +hello +\end_layout + +\begin_layout Plain Layout +Sun Feb 19 08:49:01 CST 2017 +\end_layout + +\begin_layout Plain Layout +anybody there? +\end_layout + +\begin_layout Plain Layout +Sun Feb 19 08:49:33 CST 2017 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +mina应用程序的基本结构 +\end_layout + +\begin_layout Standard +基于 Apache mina 的网络应用有三个层次,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:mina框架各部分关系" + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +本图借鉴了http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html,感谢作者的精彩阐述。 +\end_layout + +\end_inset + +所示, +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../../advance/imgs/network/mina-overview.eps + width 95line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +mina框架各部分关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:mina框架各部分关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +分别是 I/O 服务、I/O 过滤器和 I/O 处理器: +\end_layout + +\begin_layout Standard +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +I/O 服务(I/O Processor) +\end_layout + +\end_inset + +:I/O 服务用来执行实际的 网络I/O 操作,即Socket通信。Apache mina 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UD +P/IP、串口和虚拟机内部的管道等,我们可以直接拿来使用。开发人员也可以实现IoService接口打造一个适合特定场景的 I/O 服务。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +I/O 过滤器(IOFilter) +\end_layout + +\end_inset + +:I/O 服务能够传输的是字节流(Socket通讯),而上层应用(即IoHandler部分)需要的是特定的对象与数据结构。I/O 过滤器用来完成这两者之间的转换 +。I/O 过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个 I/O 过滤器串联起来,形成 I/O 过滤器链。 mina已经实现了常见的I +oFilter,我们可以根据需要选择使用,开发人员可以通过实现IoFilter接口或者扩展IoFilterAdaptor类打造特定的I/O过滤器。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +I/O 处理器(Handler) +\end_layout + +\end_inset + +:I/O 处理器用来执行具体的业务逻辑,对接收到的消息执行特定的处理。 通常,开发人员需要实现IoHandler接口或者扩展IoHandlerAdaptor类。 +\end_layout + +\begin_layout Standard +创建一个完整的基于 Apache mina 的网络应用,需要分别构建这三个层次。Apache mina 已经为 I/O 服务和 I/O 过滤器提供了不少的缺省实 +现,因此这两个层次在大多数情况下可以使用已有的实现。I/O 处理器由于是与具体的业务相关的,一般来说都是需要自己来实现的。 +\end_layout + +\begin_layout Subsubsection +事件驱动的异步API +\end_layout + +\begin_layout Standard +Apache mina 提供的是事件驱动的 API,它把与网络相关的各种活动抽象成事件,网络应用只需要对其感兴趣的事件进行处理即可。事件驱动的 + API 使得基于 Apache mina 开发网络应用变得比较简单。应用不需要考虑与底层传输相关的具体细节,而只需要处理抽象的 I/O 事件。比如在实现一个服 +务端应用的时候,如果有新的连接进来,I/O 服务会产生 sessionOpened这样一个事件。如果该应用需要在有连接打开的时候,执行某些特定的操作,只需要在 + I/O 处理器中此事件处理方法 sessionOpened中添加相应的代码即可。 +\end_layout + +\begin_layout Exercise +使用mina编写一个计算算术表达式的服务器。 +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture8.lyx b/guide/lecture_guide/lecture8.lyx new file mode 100644 index 0000000..a35c3f6 --- /dev/null +++ b/guide/lecture_guide/lecture8.lyx @@ -0,0 +1,3197 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks false +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第八次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:异常的概念" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:异常的概念" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:C中的异常处理方式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:C中的异常处理方式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Java的异常处理方式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:Java的异常处理方式" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:捕获异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:捕获异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:抛出异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:抛出异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +C和Java异常处理的思路差异; +\end_layout + +\begin_layout Enumerate +Java的异常类层次; +\end_layout + +\begin_layout Enumerate +Java异常的捕获和抛出方式及其原理; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +Java异常的捕获和抛出原理; +\end_layout + +\begin_layout Enumerate +Java异常的链式责任传递机制; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握Java异常的概念和常见Java异常类; +\end_layout + +\begin_layout Enumerate +深刻理解Java异常抛出和捕获的机制,清楚Java异常处理的责任链机制; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +你认为Java的异常处理方式有什么优缺点? +\end_layout + +\begin_layout Enumerate +举例说明Java的异常处理责任链机制是如何运作的? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +异常处理 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/exception/exception-vym.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Section +异常的概念 +\begin_inset CommandInset label +LatexCommand label +name "sec:异常的概念" + +\end_inset + + +\end_layout + +\begin_layout Standard +“人生不如意事十之八九” +\begin_inset Foot +status open + +\begin_layout Plain Layout +南宋词人辛弃疾词《贺新郎·用前韵再赋》:“叹人生、不如意事,十常八九。” +\end_layout + +\end_inset + +,编程同样道理:世事纷繁复杂,情况千变万化,代码要正确运行,不仅要处理正常的流程,更要处理多样化的非正常流程。比如常见的情形: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举例说明异常流程之多样化 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +街头的投币电话,总有人尝试用游戏币看看能不能蒙混过关; +\end_layout + +\begin_layout Itemize +长城的古砖墙是为御敌而生,却被人刻上“到此一游”; +\end_layout + +\begin_layout Itemize +机动车道上的行人,人行道上的机动车; +\end_layout + +\begin_layout Standard +回到现实的程序中,在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:日期和时间类" + +\end_inset + +中,我们看到日期和时间类都定义了一个parse方法,能够将字符串解析为LocalDate、LocalTime或者LocalDateTime对象,很直观,很方便, +因此在编程实践中很常见。试运行下面的示例: +\end_layout + +\begin_layout Example +从键盘输入字符串创建日期对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:从键盘输入字符串创建日期对象" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WhatIfNoException.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/WhatIfNoException.java" +lstparams "caption={WhatIfNoException.java},label={WhatIfNoException.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行WhatIfNoException结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Please input date:2016-11-22 +\end_layout + +\begin_layout Plain Layout +2016-11-22 +\end_layout + +\begin_layout Plain Layout +Please input date:2016-13-22 +\end_layout + +\begin_layout Plain Layout +Exception in thread "main" java.time.format.DateTimeParseException: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +Text '2016-13-22' could not be parsed: Invalid value for MonthOfYear (valid + values 1 - 12): 13 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +at java.time.format.DateTimeFormatter.createError( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +DateTimeFormatter.java:1920) +\end_layout + +\begin_layout Plain Layout +...... +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.WhatIfNoException.main( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +WhatIfNoException.java:30) +\end_layout + +\begin_layout Plain Layout +Caused by: java.time.DateTimeException: Invalid value for MonthOfYear (valid + values 1 - 12): 13 +\end_layout + +\begin_layout Plain Layout +at java.time.temporal.ValueRange.checkValidIntValue(ValueRange +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:330) +\end_layout + +\begin_layout Plain Layout +...... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入字符串创建日期对象" + +\end_inset + +中,从键盘输入的字符串如果符合LocalDate的格式要求自然一切正常,但是我们不能总是期望人们每次输入都遵循LocalDate的格式,无论人们是有意还是无意, +总会有破坏规则的时候,比如输入的月份大于12、天数大于31等。显然,错误的输入是无法获得正确的LocalDate对象的,Java编译器也无法自动纠正这种类型的错 +误。对于这种情况,Java友好的给出了错误的原因及其关联的程序代码(stack trace),以帮助程序员快速定位错误代码的位置,更快的修复问题。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +实际上,类似 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入字符串创建日期对象" + +\end_inset + +的错误提示方式,对于程序员而言是友好的,但是对于终端用户而言是不友好的:终端用户并不关心程序哪一行出错了。对于终端用户而言,程序应该给出更人性化的提示,比如提示 +“日期格式有错误,月份应该在1-12之间”等等。我们将在 +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:Java的异常处理方式" + +\end_inset + +中介绍如何更人性化的处理。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +C中的异常处理方式 +\begin_inset CommandInset label +LatexCommand label +name "sec:C中的异常处理方式" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们先回顾一下在C语言中如何判断用户的输入是否合法,大致应该是如下的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if(month < 1 || month > 12) { +\end_layout + +\begin_layout Plain Layout + + printf("wrong month num:%d",month); +\end_layout + +\begin_layout Plain Layout + + return -1; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +if(day < 1 || day > 31) { /* 没有考虑二月份情况 */ +\end_layout + +\begin_layout Plain Layout + + printf("wrong day num:%d",day); +\end_layout + +\begin_layout Plain Layout + + return -1; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +... +\end_layout + +\begin_layout Plain Layout + +/* 用户的输入合法,下面继续处理正常流程 */ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,我们只能通过一系列的if条件判断来分析用户的输入是否合法,如果可能的异常情形比较多,势必会存在更多的if条件判断,造成程序的流程不清晰:哪些是正常流程 +处理代码,哪些是异常流程处理代码,除非通过注释标识出来,否则很难一眼看清楚。 +\end_layout + +\begin_layout Section +Java的异常处理方式 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的异常处理方式" + +\end_inset + + +\end_layout + +\begin_layout Standard +当然,在Java中我们依然可以像C语言那样去处理异常 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +异常 +\end_layout + +\end_inset + +。不过,Java提供了更棒的异常处理机制:将异常情况抽象为异常对象 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +异常对象 +\end_layout + +\end_inset + +,并采用责任链 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +责任链 +\end_layout + +\end_inset + +处理机制处理异常对象。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这部分讲的不清楚 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java内置了常见的异常类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/exception-overview.eps + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的异常类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java的异常类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +当异常情况出现时,Java虚拟机能够“捕获 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +捕获 +\end_layout + +\end_inset + +” +\begin_inset Note Note +status open + +\begin_layout Plain Layout +如何捕获?如何感知?这里可能是许多初学者迷惑的地方。 +\end_layout + +\end_inset + +(catch) +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + +了解Java应用程序和Java虚拟机之间的关系,感性认识Java虚拟机是如何捕获异常的。 +\end_layout + +\end_inset + +异常对象,并根据异常对象的类型进行相应的处理。Java将异常类分为两大类: +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +非检查型异常 +\end_layout + +\end_inset + +非检查型异常:即Java虚拟机能够 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +自动 +\end_layout + +\end_inset + +处理的异常类型。换言之,这种类型的异常不需要在程序中捕获,一旦发生这种类型的异常,Java虚拟机有一套内置的处理方式,比如除数为零、数组越界、非法参数等异常类型 +。对应于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +,Error和RuntimeException的子类都是非检查型异常。在程序中可以不捕获非检查型异常,也可以捕获非检查型异常。捕获非检查型异常的目的往往是给用户 +提供更友好的出错提示,但这不是强制的。 +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +检查型异常 +\end_layout + +\end_inset + +检查型异常:即Java虚拟机无法自动处理的异常类型,需要在程序中捕获(catch)。对应于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +,ClassNotFoundException和IOException的子类都是检查型异常。要注意的是,检查型异常是必须捕获的,否则会导致语法错误,因此在程序中 +捕获检查型异常是强制的。 +\end_layout + +\begin_layout Section +捕获异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:捕获异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们首先简单回顾一下Java虚拟机和Java应用程序的关系,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/jvm-java.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java虚拟机和Java应用程序的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java应用程序编译为class文件后,经过Java虚拟机的类加载器解析class文件在内存中创建相应的存储模型然后执行该应用程序。也就是说,Java虚拟机完全 +掌控Java应用程序的执行过程,包括应用程序出现异常情况时。Java通过如下的程序结构捕获异常: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 一段可能存在SomeException类型异常的代码 +\end_layout + +\begin_layout Plain Layout + +} catch (SomeException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在try块中的代码就是所谓的“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +正常流程 +\end_layout + +\end_inset + +”,在catch块中的代码就是所谓的“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +异常流程 +\end_layout + +\end_inset + +”。如果异常流程有多种,就存在多个catch块: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 一段可能存在SomeException类型异常的代码 +\end_layout + +\begin_layout Plain Layout + +} catch (SomeException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} catch (OtherException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} catch (FooException e ) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +对比C语言中使用if...else结构的异常处理方式,Java的try...catch更清晰的区分了正常流程和异常流程:通过不同的异常类也清晰的表达了异常的类型,甚至无需借 +助注释,只是根据异常类的名字,我们也很容易判断异常的类型及其大致的处理方式。 +\end_layout + +\begin_layout Example +捕获异常 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "DivTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/DivTest.java" +lstparams "float,caption={DivTest.java},label={DivTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +此例的运行需要配置命令行参,配置方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:如何设置命令行参数?" + +\end_inset + + +\end_layout + +\begin_layout Standard +当命令行参数为“24 3”时的输出结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +您输入的两个数相除的结果是: 8 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24 3.5”可以看到输出变为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数字格式异常,程序只能接受整数形式的参数 +\end_layout + +\begin_layout Plain Layout +java.lang.NumberFormatException: For input string: "3.5" +\end_layout + +\begin_layout Plain Layout +at java.lang.NumberFormatException.forInputString(NumberFormatException +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:65) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:580) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:615) +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:34) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24 0”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +算数异常,除数不能为0 +\end_layout + +\begin_layout Plain Layout +java.lang.ArithmeticException: / by zero +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:35) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数组越界,运行程序时输入的参数个数不对。应该输入2个参数,您输入的参数个数是:1 +\end_layout + +\begin_layout Plain Layout +java.lang.ArrayIndexOutOfBoundsException: 1 +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:34) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24.5”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数字格式异常,程序只能接受整数形式的参数 +\end_layout + +\begin_layout Plain Layout +java.lang.NumberFormatException: For input string: "24.5" +\end_layout + +\begin_layout Plain Layout +at java.lang.NumberFormatException.forInputString(NumberFormatException +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:65) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:580) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:615) +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:33) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,Java遇到异常时即退出整个应用程序。也就是说,尽管我们在代码中可以捕获多个异常,但是当一个异常发生时就会退出整个应用程序。 +\end_layout + +\begin_layout Standard +但是,ArrayIndexOutOfBoundsException、NumberFormatException、ArithmeticException都是运行时 +异常(RuntimeException),即非检查型异常 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +非检查型异常 +\end_layout + +\end_inset + +,我们在代码中其实不需要主动捕获,当异常发生时虚拟机会自动处理。虚拟机的一般处理策略是打印出异常发生时的调用栈,供程序员追查和排错。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +主动捕获运行时异常的好处是可以给终端用户更友好的错误提示 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +所有的Java异常类都是Throwable的子类,Throwable类的下列方法能够帮助我们更详细的了解异常的情况: +\end_layout + +\begin_layout Itemize +printStackTrace():打印出异常发生时的调用栈(call stack),对于程序员排错特别有用,因此在catch块中经常看到调用printStac +kTrace。 +\end_layout + +\begin_layout Itemize +getMessage():返回描述异常的一个字符串,对于终端用户更友好一些。但是,默认情况下,getMessage返回的就是stackTrace的内容。因此,调 +用此方法显得更友好的前提条件是,在创建异常对象时设置了描述异常的字符串,通常在用户自定义异常中使用,参见: +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:用户自定义异常" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +现代的IDE,包括Idea、NetBeans、Eclipse都能够自动检测代码是否应该捕获异常,因此无需记忆哪些代码应该使用try...catch结构包围起来,大部分 +情况下遵从IDE的建议即可。但是,有的时候也需要手工组织一下异常处理的代码层次。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +抛出异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:抛出异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:捕获异常" + +\end_inset + +中,我们捕获(catch)的异常是从哪里来的呢?或者说,我们为什么能够捕获到异常 +\begin_inset Foot +status open + +\begin_layout Plain Layout +通常,我们说捕获异常即捕获异常对象的意思,下文不再区分这两者的差异。 +\end_layout + +\end_inset + +?异常对象是谁创建的呢? +\end_layout + +\begin_layout Standard +异常对象当然不是从石头缝里蹦出来的。事实上,我们之所以能够捕获某个异常对象,是因为在try代码块中的某个方法抛出 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抛出 +\end_layout + +\end_inset + +( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +throw +\end_layout + +\end_inset + +throw)了异常对象,即某个方法在运行中探测到发生了异常状况,因此创建了异常对象并抛出。 +\end_layout + +\begin_layout Example +抛出异常示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:抛出异常示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Example.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/Example.java" +lstparams "float,caption={Example.java},label={Example.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Example结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +就是这么二! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在add方法中,我们故意制造了一个异常:当给定的参数是2时就抛出异常(throw new Exception())。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +所谓抛出异常,就是创建异常对象,通过throw关键字抛出即可 +\end_layout + +\end_inset + +,所以抛出异常的的表达方式通常是: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if(something bad happened) { +\end_layout + +\begin_layout Plain Layout + + throw new SomethingBadException(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +由于在add方法中我们可能抛出异常,因此add方法必须声明抛出了哪些类型的异常,通过throws关键字列出在方法的参数列表后面: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void add(int val) throws Exception {... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +add方法在f方法中被调用,但是f方法并没有捕获add方法抛出的异常,因此f方法也必须在方法中声明抛出异常: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void f() throws Exception {... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在main方法中我们捕获了f方法中抛出的异常(其实是add方法抛出的异常),因此main方法就不需要抛出异常了。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:抛出异常和捕获异常的关系" + +\end_inset + +形象的表达了抛出异常和捕获异常的联系,图中灰色代码由于异常的关系没有执行到。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/throw-catch-exmaple.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抛出异常和捕获异常的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:抛出异常和捕获异常的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +翻一下JDK的源代码,也许有助于深刻理解Java的异常处理机制。比如 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里寻找一个合适易懂的Java源代码,在:http://hg.openjdk.java.net/jdk10/jdk10/jdk/file/777356696811 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,如果main方法中也不捕获异常,需要做怎样的代码变动? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,修改f方法捕获add方法抛出的异常。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,修改add方法,使得抛出异常部分代码为: +\end_layout + +\begin_layout Exercise +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if( val == 2 ) throw new Exception(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +则代码的其他部分应该如何修改更合理? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +可以看出,Java的异常处理其实也离不开if条件判断,比如在add方法中: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if (val == 2) +\end_layout + +\begin_layout Plain Layout + + throw new Exception("就是这么二!"); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +只不过,在Java中通过try...catch和throw机制将杂乱无章的if条件判断良好的组织起来,层次更加清晰罢了。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +要注意区分throw和throws的不同用法。throw用于在代码中创建异常对象并抛出异常,throws只是在方法中声明本方法可能抛出哪些异常。在方法中声明抛出 +了某种类型的异常,表明这个方法没有处理异常,将处理异常的责任“抛”给了方法的调用者。如果方法的调用者也不处理这个异常,则调用者同样需要throws这个异常,如此 +形成了一个异常处理的“责任链”,如下图所示。 +\end_layout + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/exception/exception-chain.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout +可以想见,main方法是我们程序员处理异常的最后“关口”,即如果我们在main方法中也不处理(捕获)异常的话,main方法同样需要声明throws这些异常。ma +in方法抛出的异常就只有java虚拟机可以处理了,这通常不是一个好的习惯,因为Java虚拟机只能按照默认的异常处理方式打印出调用栈,在终端用户看来,调用栈没有任 +何价值,徒增抱怨而已。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +finally +\begin_inset CommandInset label +LatexCommand label +name "sec:finally" + +\end_inset + + +\end_layout + +\begin_layout Standard +try-catch结构完美的诠释了异常处理的一般过程,不过我们考虑一种特殊情况:如果我们希望在执行完try代码块之后总是执行一段代码(不妨称之为“清理代码块”) +,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +无论try代码块是否存在异常,清理代码块总是要执行的 +\end_layout + +\end_inset + +。finally即为此而设置,一般结构为: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 正常流程 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程1 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程2 +\end_layout + +\begin_layout Plain Layout + +} finally { +\end_layout + +\begin_layout Plain Layout + + // 清理代码块 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在网络通讯和数据库编程中,这种情形很常见:无论是否发生异常,网络链接和数据库链接总是要断开的(close),因此很适合在finally代码块中处理断开网络链接和 +数据库链接。我们在也将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "chap:Java的IO" + +\end_inset + +看到很多finally使用的实例。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:try-with-resources" + +\end_inset + +我们可以看到,使用try with resources技术可以避免使用finally,这样即简化了代码,也提高了代码的可读性,值得提倡。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写一个包含finally的程序,说明即使发生了异常,finally代码块也是会被执行到的。 +\end_layout + +\begin_layout Section +用户自定义异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:用户自定义异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +异常类代表了一种异常的类型,自然我们也可以根据实际的业务逻辑自定义异常类,通常是从Exception类继承下来即可。比如在电子商务的业务流程中,“下订单”的过程 +可能会遇到以下的异常情况 +\begin_inset Foot +status open + +\begin_layout Plain Layout +在真实的电子商务系统中,往往会采取更为灵活的方式处理下订单时的此类异常,这里仅为简化后的情形。 +\end_layout + +\end_inset + +: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +写出完整的例子,演示抛出异常和catch多种异常的情形,也演示getMessage的好处 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +库存不足:所订购的商品没有及时付款,提交订单时库存不足了,导致提交失败。我们定义这种异常为OutOfInventoryException。 +\end_layout + +\begin_layout Itemize +价格变更:提交订单时商品的价格已经改变了,此时应该阻止提交订单。我们定义这种异常为PriceNotAvailableException。 +\end_layout + +\begin_layout Standard +首先我们定义这两个异常类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "OutOfIventoryException.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PriceNotAvailableException.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/OutOfInventoryException.java" +lstparams "float,caption={OutOfIventoryException.java},label={OutOfIventoryException.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/PriceNotAvailableException.java" +lstparams "float,caption={PriceNotAvailableException.java},label={PriceNotAvailableException.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在主类CustomerOrder.java中,我们设置了两个变量inventoryOK和priceOK分别代表库存和价格的状态,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CustomerOrder.java" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +。读者可以尝试修改这两个变量的值观察输出有什么变化?当然,在实际情况中,应该是根据业务逻辑给这两个变量赋值的。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/CustomerOrder.java" +lstparams "caption={CustomerOrder.java},label={CustomerOrder.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea IDE中,可以通过快捷键Alt+Insert方便的自动产生OutOfInventoryException的构造方法:选择 +\begin_inset Quotes erd +\end_inset + +override method... +\begin_inset Quotes erd +\end_inset + +,在随后弹出的窗口中选择 +\begin_inset Quotes erd +\end_inset + +Exception(s:String)”即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +try with resources +\begin_inset CommandInset label +LatexCommand label +name "sec:try-with-resources" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +比较困难的一个地方是,在这里讲解try-with-resources很难举出一个合适的例子来。是否把这个部分移动到java io一章? +\end_layout + +\end_inset + +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:finally" + +\end_inset + +中我们看到,对于必须执行的“清理代码块”,我们可以使用finally来保证这一点。Java8更进了一步:如果一个对象实现了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +java.lang.AutoCloseable +\end_layout + +\end_inset + +接口 +\begin_inset Foot +status open + +\begin_layout Plain Layout +由于AutoCloseable接口只有一个抽象方法close,因此AutoCloseable接口是一个函数接口,参见本系列教程的“提高篇”之“lambda表达式 +”。 +\end_layout + +\end_inset + +或者Closeable接口(这样的对象就是try-with-resources中的resource),则可以通过try-with-resources结构来保证代 +码结束时自动关闭这个对象。实现了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +java.lang.AutoCloseable +\end_layout + +\end_inset + +接口(或者Closeable接口)的对象被称为resource。try-with-resources结构的一般形式如下 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +本部分示例代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html +\end_layout + +\end_inset + +,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "chap:Java的IO" + +\end_inset + +看到比较多的try-with-resources用法。 +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try (resourse1; resource2) { +\end_layout + +\begin_layout Plain Layout + + // 正常流程 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比如下面的例子读取文件的第一行: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static String readFirstLineFromFile(String path) throws IOException { +\end_layout + +\begin_layout Plain Layout + + try (BufferedReader br = new BufferedReader(new FileReader(path))) { +\end_layout + +\begin_layout Plain Layout + + return br.readLine(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +BufferedReader是一个实现了AutoCloseable接口的resource(资源),因此我们把创建BufferedReader对象的工作放到了tr +y-with-resources结构中,这样无论br.readLine是否正常执行,当try-with-resources代码块执行完毕后,BufferedRea +der对象br都会被自动关闭。如果我们不使用try-with-resources结构的话,则需要这样编写同样功能的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static String readFirstLineFromFileWithFinallyBlock(String path) throws + IOException { +\end_layout + +\begin_layout Plain Layout + + BufferedReader br = new BufferedReader(new FileReader(path)); +\end_layout + +\begin_layout Plain Layout + + try { +\end_layout + +\begin_layout Plain Layout + + return br.readLine(); +\end_layout + +\begin_layout Plain Layout + + } finally { +\end_layout + +\begin_layout Plain Layout + + if (br != null) br.close(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可见,使用try-with-resources结构不仅简化了代码,也提高了代码的可读性。 +\end_layout + +\begin_layout Standard +下面的例子在try-with-resourses中声明了多个resources: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public static void writeToFileZipFileContents(String zipFileName, +\end_layout + +\begin_layout Plain Layout + + String outputFileName) +\end_layout + +\begin_layout Plain Layout + + throws java.io.IOException { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + java.nio.charset.Charset charset = +\end_layout + +\begin_layout Plain Layout + + java.nio.charset.StandardCharsets.US_ASCII; +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Path outputFilePath = +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Paths.get(outputFileName); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + // Open zip file and create output file with +\end_layout + +\begin_layout Plain Layout + + // try-with-resources statement +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + try ( +\end_layout + +\begin_layout Plain Layout + + java.util.zip.ZipFile zf = +\end_layout + +\begin_layout Plain Layout + + new java.util.zip.ZipFile(zipFileName); +\end_layout + +\begin_layout Plain Layout + + java.io.BufferedWriter writer = +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Files.newBufferedWriter(outputFilePath, charset) +\end_layout + +\begin_layout Plain Layout + + ) { +\end_layout + +\begin_layout Plain Layout + + // Enumerate each entry +\end_layout + +\begin_layout Plain Layout + + for (java.util.Enumeration entries = +\end_layout + +\begin_layout Plain Layout + + zf.entries(); entries.hasMoreElements();) + { +\end_layout + +\begin_layout Plain Layout + + // Get the entry name and write it to the output file +\end_layout + +\begin_layout Plain Layout + + String newLine = System.getProperty("line.separator"); +\end_layout + +\begin_layout Plain Layout + + String zipEntryName = +\end_layout + +\begin_layout Plain Layout + + ((java.util.zip.ZipEntry)entries.nextElement()).getName() + +\end_layout + +\begin_layout Plain Layout + + newLine; +\end_layout + +\begin_layout Plain Layout + + writer.write(zipEntryName, 0, zipEntryName.length()); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +使用try-with-resources结构编写数据库访问程序: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public static void viewTable(Connection con) throws SQLException { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + try (Statement stmt = con.createStatement()) { +\end_layout + +\begin_layout Plain Layout + + ResultSet rs = stmt.executeQuery(query); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + while (rs.next()) { +\end_layout + +\begin_layout Plain Layout + + String coffeeName = rs.getString("COF_NAME"); +\end_layout + +\begin_layout Plain Layout + + int supplierID = rs.getInt("SUP_ID"); +\end_layout + +\begin_layout Plain Layout + + float price = rs.getFloat("PRICE"); +\end_layout + +\begin_layout Plain Layout + + int sales = rs.getInt("SALES"); +\end_layout + +\begin_layout Plain Layout + + int total = rs.getInt("TOTAL"); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + System.out.println(coffeeName + ", " + supplierID + ", " + +\end_layout + +\begin_layout Plain Layout + + price + ", " + sales + ", " + total); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } catch (SQLException e) { +\end_layout + +\begin_layout Plain Layout + + JDBCTutorialUtilities.printSQLException(e); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +异常处理的一般原则?举例说明,有很多种处理异常的方式,哪种更合理?谁来处理异常?throw or catch? +\end_layout + +\begin_layout Plain Layout +如何知道该捕获哪个异常? +\end_layout + +\begin_layout Plain Layout +图示责任链 +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture9.lyx b/guide/lecture_guide/lecture9.lyx new file mode 100644 index 0000000..0f0c791 --- /dev/null +++ b/guide/lecture_guide/lecture9.lyx @@ -0,0 +1,3143 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass ctex-book +\begin_preamble +\input{../../../writing-common/book-preamble.tex} +\end_preamble +\use_default_options true +\begin_modules +tip-inset +note-inset +warning-inset +theorems-bytype +theorems-chap-bytype +logicalmkup +coderemarks +\end_modules +\maintain_unincluded_children false +\begin_local_layout +PackageOptions url hyphens +\end_local_layout +\language chinese-simplified +\language_package default +\inputencoding utf8-plain +\fontencoding global +\font_roman "default" "DejaVu Sans" +\font_sans "default" "DejaVu Serif" +\font_typewriter "default" "DejaVu Sans Mono" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts true +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf4 +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement tbph +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 3 +\pdf_breaklinks true +\pdf_pdfborder true +\pdf_colorlinks false +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\boxbgcolor #dad3d7 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\align center + +\size larger +\bar under +山东理工大学教案 +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +第九次课 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +教学课型:理论课□√ 实验课□√ 习题课□ 实践课□ 技能课□ 其它□ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +主要教学内容 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:finally" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:finally" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:用户自定义异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:用户自定义异常" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:try-with-resources" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand nameref +reference "sec:try-with-resources" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +重点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +完整的Java异常处理形式; +\end_layout + +\begin_layout Enumerate +用户自定义异常的方法和原则; +\end_layout + +\begin_layout Enumerate +try with resources的应用场合; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +难点 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +用户自定义异常和JDK内置的异常类的关系; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +课程目标及要求 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +课程目标:课程目标1 +\end_layout + +\begin_layout Plain Layout +要求: +\end_layout + +\begin_layout Enumerate +熟练掌握Java异常处理的完整形式; +\end_layout + +\begin_layout Enumerate +深刻理解用户自定义异常的使用场合,注意和JDK内置异常类的对比; +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +教学方法和手段 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +板书和多媒体相结合,边讲边练,当堂消化。 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +讨论、思考题 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "60col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Enumerate +什么情况下 使用JDK内置的异常类,什么情况下需要用户自定义异常? +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +参考资料 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Chapter +异常处理 +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename ../imgs/exception/exception-vym.png + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Section +异常的概念 +\begin_inset CommandInset label +LatexCommand label +name "sec:异常的概念" + +\end_inset + + +\end_layout + +\begin_layout Standard +“人生不如意事十之八九” +\begin_inset Foot +status open + +\begin_layout Plain Layout +南宋词人辛弃疾词《贺新郎·用前韵再赋》:“叹人生、不如意事,十常八九。” +\end_layout + +\end_inset + +,编程同样道理:世事纷繁复杂,情况千变万化,代码要正确运行,不仅要处理正常的流程,更要处理多样化的非正常流程。比如常见的情形: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +举例说明异常流程之多样化 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +街头的投币电话,总有人尝试用游戏币看看能不能蒙混过关; +\end_layout + +\begin_layout Itemize +长城的古砖墙是为御敌而生,却被人刻上“到此一游”; +\end_layout + +\begin_layout Itemize +机动车道上的行人,人行道上的机动车; +\end_layout + +\begin_layout Standard +回到现实的程序中,在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:日期和时间类" + +\end_inset + +中,我们看到日期和时间类都定义了一个parse方法,能够将字符串解析为LocalDate、LocalTime或者LocalDateTime对象,很直观,很方便, +因此在编程实践中很常见。试运行下面的示例: +\end_layout + +\begin_layout Example +从键盘输入字符串创建日期对象 +\begin_inset CommandInset label +LatexCommand label +name "exa:从键盘输入字符串创建日期对象" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "WhatIfNoException.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/WhatIfNoException.java" +lstparams "caption={WhatIfNoException.java},label={WhatIfNoException.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行WhatIfNoException结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100line%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +Please input date:2016-11-22 +\end_layout + +\begin_layout Plain Layout +2016-11-22 +\end_layout + +\begin_layout Plain Layout +Please input date:2016-13-22 +\end_layout + +\begin_layout Plain Layout +Exception in thread "main" java.time.format.DateTimeParseException: +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +Text '2016-13-22' could not be parsed: Invalid value for MonthOfYear (valid + values 1 - 12): 13 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +at java.time.format.DateTimeFormatter.createError( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +DateTimeFormatter.java:1920) +\end_layout + +\begin_layout Plain Layout +...... +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.WhatIfNoException.main( +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +WhatIfNoException.java:30) +\end_layout + +\begin_layout Plain Layout +Caused by: java.time.DateTimeException: Invalid value for MonthOfYear (valid + values 1 - 12): 13 +\end_layout + +\begin_layout Plain Layout +at java.time.temporal.ValueRange.checkValidIntValue(ValueRange +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:330) +\end_layout + +\begin_layout Plain Layout +...... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入字符串创建日期对象" + +\end_inset + +中,从键盘输入的字符串如果符合LocalDate的格式要求自然一切正常,但是我们不能总是期望人们每次输入都遵循LocalDate的格式,无论人们是有意还是无意, +总会有破坏规则的时候,比如输入的月份大于12、天数大于31等。显然,错误的输入是无法获得正确的LocalDate对象的,Java编译器也无法自动纠正这种类型的错 +误。对于这种情况,Java友好的给出了错误的原因及其关联的程序代码(stack trace),以帮助程序员快速定位错误代码的位置,更快的修复问题。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +实际上,类似 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:从键盘输入字符串创建日期对象" + +\end_inset + +的错误提示方式,对于程序员而言是友好的,但是对于终端用户而言是不友好的:终端用户并不关心程序哪一行出错了。对于终端用户而言,程序应该给出更人性化的提示,比如提示 +“日期格式有错误,月份应该在1-12之间”等等。我们将在 +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:Java的异常处理方式" + +\end_inset + +中介绍如何更人性化的处理。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +C中的异常处理方式 +\begin_inset CommandInset label +LatexCommand label +name "sec:C中的异常处理方式" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们先回顾一下在C语言中如何判断用户的输入是否合法,大致应该是如下的代码片段: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if(month < 1 || month > 12) { +\end_layout + +\begin_layout Plain Layout + + printf("wrong month num:%d",month); +\end_layout + +\begin_layout Plain Layout + + return -1; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +if(day < 1 || day > 31) { /* 没有考虑二月份情况 */ +\end_layout + +\begin_layout Plain Layout + + printf("wrong day num:%d",day); +\end_layout + +\begin_layout Plain Layout + + return -1; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +... +\end_layout + +\begin_layout Plain Layout + +/* 用户的输入合法,下面继续处理正常流程 */ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +也就是说,我们只能通过一系列的if条件判断来分析用户的输入是否合法,如果可能的异常情形比较多,势必会存在更多的if条件判断,造成程序的流程不清晰:哪些是正常流程 +处理代码,哪些是异常流程处理代码,除非通过注释标识出来,否则很难一眼看清楚。 +\end_layout + +\begin_layout Section +Java的异常处理方式 +\begin_inset CommandInset label +LatexCommand label +name "sec:Java的异常处理方式" + +\end_inset + + +\end_layout + +\begin_layout Standard +当然,在Java中我们依然可以像C语言那样去处理异常 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +异常 +\end_layout + +\end_inset + +。不过,Java提供了更棒的异常处理机制:将异常情况抽象为异常对象 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +异常对象 +\end_layout + +\end_inset + +,并采用责任链 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +责任链 +\end_layout + +\end_inset + +处理机制处理异常对象。 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这部分讲的不清楚 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java内置了常见的异常类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/exception-overview.eps + width 100col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java的异常类层次结构 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java的异常类层次结构" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +当异常情况出现时,Java虚拟机能够“捕获 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +捕获 +\end_layout + +\end_inset + +” +\begin_inset Note Note +status open + +\begin_layout Plain Layout +如何捕获?如何感知?这里可能是许多初学者迷惑的地方。 +\end_layout + +\end_inset + +(catch) +\begin_inset Foot +status open + +\begin_layout Plain Layout +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + +了解Java应用程序和Java虚拟机之间的关系,感性认识Java虚拟机是如何捕获异常的。 +\end_layout + +\end_inset + +异常对象,并根据异常对象的类型进行相应的处理。Java将异常类分为两大类: +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +非检查型异常 +\end_layout + +\end_inset + +非检查型异常:即Java虚拟机能够 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +自动 +\end_layout + +\end_inset + +处理的异常类型。换言之,这种类型的异常不需要在程序中捕获,一旦发生这种类型的异常,Java虚拟机有一套内置的处理方式,比如除数为零、数组越界、非法参数等异常类型 +。对应于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +,Error和RuntimeException的子类都是非检查型异常。在程序中可以不捕获非检查型异常,也可以捕获非检查型异常。捕获非检查型异常的目的往往是给用户 +提供更友好的出错提示,但这不是强制的。 +\end_layout + +\begin_layout Itemize +\begin_inset Index idx +status open + +\begin_layout Plain Layout +检查型异常 +\end_layout + +\end_inset + +检查型异常:即Java虚拟机无法自动处理的异常类型,需要在程序中捕获(catch)。对应于 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java的异常类层次结构" + +\end_inset + +,ClassNotFoundException和IOException的子类都是检查型异常。要注意的是,检查型异常是必须捕获的,否则会导致语法错误,因此在程序中 +捕获检查型异常是强制的。 +\end_layout + +\begin_layout Section +捕获异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:捕获异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +我们首先简单回顾一下Java虚拟机和Java应用程序的关系,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/jvm-java.eps + width 80line% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +Java虚拟机和Java应用程序的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:Java虚拟机和Java应用程序的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Java应用程序编译为class文件后,经过Java虚拟机的类加载器解析class文件在内存中创建相应的存储模型然后执行该应用程序。也就是说,Java虚拟机完全 +掌控Java应用程序的执行过程,包括应用程序出现异常情况时。Java通过如下的程序结构捕获异常: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 一段可能存在SomeException类型异常的代码 +\end_layout + +\begin_layout Plain Layout + +} catch (SomeException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在try块中的代码就是所谓的“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +正常流程 +\end_layout + +\end_inset + +”,在catch块中的代码就是所谓的“ +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +异常流程 +\end_layout + +\end_inset + +”。如果异常流程有多种,就存在多个catch块: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 一段可能存在SomeException类型异常的代码 +\end_layout + +\begin_layout Plain Layout + +} catch (SomeException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} catch (OtherException e) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} catch (FooException e ) { +\end_layout + +\begin_layout Plain Layout + + e.printStackTrace(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +对比C语言中使用if...else结构的异常处理方式,Java的try...catch更清晰的区分了正常流程和异常流程:通过不同的异常类也清晰的表达了异常的类型,甚至无需借 +助注释,只是根据异常类的名字,我们也很容易判断异常的类型及其大致的处理方式。 +\end_layout + +\begin_layout Example +捕获异常 +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "DivTest.java" + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/DivTest.java" +lstparams "float,caption={DivTest.java},label={DivTest.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +此例的运行需要配置命令行参,配置方法参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:如何设置命令行参数?" + +\end_inset + + +\end_layout + +\begin_layout Standard +当命令行参数为“24 3”时的输出结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +您输入的两个数相除的结果是: 8 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24 3.5”可以看到输出变为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数字格式异常,程序只能接受整数形式的参数 +\end_layout + +\begin_layout Plain Layout +java.lang.NumberFormatException: For input string: "3.5" +\end_layout + +\begin_layout Plain Layout +at java.lang.NumberFormatException.forInputString(NumberFormatException +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:65) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:580) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:615) +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:34) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24 0”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +算数异常,除数不能为0 +\end_layout + +\begin_layout Plain Layout +java.lang.ArithmeticException: / by zero +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:35) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数组越界,运行程序时输入的参数个数不对。应该输入2个参数,您输入的参数个数是:1 +\end_layout + +\begin_layout Plain Layout +java.lang.ArrayIndexOutOfBoundsException: 1 +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:34) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +修改命令行参数为“24.5”,输出结果为: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +数字格式异常,程序只能接受整数形式的参数 +\end_layout + +\begin_layout Plain Layout +java.lang.NumberFormatException: For input string: "24.5" +\end_layout + +\begin_layout Plain Layout +at java.lang.NumberFormatException.forInputString(NumberFormatException +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +hspace{0pt} +\end_layout + +\end_inset + +.java:65) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:580) +\end_layout + +\begin_layout Plain Layout +at java.lang.Integer.parseInt(Integer.java:615) +\end_layout + +\begin_layout Plain Layout +at cn.edu.sdut.softlab.exception.DivTest.main(DivTest.java:33) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +可以看出,Java遇到异常时即退出整个应用程序。也就是说,尽管我们在代码中可以捕获多个异常,但是当一个异常发生时就会退出整个应用程序。 +\end_layout + +\begin_layout Standard +但是,ArrayIndexOutOfBoundsException、NumberFormatException、ArithmeticException都是运行时 +异常(RuntimeException),即非检查型异常 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +非检查型异常 +\end_layout + +\end_inset + +,我们在代码中其实不需要主动捕获,当异常发生时虚拟机会自动处理。虚拟机的一般处理策略是打印出异常发生时的调用栈,供程序员追查和排错。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +主动捕获运行时异常的好处是可以给终端用户更友好的错误提示 +\end_layout + +\end_inset + +。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +所有的Java异常类都是Throwable的子类,Throwable类的下列方法能够帮助我们更详细的了解异常的情况: +\end_layout + +\begin_layout Itemize +printStackTrace():打印出异常发生时的调用栈(call stack),对于程序员排错特别有用,因此在catch块中经常看到调用printStac +kTrace。 +\end_layout + +\begin_layout Itemize +getMessage():返回描述异常的一个字符串,对于终端用户更友好一些。但是,默认情况下,getMessage返回的就是stackTrace的内容。因此,调 +用此方法显得更友好的前提条件是,在创建异常对象时设置了描述异常的字符串,通常在用户自定义异常中使用,参见: +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:用户自定义异常" + +\end_inset + +。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +现代的IDE,包括Idea、NetBeans、Eclipse都能够自动检测代码是否应该捕获异常,因此无需记忆哪些代码应该使用try...catch结构包围起来,大部分 +情况下遵从IDE的建议即可。但是,有的时候也需要手工组织一下异常处理的代码层次。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +抛出异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:抛出异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:捕获异常" + +\end_inset + +中,我们捕获(catch)的异常是从哪里来的呢?或者说,我们为什么能够捕获到异常 +\begin_inset Foot +status open + +\begin_layout Plain Layout +通常,我们说捕获异常即捕获异常对象的意思,下文不再区分这两者的差异。 +\end_layout + +\end_inset + +?异常对象是谁创建的呢? +\end_layout + +\begin_layout Standard +异常对象当然不是从石头缝里蹦出来的。事实上,我们之所以能够捕获某个异常对象,是因为在try代码块中的某个方法抛出 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +抛出 +\end_layout + +\end_inset + +( +\begin_inset Index idx +status open + +\begin_layout Plain Layout +throw +\end_layout + +\end_inset + +throw)了异常对象,即某个方法在运行中探测到发生了异常状况,因此创建了异常对象并抛出。 +\end_layout + +\begin_layout Example +抛出异常示例 +\begin_inset CommandInset label +LatexCommand label +name "exa:抛出异常示例" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码设计 +\end_layout + +\begin_layout Standard +参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "Example.java" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/Example.java" +lstparams "float,caption={Example.java},label={Example.java}" + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +运行结果 +\end_layout + +\begin_layout Standard +运行Example结果如下: +\end_layout + +\begin_layout Standard +\begin_inset Box Shaded +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +thickness "0.4pt" +separation "3pt" +shadowsize "4pt" +framecolor "black" +backgroundcolor "none" +status open + +\begin_layout Plain Layout +就是这么二! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +代码分析 +\end_layout + +\begin_layout Standard +在add方法中,我们故意制造了一个异常:当给定的参数是2时就抛出异常(throw new Exception())。 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +所谓抛出异常,就是创建异常对象,通过throw关键字抛出即可 +\end_layout + +\end_inset + +,所以抛出异常的的表达方式通常是: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if(something bad happened) { +\end_layout + +\begin_layout Plain Layout + + throw new SomethingBadException(); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +由于在add方法中我们可能抛出异常,因此add方法必须声明抛出了哪些类型的异常,通过throws关键字列出在方法的参数列表后面: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void add(int val) throws Exception {... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +add方法在f方法中被调用,但是f方法并没有捕获add方法抛出的异常,因此f方法也必须在方法中声明抛出异常: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public void f() throws Exception {... +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在main方法中我们捕获了f方法中抛出的异常(其实是add方法抛出的异常),因此main方法就不需要抛出异常了。 +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +figurename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:抛出异常和捕获异常的关系" + +\end_inset + +形象的表达了抛出异常和捕获异常的联系,图中灰色代码由于异常的关系没有执行到。 +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement tbph +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename ../imgs/exception/throw-catch-exmaple.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +抛出异常和捕获异常的关系 +\begin_inset CommandInset label +LatexCommand label +name "fig:抛出异常和捕获异常的关系" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +翻一下JDK的源代码,也许有助于深刻理解Java的异常处理机制。比如 +\begin_inset Note Note +status open + +\begin_layout Plain Layout +这里寻找一个合适易懂的Java源代码,在:http://hg.openjdk.java.net/jdk10/jdk10/jdk/file/777356696811 +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,如果main方法中也不捕获异常,需要做怎样的代码变动? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,修改f方法捕获add方法抛出的异常。 +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Exercise +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +examplename +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "exa:抛出异常示例" + +\end_inset + +中,修改add方法,使得抛出异常部分代码为: +\end_layout + +\begin_layout Exercise +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if( val == 2 ) throw new Exception(); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +则代码的其他部分应该如何修改更合理? +\end_layout + +\begin_layout Standard +\begin_inset Separator plain +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +可以看出,Java的异常处理其实也离不开if条件判断,比如在add方法中: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +if (val == 2) +\end_layout + +\begin_layout Plain Layout + + throw new Exception("就是这么二!"); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +只不过,在Java中通过try...catch和throw机制将杂乱无章的if条件判断良好的组织起来,层次更加清晰罢了。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Notice +status open + +\begin_layout Plain Layout +要注意区分throw和throws的不同用法。throw用于在代码中创建异常对象并抛出异常,throws只是在方法中声明本方法可能抛出哪些异常。在方法中声明抛出 +了某种类型的异常,表明这个方法没有处理异常,将处理异常的责任“抛”给了方法的调用者。如果方法的调用者也不处理这个异常,则调用者同样需要throws这个异常,如此 +形成了一个异常处理的“责任链”,如下图所示。 +\end_layout + +\begin_layout Plain Layout +\begin_inset Graphics + filename ../imgs/exception/exception-chain.eps + width 90col% + +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout +可以想见,main方法是我们程序员处理异常的最后“关口”,即如果我们在main方法中也不处理(捕获)异常的话,main方法同样需要声明throws这些异常。ma +in方法抛出的异常就只有java虚拟机可以处理了,这通常不是一个好的习惯,因为Java虚拟机只能按照默认的异常处理方式打印出调用栈,在终端用户看来,调用栈没有任 +何价值,徒增抱怨而已。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +finally +\begin_inset CommandInset label +LatexCommand label +name "sec:finally" + +\end_inset + + +\end_layout + +\begin_layout Standard +try-catch结构完美的诠释了异常处理的一般过程,不过我们考虑一种特殊情况:如果我们希望在执行完try代码块之后总是执行一段代码(不妨称之为“清理代码块”) +,即 +\begin_inset Flex Strong +status open + +\begin_layout Plain Layout +无论try代码块是否存在异常,清理代码块总是要执行的 +\end_layout + +\end_inset + +。finally即为此而设置,一般结构为: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try { +\end_layout + +\begin_layout Plain Layout + + // 正常流程 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程1 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程2 +\end_layout + +\begin_layout Plain Layout + +} finally { +\end_layout + +\begin_layout Plain Layout + + // 清理代码块 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +在网络通讯和数据库编程中,这种情形很常见:无论是否发生异常,网络链接和数据库链接总是要断开的(close),因此很适合在finally代码块中处理断开网络链接和 +数据库链接。我们在也将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "chap:Java的IO" + +\end_inset + +看到很多finally使用的实例。 +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:try-with-resources" + +\end_inset + +我们可以看到,使用try with resources技术可以避免使用finally,这样即简化了代码,也提高了代码的可读性,值得提倡。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Exercise +编写一个包含finally的程序,说明即使发生了异常,finally代码块也是会被执行到的。 +\end_layout + +\begin_layout Section +用户自定义异常 +\begin_inset CommandInset label +LatexCommand label +name "sec:用户自定义异常" + +\end_inset + + +\end_layout + +\begin_layout Standard +异常类代表了一种异常的类型,自然我们也可以根据实际的业务逻辑自定义异常类,通常是从Exception类继承下来即可。比如在电子商务的业务流程中,“下订单”的过程 +可能会遇到以下的异常情况 +\begin_inset Foot +status open + +\begin_layout Plain Layout +在真实的电子商务系统中,往往会采取更为灵活的方式处理下订单时的此类异常,这里仅为简化后的情形。 +\end_layout + +\end_inset + +: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +写出完整的例子,演示抛出异常和catch多种异常的情形,也演示getMessage的好处 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +库存不足:所订购的商品没有及时付款,提交订单时库存不足了,导致提交失败。我们定义这种异常为OutOfInventoryException。 +\end_layout + +\begin_layout Itemize +价格变更:提交订单时商品的价格已经改变了,此时应该阻止提交订单。我们定义这种异常为PriceNotAvailableException。 +\end_layout + +\begin_layout Standard +首先我们定义这两个异常类,如 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "OutOfIventoryException.java" + +\end_inset + +和 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "PriceNotAvailableException.java" + +\end_inset + +所示。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/OutOfInventoryException.java" +lstparams "float,caption={OutOfIventoryException.java},label={OutOfIventoryException.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/PriceNotAvailableException.java" +lstparams "float,caption={PriceNotAvailableException.java},label={PriceNotAvailableException.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +在主类CustomerOrder.java中,我们设置了两个变量inventoryOK和priceOK分别代表库存和价格的状态,参见 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "CustomerOrder.java" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +。读者可以尝试修改这两个变量的值观察输出有什么变化?当然,在实际情况中,应该是根据业务逻辑给这两个变量赋值的。 +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../code/exception/src/cn/edu/sdut/softlab/exception/eshop/CustomerOrder.java" +lstparams "caption={CustomerOrder.java},label={CustomerOrder.java}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +在Idea IDE中,可以通过快捷键Alt+Insert方便的自动产生OutOfInventoryException的构造方法:选择 +\begin_inset Quotes erd +\end_inset + +override method... +\begin_inset Quotes erd +\end_inset + +,在随后弹出的窗口中选择 +\begin_inset Quotes erd +\end_inset + +Exception(s:String)”即可。 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +try with resources +\begin_inset CommandInset label +LatexCommand label +name "sec:try-with-resources" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +比较困难的一个地方是,在这里讲解try-with-resources很难举出一个合适的例子来。是否把这个部分移动到java io一章? +\end_layout + +\end_inset + +在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:finally" + +\end_inset + +中我们看到,对于必须执行的“清理代码块”,我们可以使用finally来保证这一点。Java8更进了一步:如果一个对象实现了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +java.lang.AutoCloseable +\end_layout + +\end_inset + +接口 +\begin_inset Foot +status open + +\begin_layout Plain Layout +由于AutoCloseable接口只有一个抽象方法close,因此AutoCloseable接口是一个函数接口,参见本系列教程的“提高篇”之“lambda表达式 +”。 +\end_layout + +\end_inset + +或者Closeable接口(这样的对象就是try-with-resources中的resource),则可以通过try-with-resources结构来保证代 +码结束时自动关闭这个对象。实现了 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +java.lang.AutoCloseable +\end_layout + +\end_inset + +接口(或者Closeable接口)的对象被称为resource。try-with-resources结构的一般形式如下 +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +本部分示例代码参见: +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html +\end_layout + +\end_inset + +,我们将在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +sectionname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "chap:Java的IO" + +\end_inset + +看到比较多的try-with-resources用法。 +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +try (resourse1; resource2) { +\end_layout + +\begin_layout Plain Layout + + // 正常流程 +\end_layout + +\begin_layout Plain Layout + +} catch (...) { +\end_layout + +\begin_layout Plain Layout + + // 异常流程 +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +比如下面的例子读取文件的第一行: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static String readFirstLineFromFile(String path) throws IOException { +\end_layout + +\begin_layout Plain Layout + + try (BufferedReader br = new BufferedReader(new FileReader(path))) { +\end_layout + +\begin_layout Plain Layout + + return br.readLine(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +BufferedReader是一个实现了AutoCloseable接口的resource(资源),因此我们把创建BufferedReader对象的工作放到了tr +y-with-resources结构中,这样无论br.readLine是否正常执行,当try-with-resources代码块执行完毕后,BufferedRea +der对象br都会被自动关闭。如果我们不使用try-with-resources结构的话,则需要这样编写同样功能的代码: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +static String readFirstLineFromFileWithFinallyBlock(String path) throws + IOException { +\end_layout + +\begin_layout Plain Layout + + BufferedReader br = new BufferedReader(new FileReader(path)); +\end_layout + +\begin_layout Plain Layout + + try { +\end_layout + +\begin_layout Plain Layout + + return br.readLine(); +\end_layout + +\begin_layout Plain Layout + + } finally { +\end_layout + +\begin_layout Plain Layout + + if (br != null) br.close(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +可见,使用try-with-resources结构不仅简化了代码,也提高了代码的可读性。 +\end_layout + +\begin_layout Standard +下面的例子在try-with-resourses中声明了多个resources: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public static void writeToFileZipFileContents(String zipFileName, +\end_layout + +\begin_layout Plain Layout + + String outputFileName) +\end_layout + +\begin_layout Plain Layout + + throws java.io.IOException { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + java.nio.charset.Charset charset = +\end_layout + +\begin_layout Plain Layout + + java.nio.charset.StandardCharsets.US_ASCII; +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Path outputFilePath = +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Paths.get(outputFileName); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + // Open zip file and create output file with +\end_layout + +\begin_layout Plain Layout + + // try-with-resources statement +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + try ( +\end_layout + +\begin_layout Plain Layout + + java.util.zip.ZipFile zf = +\end_layout + +\begin_layout Plain Layout + + new java.util.zip.ZipFile(zipFileName); +\end_layout + +\begin_layout Plain Layout + + java.io.BufferedWriter writer = +\end_layout + +\begin_layout Plain Layout + + java.nio.file.Files.newBufferedWriter(outputFilePath, charset) +\end_layout + +\begin_layout Plain Layout + + ) { +\end_layout + +\begin_layout Plain Layout + + // Enumerate each entry +\end_layout + +\begin_layout Plain Layout + + for (java.util.Enumeration entries = +\end_layout + +\begin_layout Plain Layout + + zf.entries(); entries.hasMoreElements();) + { +\end_layout + +\begin_layout Plain Layout + + // Get the entry name and write it to the output file +\end_layout + +\begin_layout Plain Layout + + String newLine = System.getProperty("line.separator"); +\end_layout + +\begin_layout Plain Layout + + String zipEntryName = +\end_layout + +\begin_layout Plain Layout + + ((java.util.zip.ZipEntry)entries.nextElement()).getName() + +\end_layout + +\begin_layout Plain Layout + + newLine; +\end_layout + +\begin_layout Plain Layout + + writer.write(zipEntryName, 0, zipEntryName.length()); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +使用try-with-resources结构编写数据库访问程序: +\end_layout + +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public static void viewTable(Connection con) throws SQLException { +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + try (Statement stmt = con.createStatement()) { +\end_layout + +\begin_layout Plain Layout + + ResultSet rs = stmt.executeQuery(query); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + while (rs.next()) { +\end_layout + +\begin_layout Plain Layout + + String coffeeName = rs.getString("COF_NAME"); +\end_layout + +\begin_layout Plain Layout + + int supplierID = rs.getInt("SUP_ID"); +\end_layout + +\begin_layout Plain Layout + + float price = rs.getFloat("PRICE"); +\end_layout + +\begin_layout Plain Layout + + int sales = rs.getInt("SALES"); +\end_layout + +\begin_layout Plain Layout + + int total = rs.getInt("TOTAL"); +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + System.out.println(coffeeName + ", " + supplierID + ", " + +\end_layout + +\begin_layout Plain Layout + + price + ", " + sales + ", " + total); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } catch (SQLException e) { +\end_layout + +\begin_layout Plain Layout + + JDBCTutorialUtilities.printSQLException(e); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +异常处理的一般原则?举例说明,有很多种处理异常的方式,哪种更合理?谁来处理异常?throw or catch? +\end_layout + +\begin_layout Plain Layout +如何知道该捕获哪个异常? +\end_layout + +\begin_layout Plain Layout +图示责任链 +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/guide/lecture_guide/lecture_guide.lyx b/guide/lecture_guide/lecture_guide.lyx index 2c232be..7768fff 100644 --- a/guide/lecture_guide/lecture_guide.lyx +++ b/guide/lecture_guide/lecture_guide.lyx @@ -269,6 +269,86 @@ filename "lecture7.lyx" \end_inset +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture8.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture9.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture10.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture11.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture12.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture13.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture14.lyx" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "lecture15.lyx" + +\end_inset + + \end_layout \begin_layout Standard diff --git a/guide/lecture_guide/make_lecture.sh b/guide/lecture_guide/make_lecture.sh new file mode 100755 index 0000000..e031a3a --- /dev/null +++ b/guide/lecture_guide/make_lecture.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +lyx --export pdf4 lecture_guide.lyx From 399a4fab4aabc9beffcbdcd0981de27f7e20918b Mon Sep 17 00:00:00 2001 From: subaochen Date: Tue, 27 Oct 2020 09:01:59 +0800 Subject: [PATCH 6/8] pdf version of ppt --- guide/ppt/enum.lyx | 14 +++++--------- guide/ppt/enum.pdf | Bin 0 -> 70727 bytes guide/ppt/essentails.pdf | Bin 0 -> 135242 bytes guide/ppt/exception.pdf | Bin 0 -> 403901 bytes guide/ppt/gui.pdf | Bin 0 -> 450148 bytes guide/ppt/io.lyx | 4 ++-- guide/ppt/io.pdf | Bin 0 -> 36473 bytes guide/ppt/oop.pdf | Bin 0 -> 106950 bytes guide/ppt/oopm.pdf | Bin 0 -> 168704 bytes guide/ppt/verybasic.pdf | Bin 0 -> 81249 bytes 10 files changed, 7 insertions(+), 11 deletions(-) create mode 100644 guide/ppt/enum.pdf create mode 100644 guide/ppt/essentails.pdf create mode 100644 guide/ppt/exception.pdf create mode 100644 guide/ppt/gui.pdf create mode 100644 guide/ppt/io.pdf create mode 100644 guide/ppt/oop.pdf create mode 100644 guide/ppt/oopm.pdf create mode 100644 guide/ppt/verybasic.pdf diff --git a/guide/ppt/enum.lyx b/guide/ppt/enum.lyx index f59f522..ccd58d2 100644 --- a/guide/ppt/enum.lyx +++ b/guide/ppt/enum.lyx @@ -4,7 +4,7 @@ \begin_header \save_transient_properties true \origin unavailable -\textclass beamer-chinese +\textclass beamer \begin_preamble % see http://deic.uab.es/~iblanes/beamer_gallery/ for how % to choose theme and color @@ -169,7 +169,6 @@ C的enum回顾 \end_layout -\begin_deeper \begin_layout Itemize 定义方式: \begin_inset Newline newline @@ -203,6 +202,7 @@ enum{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}WEEK; \end_layout +\begin_deeper \begin_layout Itemize 使用方法: \begin_inset Newline newline @@ -285,7 +285,6 @@ plain \end_layout -\begin_deeper \begin_layout Itemize WeekDay \begin_inset Newline newline @@ -320,7 +319,6 @@ public enum WeekDay { SUNDAY,MONDAY,TUESDAY,WENDESDAY,THURSDAY,FRIDAY,SATURDAY; \end_layout -\end_deeper \begin_layout Standard \begin_inset Separator plain \end_inset @@ -351,7 +349,6 @@ plain \end_layout -\begin_deeper \begin_layout Itemize \begin_inset Box Frameless position "t" @@ -420,7 +417,6 @@ public class WeekDayTest { \end_layout -\end_deeper \begin_layout Frame \end_layout @@ -449,11 +445,11 @@ Enum的定义要点 \end_layout -\begin_deeper \begin_layout Itemize Enum关键字 \end_layout +\begin_deeper \begin_layout Itemize 最简单的定义方法 \end_layout @@ -487,11 +483,11 @@ status open \end_layout -\begin_deeper \begin_layout Itemize Enum是类 \end_layout +\begin_deeper \begin_layout Itemize 反编译Enum对象看一下 \end_layout @@ -517,11 +513,11 @@ status open \end_layout -\begin_deeper \begin_layout Itemize 定义四季 \end_layout +\begin_deeper \begin_layout Itemize 定义交通信号灯 \end_layout diff --git a/guide/ppt/enum.pdf b/guide/ppt/enum.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9d998f826f902b16185c5d3ee72df965c2119812 GIT binary patch literal 70727 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 literal 0 HcmV?d00001 diff --git a/guide/ppt/exception.pdf b/guide/ppt/exception.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a39bad89f0c50865c45cfe022f59d36e96761efb GIT binary patch literal 403901 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

Xy}#45`+G$6}4U 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 z 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

ge7w&?qb#+q&K?Q79cLbrVa5R<3y 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�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

7JpkXD4I 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 literal 0 HcmV?d00001 diff --git a/guide/ppt/gui.pdf b/guide/ppt/gui.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e9a1b262699fe57024c772c747b7bd9b3550cb2 GIT binary patch literal 450148 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 z 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

%)J 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 s%WO` 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

6lgl9wL*Eu)8B z?tpmJW;nmko?zA*@(G7PH52*iq~8d?ewCOHX1u2WjkpcZjrg~=JFQ-d!r8T2P@kT4 zQu%S>Xca4{-?n{na;X1w^QnvJT6hrM-k21+6VJJn&XHt(B|6Kvd%CRqCOrR>FAjgy zpLb&Sr|+}6;Yy+nvU4+7(`*>}z=qPpwx+%ZjRaGZiV39bhrWKg7#q)cdCN~qQw>Y! zgVS~N9x24XHpAkJ9ZmpM{gO;@*Cx~HJG>-uLc%~iK~ z<+%PNY9$OQWM(WsF+gkgwh2@{5s>5`??g$&RBub))HdIxa#+vR&@m~^J9*P8+#h0? zTS$NRjZYWzyBs@nH= zjeefk`}HT%@drtetLA*vq0Z63I+v6F#kM>*NAM@fER!RG*Si)T7e-J=o<3+8Ql6Km&Zf|Ob_U}&%i9I3sl368IDNu@uSh@VQUW4K& z{4_ONP$#U|GNM**LMPV2@U}MDVb0y@E?>`MdJ{f`IHMn^LX0-@@psIdKf)j_9x39_ zM!90qO_mgKSPie^M9Q!C^v|jVPMe_W&R*M_95+EW-)DSXZfHK+wI(&oZd#~eb3B-I z$-7r3mSnl^snMlC^^I=F8?2{m63eW2i{cwNI?yjfndXCr4&1FSl5}+~U-}GrwI`acgJyKG|-(c@=+*h#~-skh)glSy3 ze;q-fBK+691GskMvJW_OZjdijTTsog{Gs7m?~s9@6+A>>~<&i#fb%9X~vXN z%deUCyC~P!r7hAJ=Cx;VOm$7Y9m%7JvDJxgLf0B|aec z_xkQ~k(7i46G>Dw-n4QWFz0yRoE@K@3U5F8mG|Or)Rf_I2fPfxV1)c$Zj&WCv{!U* zz{(!mBRM({mvB7R7n103{NVqh`x|!46=$DbrAj5AI`27Kd>1}U`4eG zyC8sri_YSur@x6wwMO*gv+;gjyL@d^WNCSW zh9-k;Z_rmF(?zYM6hLSEn1wTOr!7x?g-rS=wP@~Hq55D zEB*2-h$bO%7PPf$m7OZII!@T=vD(BdjDnDsH181mEGqR)@?e>L#l}W8#5}u)S<-@4 zoLBJv3Dv0Z;k-M3OdFHysqJ*T%CC20(`Z9Nh6_gDMQoJ2{SYLdQWDEsM)3E8D;5@@ zgy^IjQ|xB*Bcow)AgY2r|2nIZrlwC=4_6y^RN;<&DEBU6K%hw`0L6pxh;Pl7Tk|Q2 zjW56hk|{^3@$Ngt#wPdesJeSozNY6+^Kxy(a~|mQCbJ&37VFk69w11;UU%MQTC;4_ z?*O^inrx-Eas!N~#c}oQz$N);(s-Oke>l9)SGbZUi;Ex?A-8Zs?V)@-nt`eg&eN_k zi~x)1PvpeJ<2Ss+2WsLF#52c^T9YcmxQ4xjfbs|#-+uQ7I!N@E_hEdfOK|$arb^yGjllvIJ0_ zSItP(VNp^0E>#O$3?9=BZ{o|jI3!g;y*-OvWDK_k3s~Xs^b9m{lNVhA7ZHVhU>M{b z>qE+K8;!etfqZOP{%DCYovG~PgpYX6Ud!JS#SQ5Ayy+a;bldG9FW%lehb5FVpcjnV zmZo#rw^=9psqxX8m|RtM)8)1B%9UP+JyfjKQZQOtKF-EG)bAV|9FmffRN;|h-d94} zEzfq|fB9;dO>)0X0IxsZzj$*OUcMWqO_cAML*wXeJk~P(WU>g_=(};2 z_`y+f60jD}yEmP!B&21rCMD8>_Ezyw#&1EN{!w1t6VYkE1GzX^^@O^h#s7W*h(kJ1PPyNpX(t+C3#Bq+Nd1$$ z=eDj^b#bB_^jXXYwV(ZK;3GSWA3C-IMOs;Bw^?VBltNjHdBe^6Vw&8eGm2IqpMv#_ zysu}Imcy&(9ofMN&s@c{A~pH^q`YT@IUR_rj4C|)n+IBET*Q2pK)of4kwtrjecv(T z9fuTTf0SRgI&`CR=qyYCKO>E-00%lAAdS50gDZ}5!j2SvBc-7N)oahUDV2-&L>V%h zU3W?!9PswWXS0~;?@H4#5SPoD-tp z5iX7U`&RJcRj@G3NpH8HrvXwC3A#MCWb9zsYf7%&9jiAq)WR3E=#ECoXe_Kd{^sH_Ml|H zGS2k#*^)bdtbIx|NIV71`w(`Kvq-4LRO*;#sHcu2pq<%7ohji-IsAs=TJMHNazGU$ z_d>{o9U3Yo>YLB+joc4zgrR1jbL4OGxmd7M+4#MvZQjv!z zG(FztdfOiF>iH;vZby85-bd}ZVXi?>QN*!b5LLv8v@l|gr>jAH3@uDG9EQ<{t)nL< zh3E_q_bebmm6JHV=DUN>{z5n#S1$aiU3X>KuZ6J)lBDS6vMO=?6{8oC<5oxNtG~H9 z-`H6A)GEvF%x6FmLu+(&xW-`&{GZo`D+9`JwtH?9;h$*4*;y?7n1%=$&*0+Wpo^>5 z9xlfvyhn8IJ#ULd9(63QRUQ0u)uKMG*Go#_QO`&1kCHlM%~9iD;XaHKN4Ao*5v9&E z`TU9wqVRrZ!pV_~y~MdS`QzF|dMQ{9Jl#|38!x}`Ln$bs){;W+hx6UT28bOrIZ)=R z7{|hUvU8z#SSU(A!&?EKGuyP5_D|!&pn31Sp9srkHQ`jy(_%90OBDf2#XGs~76ovs zr{WBqaF$%SD!d)2ns4R49}&ovpLQap(Rwd^%e&PzJc|0kaJ+h0OtZxE)&poJ0eJ|^ zj?f_uZp7uHX6gjuf2xF;fZ5j;^-9Jb7uUuPX5(x+ZUjj-ly< zWgbH5;|Wp$C&2ZctsF6pJnjT}ycMGS(KFIy|xS_husRR+$Fm0IpWkJ^bg zibNMt`5V*)M3+uGdfT29!?XE*_6$o}yzQ=1ncpcQk?|mQuPQFy-AYAZ&6U&R&p&q9 zub|);o=Ckumi9C`hlZk-@5)ShDzlqjB)uw>2#E z3=BF0l~uJ^&6hfbZ)-E5@Sx@o4E)K4t47u`9Tf=7@T?jfI#9kbXI&d9A;p>`%k9sW znpapnGPhr~h+RU0B^2#MCN5^g1Or8r>w}2p`Xpo|)Q z{Fo6%eSoU2FD2C#s$B&uaqTGdKbB+Rn$YJSG_W#La=#aCEq5wID+}pob0CKGoj-XJ zY=5{mR#W7BdO%J`y;>Ys{b!Q=F>hXF8ye}pVr6kHFx2goaXlSD?Epgc`2v4Dw)pP) zwEU?WE)q{Q1$Hc{#KWItbQqSVF(Vs@Ryy!G#p)wkw2qdanx?F3lxfx->f>~xG($Ut zb`ZYEquc=HUVniAH3^mnG$7PzZ~_DNzBrxZ)&OK6RHga|ca;rP*cFp_CMYii3?)@y z1PL4!liBZ#X9y_I;o&87MvzK`=q2evM@ua<{_=oj)Nd1TqNYtE{Beh}qi1{%3hHVP z#*k0@P!A;K1qdlbsQ?EO8rnBiZg>ZSefn2$2iQ~dUD9|SLwmgcuB81t4+B^}{=3~Z zlb8T(oA?|s+hYDd_MCn(s49-a0*&x|eC^kZ3dc^6_Gq>p$0DuQWGIEi@yK6Gj^%| z|7&9|AZwAbPnVX$&Xd*`vr;S3_G3VOJ7?cRCl@wG{P|OP$8j(%BUEzcpmwZcomDmq zS;eFX=fKRrhx`{aZs)sHO%+7b<_DABg4x6*`DJ?Q1tJu6*lB9m2#Od{v+csz_9*n) zVi5dXrQCgF6DkAqm^s^yd3I=Q`H9zpKAdc00sL^w&Ghc`Kxt5EbB}6*&ch-fm*+}k z(4jK^n@26LR|87i* zU;_8s1*7TO4LNtOB0h#t>-jZDw18{6Lp?0ctNTCMVrG>3vEHXoHR*fo19|J;z=9 zBK>JU(LT(7k8&|w-wfCE;x`^&sKj}gs&u$GLV4|Z=f+okMn&z}WW6z#I4f*SzA*lc zi^;b4=PGl9_EGSn9T>}1UD;kdPj32Q@SA8>^l^u=QtoqYNfkA4U9ZN6mEXS9$dO{S zp-l|n8Z#D~l9ZEyOH&N6qN&6Brm6e_A-Em<@&$0gJQ}y}6U(Fi8$uWyS@;6NiJ@XG zcV#l%boD1+H@EMxkQS%)o>W(vn7yqPHfVnfc~Pw8kyMUU8~+as3iuq(#!Vqs^g#lh>)K7zQEJOn+HsFP5VD?k2Za&}EXJe?u-`7HA&1ngLYg!@ z%V4WRywPmENGBoZ>>ywu<)evzKj(h?P8p)L#u%bJ%zJ zv?Z~NaPOBUV$7IlCm<@cwxPb`WA&2d+jLq8Q7iic(vj`w0=wJfzc|V9Le{PWTZB0~ zov#+B2UcMLuV|jM>u57u%*8V+@!1>@Tj{M_x1Q_Rt+kV7;#@-A+Q>)kd&g9NULKZx zt9Dfnl(RSVb_*hBKhUdhbNIY@?KU}l`T|lZ;GmThR`{gQ@RsnZKk3Gb{RLHt6m4nE zZyBwjx0N-EuBNwp*V>-n;fVhvt}O}Rk&bWIPRgg$E!Xt76sBRZvcfcs;zySV^CrDa zqAoT$tv3o27I|4`6hN50`SX5|G<=`)eq8Zfx|Qxmw8}{F#3{%RBk_*SsdF9Iv&~GK z85bdykz<8oD8{~zb5-(3DC%)Bp0#)m1H@I|Zf?W2^Eq&ZjMm6M?7%G^LMjo&dE(EA zwmDM8YiHQ*jxyCoK}W13rVU|BscPTk2((@%D6d@=C*F{1Y}VVO;ngh}1%iX=_@vj_ zj5fE~`OXqR#>LY4N~OiP>^^-MxuJQfEGy29Df9N5F-?3T4XK?+h{i;cp*!PnYzN|+m;FL_Hfsq~^Y!uM48O$L zL5|!1ZG9X;UaQ5ZRZCm-fNm>?$h;6kT2ZlqOMvBtl$6r#$w|~n)!#T<<9LfYZwJ11 zRgWDOSA8(%+h9bM3l7kmVJ@tch6rBVyP{8Y6t7B%H`h&sU931G`+f;xayjHj{ zp6kogsv(|?;@xOZqddLSJgHWj0#CXwY@AIkirCc~bd^F|Nk<>FFJ?{qY#R4BEwaP- zc`|4F;Ryn3^~Qf_T{ILG5lB;5BU(3XT%;|R0OHwRf?$(sDKGlCdo*n*rhq25(~QDG z6~+)w6;n=3#Zg;~#{eE=;;>f{ly+bCpI{Ll?a8a}B=Y+x?~BDEZRu$=^Xc;53lLkj zUz~l$An$aWEMjlE)!uWxA4F{y^QYKdxQS|;6v*ZsubpfkV!gLYQ3_~~@j>F$wtx|0 zi(VZ!Weyth&c>a2mWCO|H_=_+E8`(3(M*SuROcA6RmS@fP%!cx8FV^;NK@iJIscEj z0I(S5=s&`{u zv%=lWPQ)AHG&y65eP+#?WP;y^TV;d}`^c@Eq&Kq#j;^yiWCu5}^`Gh6#)69u%oRb?)LM0>{6;K@jeKH9Dr_hB6z;?y5&{<1+75>>1b zgOVBndz910msichp}U_YDUG5y^=Qm>=e=c+N(!zPQg`3v3EPPDLT>Q(zQfCkd7Jp$ ztPLh_6M7_f>P=x7aDT2xO>om1UL8^@4T3U3&%X|0*nPW_p=OU!*l5TFkeg6^5|t_j z#f+t*iiHS%i_;p5xj)<92rE`ggg~|abpXt}yR8DTr|;H2WKj1;&hg;c?YL+l8|4?BY)I206o17=*T%d3BMBp41r z`t8~*EwvD&9}`?`%@5YrSO1d0!UmmkgWrQg9RuByOJ@ked0j~MlFe7{1RwReBqbap ze2tp0&&RUr0h99o0@~z6EE?5}dz=>p(?d5$X{iZH4QzasmvMIq0`7J%D^|MF6BznK z*gSq$dGE3r)$g+G-}Ya_^2$TI7^38N4}RX;2a$$yqV0C9-*>e;5%147+d?WV*(;C!Lo{ z;F{Wq=JRgO`)YIM@N2Bv%9X%MlVvQ8p`)SPM3c?~R-@o%LVQes?X4Xwj ze*Zp9Cd9`ZDZHiV_oTItCUEmwBg9suRzrJ*Qdy*wcV>8hR9W(?MOn2agpDFpkcu1$ zJ&)Y$`M()$V72HBXh)mK@^o8YrxHqaxH~drUrqv*lUd!X;Kbhv6ybe7Lw1>wq^w*C9u%0MwEQx*awxJ2r{kKjlEFP!LT%KhI;i{91Lh zqY~z46!+Z-=)?ew>7>KaEE?0O&snUH0nSi82ISYEpJ%D76O&|-m~W4v@Z#CCCuRttpj8M|sW zbD)#031Ub>xRt>mU1Qr%ACD6sla{BYJ63qxYRc&H- zrb7j?hg6ZWw>y|0PW)rZMU5-=<_3ndu=vve*B=WYA>m%NPTM6*@sxYD1pma)HsRc1 zah{qaZxeZbT}gW)jmc*04)LBJ6kWAr9Us)ReFxMY^qH*7rx-mWVmy- z?uXAfNx#Z!G@nQe?f1OmZ96!1{yG^rm^e;uhApV>qF%@S&TyhE8GaHTJ6LLTAZsrxxF)p2_b*2KRb;v*YLn{3z_gtICqTV<2$=6l77pOd9xH4 zn%f=J!)AG=VY)AiK*M^+Z6m6uMryvcp1u+5)JDGLmNLDRz6f1*Sb@N^)~J^d&&tG} z+fBaRf1U7J)V8jF0p0DV@JIR6SWD;t<8ol%IEJZ^xa{dNx>336hk3&IUpb89_n}fv zZHgOD5*&kas+^r&)h}$5xHuYeAOXzDEk>vQHAJ!yCmW-IiFy6{t2W@etSNpw-YSOY zbDV%TikkhJPqUntPRwS1hjj=+TuOZUlva;B1ZPs5=vAhK#~D?cp#_wC3J$GO0JY}oZl-IY~DcuX~O z+yhZNrn~&bvs(T=OpK`PrEf+1;i1HDO1B$ujzuqwIAJn-MXeS zc^GwrwNG-fKH_?5p(Gz4Xyb6B@F4ZAiP{@oc8yx-A*>^UJ~9tB(K%JrF{a~6u|Y!1N{Et zMur{U<>haEIHqI8dGr?4Nu7^2SZrtzJ^Py5D|8xPc3i&mM-3RQQp#R-pGe`3#dgjXKW(5UYI z3fC(8xuUD0U8l|x+l0}510{X()SnvV?DFnYvbMvat}es(#U|IoI<7PzMA#HlC4EKl zd@l%2Pd@DV7bI^9XzeqG^qZH+KziTZdGl3iy+hn+$nZ|{89)Coy|;e~38t^{A}0Yv zYyqDzHVj!0`_InD@&uorv1At!N5ewNu8p6OUF%Z@Wm5AKiJ?Ee_$#&l${(|!Q=&84wBJi_{*Wcf`J43Q}}?r zr-;}z6K!eMFUtSRW4&=e;^Yqo^51B57NDR9i$&~C)2CxEI|d6{DRD9=d>qgo^FMNF zI9L%jw&C&rJJ5+X*$!KMzKUL)nM3S<x9n%wHi=U-p6(o6@8eVo>m0M!e}8{a+2Y>MQ=w%V!Q}U%s2=) z*?kjspz97l{i7)mif0Lm=NBytgmo9QLj=1tq;Jik)AjcrNy;_3RHx=MrJ!P>g=jhN z=qu@Dx!fOjHFi`z-`50HMi)+fYKIoTksU{09!RA16_}F=N8i3;@B4bHL!WhFT^}b$ zP5nB9CLL+NrV_{1_&J@nBd?C;9`m(6TEuQt-q68(Q>c!kA= z8|#!C1c;Ele~6wnlAMMgH=l3K$gotJ-|3>TIxb9(;*Ndy;VSXF{^)=z?So*T2}a%v z<%=xKW$x=xI?%RhN7Ou~h&C#g<%~0v+5qT#j-h!DEpz}xh)eRbotbiyv9H$R5VWm) zQ3)BYmy&vxj~=fdDeysy;(^ul7Flo@Q{!GAEd;&xM`eZ{-wo5Z0{2UOdS!GXepzg_ zt#>aU4-@Et>Gg@WC;Zh5QeNIvE<+-c9i)&q4R&xqVxcmg zIIIo6ap8GI4op_GS%ayNhy8;F^TABL$Ot;FT!kHdG|)}ix5`wjF3YibT~3gzQGumn z{txA5f1qs@if{f1f*`|MY3iw_&ztrhF|2Tu$D?NF7Q^lb3%6#Ar8yv@n`}xU9R`oY zR8Y@1kPU*jlD0n8OCnCAOGy*GCZ7)8HjwHPdB2C11_J+75>J)_rITb+T_?tn1)Hpy ziq({qb9Ar}Y%Px~sr5`7jjRC2nW%{|8P|paYcR0?7};8K<$w~pwm%~C+B@LM_}Kzg zoCK}Mn?HBEjKI$Br*znbb3PJ@{>hVB0rbU2m2xKjDR=Vut7lp8K`ZK9+*{VCm(WzM z{B->VS4+v2eI>^HnP;gzS<1l`<8-N-4wv)1IMKs7e%N>Onn~AZ{i!li6U5+&GI6bN zzZS}a+zTL0;C6#Pgpb>Fft_Gz-4K8Ir?J)!kAa75oxUZ z*QR+5*3H;aX|xg^_7*)`;9KD-RcAX6GG$)u(oN#Di{RVM`#Z6P$uw7We~$wYFEjL1 z$49-L8DIw!Pf&cn5vSKBYucTOV0t=S;JPj*Jgxe34?BE%7OdbQllmni(UY|?%%&4>vJ9Y74;H*<; zv+VJziR|6>k#dNlHJj0R;4puiOE0mCH9))Q56fJR3(u5x-~P0n8+ML7+(W^|dYS$d zLgXD{R2#k=+iWGcpdYo0{2|wxRUJsiZK}F$X5DTh*_Gy|`zhh_hV1jPa_s=GYF$+^ zsTV<+{mj^%q%i90Uq8Uu6fRJFTyK-w5T4vnyS})QvHGX&o;MQ(KMjZ0eD~NVons5n zq8UOH!Uh3yat02KY;!A%47U~a{U>>b2$;0rl@1e}A1>}zg=L~eN=u?pk_GSZ*}-LO zcQrBIwsQSfZwS%{nDe#7lXYCo;fVb#cQ^RXmP!#i;9DvjfYQqv^@$g>e;^jy(qqLUY&gDU8|yEVinVIvrhtqGVANzO-xM8%<@xH zbvo4cfby!JKE2T-f`eO1{z_{IrwkvHWvVD&8bVuH?Y5z5Cj2-X^TB$7!+++(-vQF& z&VQnoKM~Xa!45MZ5`5hL)U0}Z@EGhpZdW79-5@W1;@3|WDfeK1cBuqM0sdZKhiPE@ zAnM{~TBI1T|4Zao!N<~Aj}ISfQax_}*WdgK`(SP$A=qI4g>}QFLs6*)*pE?fcc)j6?(q;mk{gosd{uaa+F(<8y09v7cOH;8;O?%COXD6axVtv)?$+=%dG|j1J^P$gH8kmvzpJO0@^szYSj|IGDZaVb*O(YHUf%bQO#6A$!l1?4 zt5$7)lvae#zN)pKVDiIwItnHi>FEUvf6^z$U}|TjZL)A;Fs0g54@@bkXlytk9&7@U zKevHHc=(1xDp)BxCT4woz3S`oXXyc!uHZoZJ29vE?J_g1?5SCC%aDHO!xte7G6aP0 zH`z@ui~v?*4kDTLtC1CMUFz#0N$)A4YMiz!H~2s5IYLmB6`+1T-~`mg?Us5MQ9 zEduCBVfm2$h?Z&#S8s2H@|0NJRBXdt^}Zk`vW0=3nyFOiPFTak+?;mUbCG-RiKg4< zXS`naw)QcXU0MW_8a9cv=NDWNnOWo#GVc>mXZBm_dBfg39}VuBqX^Xkk&ks3q#BD& z?_QD=zMF%^UKVBj&_)1~0$!fzXWsFP8xW%7d{R+ zf)c&hXoM^s!=)v_HTq1~-t9&Z?Q%K~Io0O6Zr85nb&YhA8x*vrCV8_QZ2<=K#p=L} zWL32hV;sF^vd@QRZJL{0za`M9E8@6zclLN39~^6MOy_OHbb2+KCH&Gm-*$bbaWu~I zLyOYNZ3c86(&9g*7-Q^bNic0Oq0#aR3?OfLDH+8Gf=!I=&L(-DkNZUUcR8mVlzX~> zW9aLmnO45tj?y-A#~nyjFSBHG%Y%(CY*PfFbxmOv49|FU!Tn}(SRNcP|%nr##Ml<1H-1xPU|+?+i)AV5!Gc?zE;&dC1NO6T3m2V`4~ev z+7C8sxvv7bND{>X*2T2F!b>LgK0`rgW4MXc!d>if0=)KuqM2;x)$tYI3?(8_lm{Bn zEHWaGj?5tO3@qFv0s6ZWBdR&Vq}~RT&I39A&ecvremUk=aosVpW$H)bq$a*s+;6B~+T zG}=beLhO^Ht{H`HxUnHBh)LL|QXG}~{OX|Yl#Y&pI*PG3z>6+2F&ByKI)Cyc&Qs;Y zriG61y*4l$CyqL|a%&_%v!jd**cn}z$%eqOW33yGlCU#NKtmBD3pC1CKfmc&Iusrw zXt=txH6NR=HVc{*oKDOm5&4WOf_t1`=sdBC#Xp&u**TVJ7ljTXkLEbl)Fyl!jPy}v zyX7`tG9F_SlPDB;rjz`P3?UMunHS8{MQuuAVctdsSPb3x*tCqFBAw>kj+Uf9CJxkJ z9!xi)%4$lV@lad^C@Ivwcm$ZB{P?qk>(exY&5)Ed)|@2Ytxo2{kO&G=Ro)%ypl^@B z%x2(B43O{2S;bq#=QRwfI1KO_vTSmvI@B9$wm`GS(IAfF{x<4lmWvb>8At}abdPO2 zfT5QB)!o}T>P+A_ucPo>3#`1kGcaT{Pnp4PZ6Uo##HRFl~JoHX|cQh}$6y zMxpBDsANg+0F0QC05zBGNu+`#!IcBSjRQK>|p+qZXq-;m=$4>#R#Tyg3{bOXm3Dq36#NX92t60d4 zM8x>VEbX5n}N~4wY(|LmD@OE33xpYh$Z9b zb(for+b>|7#Gc*7Qq{^Mq=OF=%{%R&O0hk@s_PAtlu3c0E|I(P#F|f28sB{N_^xLL_#yi zt7Tn68rQ*GDq4XHkNS8ExhV<%kkU~ozd+j1I!*9lzeh8~;POMw+@=`jfpuobF8+c^ zaSKMw)GBzwVR}V6$jd6;%UbUM`A~+eTfJ7dnWeBCQnFv_dfrIk!d0XF5Ppp&gUa>^ zZQZ$Q^VFrWyIX>z!HyF7mG5VJ`_umZet0QZUfzbl(rGwxm7e~gk`JE9h%-yV#?W!C z9ZBB;e`1W`!A$>&E}0Bc&|oAEwpQAwe&qfVX+4QYhm=drk$D2e;Vsi60M4@-SdoTW z(u4{avI7~YwmKpbowRF6fcpMS6nU8)~1WQQ2iFa%wp-UsR7jw&W`7? z+D!K3*cmz3{HS+0cBPN$*px=eU^7;d5WwTN)C&FpVwoBNw6w24ecztoe`aN=5V>%fdmPRs{J;oT`A7@>L%z3Ahvg_mE4KZWv11Zy zQRZn45aw$Wx+aP@AZ6%MoK}jq*PfuN|5}S0LCoWyezTzwd+N?WR}w0K&4~5b&~&LS zpU0o@qb%jJ}$a}7Io z`C#q6xeu5kFVgCdsBmql9>45c@013!wLMzPYLtUjZJPPBA7!g^?uyb26g5+~TM$TE z5iy^GqQj=(pe3$}?4`DCaE};L=dU zKM#0E_mITD5thh)zXB^3TO^I~Cnowl-V#>?FbW(s$Wr7M%dLtJkS&F}q-I)AltiVxYl`IJr&}``FT|jZ!93ntY`UB^ zuAXeX8y#&YhPvKS2qfiOOjcSY{jQo`Z>G}g5DGgVs=D1@xJzm(DRNV-vYv9~-GqKU z(%8L)Jls(v|Dd5})S{9231TdlaS`>WK=9bgYQt~!LQ8Xqp_o}IGhP!1BJ}$&bK{k}qrOZx5OItu7ZMU(~)I_F}qpOlJ{z^s%ED?xf4Mw8%t&%9RU0*H zS`cQcY5*g5%w0^1-TvXtw-$766w8v&oa5aFjp=_CtXpU*J+Z zxMwAnqSsh%oz3Z#pQnBi&G=;LH^<@f=+0%ivyO>`m3hn}H5D*OCRU-I;yTNWd}d@Q zwd?g-3Rntt=G#mlhBdqWz6&qNPBnHto!tIX`{-(pv%^Z6mf>QQQLLfwLUCdGY%wz6 z_n-00yT_SnyB(bjMQVzex!k-=B_T$ndWGgmVL0tjG12Q4oiWpq|787POT#6!B884y z<9>9g;0y(@-n__eG-B1X?0{xP1Sr3A zs&6N`(TOPcahRyWn351R?HYC;N!7dcpE=hP^UI^oo40r3^!z2-sgvKdzqd(yn&zgp z;Km9`inE%pdUw6fR56av*bLGuo31rRe!TTx;GhVt_WF&DS>MZwMKcWd7jdsfUtnk| z25CgZj&@jV>AXSw4g+4c6*2Ij-dhV$t~2&GcT zNJ!57Alt9LTxw1F%$DSMxKQqjpIV)`5+!s9w(_LTZ!WJn~LhzKttqK1>Dj;|2$I*Q@X68MWUD8k5E zY)ZtxR~pzIE2nXyM%g1Hg{{a#fiw~!zjJx97mjMZIMh#ZHDm@J$WuzdjD25kbd&qG zBHv`tZQ7!@Is$YsKgv(NUYut(x8PTQ(eWSzd^or<6vYykOgd1)lo*3h1GCzEC4G>l z$f6B@gB7DQA~<;31>%Ytf;@2@15%v>R@8kU^i}9$R>iNQ8zjaP$o@qj+T|vheh=FQ=EB znao+1X&`5PLkQo7{K{3KKT%*lXq_ViP}-v%C;hmq7VN6Kz&okR*+zSl>MAQAt0amX zR&U4Z6dNMCNFCcYouq0&eJV6?o-i#g_%`&iN>lI zf>(o{AKKWYExU&7v)TAHiE$7~p#VYF>7YnjUw3CF}I9h63|1atcvG0f*Xeu7-@ z&iX8=$zy=jB}QPeasLW82EV8mk$Xo7hk!+S9w}h5rp^Z=JO|z8%!a`^dT&HVE{9bk zhxvx#-Ip6^j@OhGOGN`nnD^!b)7+jPk7v}Gr)v7oJX>v(IWj-;bo{x?CEC-OTpPV9 z{HEJay=(b>h}BwR&?yKZ))>{^b|{)mp+`-O%%|j$C^{uvA}j5Qm$1!@WBnkFt^uZ$1v%ypz1g z`C(9X1KKRTrvAa6r>XZus6e4%=_2H=js7LRchV)PSVTJU^lV<(y~3aePGiPhUgH{ldaz;g%19xeGFGYTNQ25@`d) zXAGx7anzW(BEC&S>s!ZCF0+t)kk7X5$ZPH$#Iqm0s-n@?%i5Ma!c%!A859BEGK)MTDS|AYM(+O z{BK5egp&_1tKMDlWl}tdXPIb-7w18BF>?rdS=9!-C zu&-e*P7F^KYAs92(2w0z!NXb!D|rrIcWp=h8MjUY(E0Bpop`1_yG(AEgW7TV~inh#`~WvnGl#CqW`wnww8I14i$2Exkzf zmFm0aIsIb?=f1LvMz(x?26zRa7*I@O=lHz&J4+k)29dgQ{SCdO^( zc{0q+_x5OT07PGxNcCIbsgKfIO!u9(EWTG^IBhF5mjhE{wRmfIS>Bw@sT(n4<(KzLj3QheOmX)D0>_{{Css-C!kVUh- zQq-R#R#ZGS@V^7BPyaJuwInTYgfCUx4}RWL8qhe{Cg*arVy#m6+jAYQxuQ^WjjiG( z$^e3(NkYv8JKX73bI-q_RY+kL_n$s3AQw|G4|#dPJi9Jzm)&OrA)uCSkpy>>rx;SR zP_D#p{@nJIN1Uv#s?ZS(S>a*iuXGF!K?JCeMhC6(g4i$A=@NH$u*KEi?2-%Elk=n$ zt+6_edrCLFFnJTqhAE)E&>;J%<&+bfQ#Gq2Ks7E5r-@!9&nhnsKaC2KP&;Jf3D!9C z>*(Q}luoX__e(F4CKZkuulcxaX6)^JQ+m*&NX;vnI)5r*&UM52lE0I=*|OpzerTm! zm31CXP>B&{D(s8i)W?xjFOFL`KN}oz>1gtF2OfHXW{c!1o=ij3*wayywldN0kn{~y0uP&I? zwjI2J2A=P-3fii@>8;j7oe;I%(!4wD^3sdPt9Dq1j5_opED0(ihgohMXQKljh+Q9wWyPK19 z9vQnF{@)TN3#R+b>4Z9pJDmCk>2QsPnjLWm{(y~eFo@x*)r>7Y?e%%vp?)P3W84D& z+vG7jHOglS_5VrJe~D`z`)sp8Lu`M}j#j(5`d_91!)`kcvS6O_YlZ6lqE2u8(FJ$Q zEbEqs#n>ChBh<7KQ3FnBmM85^VvjfeT%*4vZH)6HK<%SZjK)f#%W;rCTYshmho`a! z(7wy1YkvZ>7sxexxyJvK7fX|7iD01~MhOP9Gm;xJ$?K_e`9#>{Bca zM+P3*+2lY=|A(6$i(W(bIiBlt;}b+;F9EfC4F@{SDj5*^Qp4t8MOkgOR5KOjeYu2r zB2BoQ60Xp<9uiE<^`GmmOqb_x;+lD(n}X)sw)-cQhmlH6*buWki%|l`({=bsz=pBeOXnFflgp{hkDNpMou64 z`q~->-&_&Y=KcA;1Ck8>IQvAgoG96kN|bk<6UvJg)PRP4ewU-%w*$rtZqAmAe&AvX z5aIhf5t@kD8T_8V!O(@yd}H22^DU`>Xmqiwv%~U|Kws9{`W*~%iT4uaQ4=UDXGg<7 zgBy`SOpiE}?~M$+1ULM+ie`=+jDQVPTk_a3beu5&A`0OYg#Ip`g(6+WcOo5r#~63| zIDa~^&gOE~x+-(qysc@achp=DeO@9i^{I6MZ+JN!`p%?38Y>PZUzSZp$He^um&O$Q zceoTEj!Pw;PIkM=$h<&`dxgnBL)8;33#Jk#wK_ANc&qM=4P)6+Sd_2`J>NUsG-3O# z{+AL7^j5Em$(~Jr7}^-`BlIdlL4ROs6t;5hF-LW)oOmlJV9QyRt|{|R#ruZ>P@idr z4j7+8OMM+)FFk}+bXE8uw$_Wi);P^oYcOOK22kgIB!qRqa6&j<{0||l_PwvOF#arY zUYV5l%S`nH1nKt8AD~K&GpiBNmQ^wzJdlPef#Y^+PG_{3UnlUMSA8IT!N|t6Nb0Jk zJN&Uj5z;=2DHO!Q5Y^;fqqR}{VgQ&OctC@dn`tRK)z=y#ppp;Uo%!Th-~%*0%?av# zONmh1_oO@P$776eYPfPMULLCyyt!5X4u1hF4M|!`)@Awdyv6DeFNA0;T2fxCPbMS} z&E!%Gg>n}FX@Ay8=_L~UD=*C@uc)$A_noKmBSh^q5->v!K)t#if{T0im5iEOUQ zy&{d$RUx~<=9O=UiAkpxlx6JpMVIaDPd|xAryLw>Smh7S=ql0Qz9~~{VW{8#>aT%x ztW?!{)#NYAx}b_?)gUMM0wpMzm+De1#*t z>+kBBboHK(5>}biTsq-?=9ES~=|Ezn89G;fzpjR+>fc`CfK#>CU|Qi^xjWRAwar{+ z)FOwu`hAX}p!D8j#OYF~!AP<{WdY5qY<9#%d2s>0jb)y6bLkHxa$?};9A6TTpPJ4A2q>H@2l>ZBPcwgsb=AI}hY*E?3utb2XO{u`Lx zi~Oz_jY)j^eQ14xeVoeaB;y}!^EaK+lNbymPZ#W@!D03Si@f~LHWb|68Cl>#8t_pO ze#wP5Q5af1OCK;1<9$>{FYCJ5Qc-s)VcO89U0se~s;!Yjh29hHULx~Dd{AW)N8(%a zoz$V#V-ix*nY~_EEC!MSL2uA>am_Q!cm}lUV2HB*a$*(MM@g^8@M&_c>f4)!$evC3@wHvzv&P2 z)<57@QsmF6Uo~$w50sHZE|PT9=l*Q|5Sm|Z{be`&Uy-Z-&cl9_752UB`VRx?~FxgU>zLgoL)L-22K8-WJyZxDrVO?W_OrfOM>qlUOe2t;Jb9i6S|;*t0XJ= zQ<3N;qNr*0;Y>zoTM#z+d<)LqVwv#eq@VJ%RFx_OPiJ)k&5@UPW(R^{d;||7SnK8I{j#jWeFQGR-15L3c^h&8;?wFXHx~r)T`)WRE z6zf%aB-zqzM?>*yf!X84AuaC5&aBRVNBkDg8W%K0lGDKco$n1=xX1GG_2q`QT(8r5 zp&sr>S;79(-|%nFag#*%a@tt)T7;D?-5mrBQ~_9G3>%MbJ+7ptA{>ht`XS5i<*KUI zowWn}ccHSQRm+|Oha;4w*&p_6|Oj)^7d zaGCf2w*SB_qrJ~F=Osdyi1Hn z^tV*tD0H#mUe_?UKtAeXKWW@pwMzdVpjwOwGq+QOa$N#*(zwhqcz1GziKe16@O@5G zo!hFs5=B>SzA&!^?8npp#woiSs0xW@*~XGt$4Qvfrx0lJTy+hsS8kAT5<3H~oRx*g z$^RRaN78|uTuS2RfB48ElWwG-s>}W`)XYXned9g-Yg`Uh_c_ASoWmiJk&Wz2B2jg9 zj5OW5gqs_Timjuxd94EdQy0w9aV5yniYN_Jcp^^>3u~c>d_scgL1f$q-XB;PBEEhK zB_+z1;ee<-i>bWLA=n??&hXQDXS32AdiQ4^%Vi0zfqKF!l72_ zcT|#1#T=(%oC%_z%ABvK6|(2V|H-C--gyozL|E(XuDq=e~~5wEQF#?X`!q?f8C^ zVBIvf^_8nooe&SKppE*QPI;Bo;`&L+LJ9IdD#f$=_@H);U1|HAMIuTChsx(YW+W9K z8(^x=o3B%?uA%XYBin200*d1MQE7(x>{OYLGx75zgSUVzRs2a_{wuCC?XE-=C(o;*3h7S*wtS!@Bfwb5w2L?>-( z%u8Sm>go=3JMpRaNGfq>_D55cO;ZpPi=o=tkmh;DY4(|3OYL0y$C|7{no(cgdfzeJ zx8BhmxWs`gP_zv7DmmOfn>G@GGK9VzA2RDzVFB?expd^;%2H)nqV+Bt*v8Ns&gHPsjn%G9GF1SKp!Z; z28nW$xFnA%;#OL(ri!}RS?2ffHHf$y?r1X@9PM}O^XuozU3OaACV1%)OSQbSlIA~1 zV5R3aQjzb@MgDM{YxLBA0=$W8+PcbejYcEabJ814p?h{y2%f6qgze`Sjoy<~<)8;+YZ!4I-RX(|uPGKO`WHq_7{|LHrdEDilL5cNP^OKn2 zQG@PDI}=%xrQlqt3|`F3{jBLdk_ekqc8>tuS1 zO_JJ8G%XFL@6IowKow|p24ar?`{1hV$A!z(|m6G=xEXy zg`J)8M0N)g#;E*k7^T#&O++~96C_uWvg|Bjl`%Cr*4)Q%8~GwwV^aGj%prxZkv{Cc zz4y^|3d(F{(@}tCIi290I#Vd)Xty%4jw6l9B8YiVzHDrq^W@8dq4 z^LgA;`bZY~$JwfwjR1jBz4TF;9rPP?A8;et%KvgxKP85{scYEeIaYJZ%R|cqa6gSrHMSMLkj54D4uVJi?J=)KO8wCINsbBw-0$ z=FtwH(TN-zQ}fYsu(kHJ9V%*l|BnU@joxReaoB{ai_JMIC3G#-Wa^k5-DYD*afkEj zJ2Ye;qpDU`^1L3D1+uHjPEKM3DyErc!-N#(FZRzup1s@}X@htwW!mW03m)CM*1yTN zy}!!p)>zAs&x(!~gWL=WDw>%&B&Bi5uap*tTl>T@=97vCHvUG%r&69E>3U;`g95rf zSm=y1F&b&gg<~H$2zi<`WxI3X1-868TDhpARsC^~%0*mjVZAhBfzP;)W15+n`9G>B z_iO2Y>`Tz!Qr7f@n7!G)qW4mibOW=A(H~eGKIrFx+KQw_Ov^~Icb!^DC+W98*1nq(R-y0f$L8JsM)_jikm*1guqZQg0GaXA(& zk()7?*pj%|)9;A2k%w%nqsYbkbZ^vSm|5kIfw79Ydq!}-Q)v?MlYbhX5|z{kX-{D^ z4lM;5K@OJ6=qN>WrUq1v`4 zrynjSP02*QiN%Z{Q~z3)t_AUi?~Z>))HmOYN=V3>5VL?}r_u4LQ_@=$Vyk+yoZ<8Gd?|JHIYy{5v*$U2|8Vued^ zombi$85RJ*0fBa-=Y4^f7Y$9IfbwW(4tjB`v7*<#dcbCsc{oAd){Wy0)E9YMMq5-d zci6QQ;dM=xc%O~GpTgwiSx6iswU<}#LW)L1b$7j!Q?%2_vG7#Mi2B*GFpmxq*QbdB z_FLctdVK?`A)*B zy+#U(q0e#N?~3Lotv(9icedV6jRx8T6O1BKZDUsu*(G4F!%-;r(!Fm%e$sAJt+>VhbgBc+m)w;ITr!qXy&1aluk z!Wj7g3i4upjjBhbEn8a?&HO3$G%UE=hb`EG>xXNAo3rlGa3(1dYikDny1_6(&)Hb_ zqi^@rW^>gml8A5U&`D!RmZLf|b7dKu`S_b8g5A#pcP2wd$FfZ9$(c{4bhmMx0p58V zXv{#FTuRw`*Qk^8oK**A!}nIRa(;d%)iKeY6GjwKCBfy)3%Uz=?*up>7oM}J{DQUZ zd(@YQlh@0{aUfrBKHt|v?JU$DlB91)DR1Q2I`J14#8LrNws#Z4Xq`$;KpV+oy|8M$ zm)^4T()%OIL<%D1l$-qx#;bMiQlwSADpJQYqy4uQ6jmZNX8ZAoPyc^|c+l1vPa6h{y|`eY+at$63QbJ&Wt zAZW78!+rxfM{xgE=p{8eLbGxpB`wHh7)&AH0ZhAg+QnLsG&WGYGVKa=_!c4kto@7J z(x^?Ug$tlM_F|BaBz8!2))eUp({RNPIvRe=w{LKAAS}_&;&s`b$Qp_zVE&QnIN1d* zYp5x zTKx}K@dPQ5NTGxX<7+fEc#63xD?L#MBsy_MzB&cvVS%qx}0uf zdb@1TNHt4^$ykaD1RL|cVoW30W%>P#QhD|UW^yA~>&=@pTJrq+C82s;WELi~W&NfI zk=E@Zvd@g#Kq&cu#3V_++Yk}YRfG~?#i(v{G@6d=@CCKBa?GMDFlgoREwN^kr~@Y7 zyxV;!KN`xhe!1SKBt2JGG{b2k@vI(y*ls@boUsd3%R`V`D%x58FXBs4G^Y56x%aUf zT99#lDbc9FVHj6mZPqRkbcQh6$s{1X zZwhli@6$pfUc>!u@|MKtxwl5jkOHF(c7Sjk)a_PUeWt1v2rR6DdJ~2!d$v?+pzP*4 z?*Y@^In`dUAdHKU&1p3OFFPX;(p_G6gy08tz@yb}bR*Z1^w-Mt&c+$x?oC1R2%pJX z=7kisy=Y$w={z*zKnFxIkzrC9OjR=KpV_<+P(;h3YfBIS)s@dxP;+z8;b5UMfXLYO zp3m`u4wk&Pr(i$^00xqfZYw262-$>=e|Nc!ZN>>$S!Y1@JE^Z5X)PjyjDTggC52+0 z%27LgsCO&rYQoCd*4Qa1dTqM8`gAD*F3F}M`ek(%iZxG!3b?t?<_e0nRm{k^!|=t^ zCboAaDSu5At{bS(1~n$>=!}OFo|zS9v&5^vL}=DVAtp}KA!l6BRL%@W8zCOe*{KR~ z0hxD#&oFYkL@C$u@Z*mvXNVu-1XhJD-8s6_ty7RNRg60Yda(M)djJ7J(pYAANqAoi zEoc%8{-%L%)%eR#TuMeR36ATTt&+Ct3`{iNH^GTN`yfwmTy}G%FJHb)0PUTe78{%y zJ;9$srcYh@bPNs2lC%ODq^%0Q#&L^{UAccN;!Fe12f76cD zLqS~6m)!);(cA7zNgQXhiP1R<(%9L&iQyq{IPuqGsor|H9s?75gP=oPTMlG?3NWRS+>39@Ho)7W+24IEEVv&=bNZ7$semZm{WCGZ;u4(SVxFZ zs7{eciiIjcR`L~nYaXus??1YGY~uhTDFfoZe^+XiXI0p@mGe3%Y~3xr@shwhQ>DZ>IMZ-yvA4u!x$VWN9r*3@Z>3KFTx8tgYhphpgRp_A zU-X31sHPh@VT|BNlh#rl=}V*idG+aI^0&jAv>NKvXl{_VYSuQ{Bi0cY+^ z$k?MIs5RH6U*F3Oy7a{nu0Z6JW2y_`(g~zV zE@JPZ09B?!CdC3CTg);hMnjw#3GYA`(Sqtu7wG|j2zV)+w^da!PzrXk;*2xC zUpMF5Zvg1QfSwqhuCRez%1GEM8VKiTIK!b>VlI}f?}%PAmZ$Sgkn(wrrfwS14K2Q& zCWO=OSf5Axa!cq^FEU(K-wW43PSWXjBrJRF_H#$aut6B$J9(Gjv&TdRR0|Q6^ob8& zDd@K+jfGymWjdR3O_ic88}!t>j?q!yHVU$kq^a^opAGxd3+;V z3+L%B(N2ga8&WdrQ2L%ezHPWM1eQrocjN8L(*qQ1j;*>73+Ad6XTBVZq?;-y^|$_%(giI)}|h#<`L~8(6F@>8}@=1MtS~=$@ec|8KJ&C-h0oCN1M>0XkCsPYe zmze;T4QKjc2)V~TY9wON#}U;@Z}Am^*V7QzXTrkUEPxma*<9JZ`R0^2i&_jR;cjQ? zj8dOSo4iyB7QIIjL}dR zql{q|$l{j~yD;(kadyD9BUblny+WfeXBY+=j0Rhw7cd zrKil!3@P-0)FSO9(1}m8-}1w~xNf?_#x(N{*zy@-w+$KDuy6E!`^%fr2t2&A5P!67 zR(we~u_|B`(VNubFo1WRKIwe8^{zU5Bv(2sIT?x95}zZRmwvN9L$>A41^qRW+G&S`KOor~!Bg?E^Kdjw=g#}ENg%pO#o-2hlN=wGd$)=4i zlqn0-kn+-2p%@DG^k;|EHLV`M5n|OG4s{ef{I!^KHdSly+lJoDgcE5 zsv}a)aNd53N&cMR9+;9W&{L*-1$%Sgb;yM5gHj9hl< zca zmj6)$evAqEW~1I(HlYa4yF85Hd(y4~e_Z|;<(MoV9d>^nYd-YXv}8UW%WW4g(eiH2 z|I=kS?#;aug*4a^#wQqqY z_5hqof=}h6eV6l{iIFVv_O>=V$<*eY;DUkzcwl&%fXCk6-Z1EBp@+D-z;5~J?nqW- zn54xNmg6?$t|v;g##&xO!;}erj~x=LJ-<#fnEA_!*yP=3eU!>~UJ!~JX@#ArxmyxeG+w(gVA z+%aJwdLC!{N_bo=W@&kFU;z4o_N&m+)#>7x)~*^Kw%z@hUtOPRDZvyxMI>QsBH9f{ zK6A~QyJ3sKDkZh#6Rx8j|N4{^OGovMFAZhIyJz#A-U-4(e zk(EK$?}EGA(u3`>H>xE}zHKXLh4}%q)#M}c5(4jj|2AcKY-0DxtJT3l{GFR2T3hqV0FdWUFK6PB}rfV_BWu~7w|aYC=v0_xhpO?Jv}{m z%6?_Fa(EpnUZ=fJ&)PU8NS67$N^mi<-(hsPUIa%1gZLTntAUsNPTM4%mWA+J{TYGz z5c}@mMAXHIe-}~fN(I-IgXiYk53k6y@vW;YL+1?TWEY8`-rvhfyAm-gi`ZcIt+X@r zjh<{p?lSLv2%#HE<~tm9O{wnhCp7e^BFgOTX}MynuH1&!ktCf45ysU}1ax7O^yq}_ z47w@+3AvNqsxQ+!Xo7N56dI5IU1kX6>i>=8D(WBb|3h)5A~G@gr{dZy%DyYqw0m{H zgMq_po?LgQEXjI6*w|a6J3sSHS!Vs;#8+!`gU{qGzz7BPcVPz$ZlzYn76YqPN@~pt zVpmN|w-GaVx%51h<>L&Kz+QZ0B%5|=FuRY*HY%#SADM!0RPAMx-^cOeS=IpBX0=-yM$Zch^G8XA9qZS=)TlXv%g zjH={xR9LfX+LWn4j=6OV9=JX%%!57GILDeZqH{s{$ofG&D` zV|S$giqHb+*7rfs$ALUodiz4igX$^G56$rcE@X4UFWPD^;MGuS^BT-CEi_+fU|WmI ze_bk4cp3PVCVda{123Z<=_{dfCD?-i)I!2~kpFUx3<`tVA2e}D$`U1i`A}3;#_s*r zL|dJI(ZVD-d_qAnJc1mOe4#mwZbA=yhN?pexTwSB$NH(dz_+X{@KH6s5!!w}U7Pow z-DK-vofn{HJcjdx{4<8==HF5oFV$SM;Qo$E!UtO2D zJtc_6{TX6!3MM2O>MP7aM_C7R`ZcJW**))j`{ZP?p_sS1XX>WZ51LryVKzTgPH&rF zvAvC5bN+S37YTS4UkDvmo3mos_}k`OZwh|VLid~vqO#{3EPnT+sHVEE5evFGLZUB8 z9BzKOMsZAQX;>G|Uj-^>Bo2iFQ?xJCqS1L;XE;lsz1vt0nYI>&mAA$}7gM$U2XkCx z*mGlZyS+!;8-Asp;1(lcD4%@UrAckSc^~BOyu#Fjk2DwtIqKEK^!TmVVwqe%TM4iQ z`5dmL^vLWo9umxnsh@2GKcx38_NCZZ?&r&xm$h1CY@HWrdJIbT^iZhkUuZ^wYi3&cAbxQou zW9OucE~op_6%ei*_t{W3yprw)C1nW)<8lk-iyWT2_PJX(8l5QPYm*DPadXmP+J@5; z;|hgmxB-C;(5q1)ZsUds9YWRH-`ge7O*Njf-`o6)^4H_-En_~`mN`Y;=^l*Ssg%Zj z`tk1kC}Zy=8=bkV7Ca3Obg)&jXjQQFMr|tYO7ntmta2=nSw8ky&f{%c`8Vty&f+>T z7_G3qFJOC^Y{h9_FgLNf4oE;%)#>nv7i71CalII%#BAoNr-w|NcOr#xoP1X)u!g=s z-W#&4J8H}Zr`R>2>Re(d1N(HKPKr18VTz@V#_GDPwwBs>5p*$t<}|x^ zuD>S=tr&HR>}SmbQc~!6?6kE-YiDWT)69Johq{lN0Ic4?FgTxlPsVX`vYr>TIixk+ zu+^qJqDkT$Hms_kz_~w9ew%js@zzEF=pHpd|L&NT=w~*fD<7aUHAF~!;Y3T^*gT*1 z-Azg`ZHdEYd8-WIQSH-!JHswyTaq8KAUc!_eeii#A_6uGdQAFPUx1;_93HR z3~CV-GBccY=_H;MO>MD{&Y{@bRN0GP)kOowLV~PeaCxC|5}^4#vzG&UhVN|eTLMsu z{7U|PI8DD)vHYE3XjeoR(K@k(2kL$57YXZSw$|@Fu;JtE{AR0;Fkv*4Ir{zl5M&bs zcifh9*)$f})NI|_Pq582P;N06FAwl*l`^~=u4?oRanZdEX6&=~(uN>ywF^4Js>!JH z7hjg}ctM_);r?BdToa)%L~iwmuy*~Q=n4k+5kMMeV+keT#0Ol!MYvQU=<_|Ne0_E; z6*&IGG{!qPrqr4rhBcTaa_nTIgs2CRAPo?uu*aad3ku1QS#I(_L&7(OiIf5Ji#NJL?DK=93P9ynMV41SzhR3Br2`a z;p=UziZEoD6-ZJZD;|K~5^Q?Lu1EO2HPL$AM0x+sk$Lv4M)jQ_7l^jhPDwi2$?{$V z8V+tm%To)%=xVCayV)=)_NX2@EE2mZV~@>BKqWL5;ah;M&QjS<+45_I3)WJhCjdYC zbUp>_$3@e>bjUQ+s*Beux4om(R@aos8Di4_j?D5_Xl$dtf|VEv}bUMfpEmN%T1R)l{*xvN>8yW~a@1G32WOB?6-c zUrM8aa%3nvp30M|iYhptq?u^ina2)QZ>>Fj!gvel0G9rLe0^m=9Zi#N5<(InSa45p zKe)RFPYABTorAjucXxM(;10o^gF6REaCetGF1qkE$|mR9a05Wdgy5VX z;J3d#6?`U@VAHrxmY19!?n2b+#cY8uQXq!pV7}T2fb3)xQwte*$yx=9mxK~>I-IV8 zGdq8ShypF+>V=lz|1c&K%cBt-vJcCR*XARGxMtK+|DKCATX>QVtC7%>08;a zU&Tya;9@3=^WZoB;AuoVyM+pWZ|2u~Rf?nSb_AlL(qT%P&bYZ;1cNjhj&<@Ho0y|%d9v3Qh7M>jt{LkyA#M6H#L%iMKjU6>VJuT z`?9cQVRvUTmK|&g`pCum;+@nOkg3D&1Y6B_(G!0+j%EZ*m^V zcEpl(gD|GzN_JY?;H>Li11gEw{#>OGWm;D8YNEb`L=derA&-;QM6SfP_;ICnH+gd1 z^G;I0tbG!b`;MdT$ojaTo+XpQHkmKO?Q*_duG#$hl{YasYuvcEx3}v3eBrmA7t}g` zMJ)hjx03c zEI?DPJ9SB821J1SlRk~#2m(Z!N|5xt-254>%*z_ZThE5AKQPbmKtveO*DrtD+!VY} zBl!G<{OxIi&*^Qgh`4z1+=c}uNSldXBXj6+xj`^cEfj&=u+=F$EcdjODGr4eek3*yy#!^z*yLxhWMES)CVZsXUzF%z7E zE|@@n8bf$@i2+RCo#zJqEkF`id^nd?=Ro%fQ<+b^*>)=}j})NnHj=xsAauQo|2c2` zyrOz-21QLo&(=e<8&ETP^Nf=gukhxUMf{dTL_=&3wF5^Pwl^lU(&YDQ@5Qk|d~3yO z4O32vgRVI4hm}n^DPiQW8O**H|qwZFpsJ&^5-Wli@SBaH4ILwfjLUexrkk`%b&6SXZ zq)$K4=z=qd&`Fut#gU(>W3J`8Kd*(frsuFhO;|l<=P`Uju}Mv=h31w}+q}`@?E|6P zg|fHji&^HSY0mwgechiuY2NTDUR#Yg35cM!Trb@X5-V5xL{|uto`;kU2Fkw zBUrLoTilNnipq`nP;YxePGdeHz(ea_(6K48a&UM~l2gI(|BZYdAtWK=#DeiT3=G}c zS7n?lv;$IfnjcnL?v3o_2>XQJIGmX))?t1XobX9OPB%i2nfE8yf0~so0p_yC`K3LQ zVtt(ds`Id4^O6J1t$LL{cWQKJZpyf$797hWH&?A?Cj7e6N~s+$n|r`h$GA8JPCFRu z)*S-{BR3D7;o@RGd&-ruKAKEy*=1pu@w2Z&XMFu^$=nF{;de^ubN8)Zl*Mg0osw+AaMu(b)0Lr70n!z*$MX}pZ41-Ng~M` zlW~5T^q;O0C2sr)+wryey>di8+d^cl;f?E!{EVX<=kPk0+N)FYOxH$a(0VPJgxSmsKoV&c zOy8@r8oZbHE+=Qh?`+qTi6HM6xN{8-&?xtcyeL`Ce@udq)G6BE&pBljce+2s&yH?w zYoo2a4o&rxnD`MJotn4ba608Zuz5aFbv+R9&z8xMEPfco9 z0MTG3M2R}B)+&fA+^wIWC4eO*CEKBDl-A@`QXQAqu{2E<81m}MG^<%3Q^cP5(cPZW z<`Pds794%F()JKYYK#<+%*-0jn^B(k`_lvR(2%hmm@S!w@3tn5bfX>jEv#EF zQ6(-_!2zO!+=u>%)8s?qqMnbv&PI1Wjt&?4acwRxYDby$eIN+CM}x=M>e-yp1FnL14RT@Tg$2e-c?7%E;&B0RmnhVjHXu|O+yq~Xs zmOt%Y5R~xJPNlf=$+|&(-k7YTm1}XFnPzoUH6r%lNP)_2<^gA=Rb2vx>_-ANn`g_> znm(($UhR+dDWTR+cwOufCUpFg-_#z(LdrsN1wF)Vr>C7bZ-~3b@4_pN`b^eIzf+~r z55-q`ZqEU4=fzVGHr1w~HC%Qc-`zvA^SJ}xCr{@jJ62l$`e4(kmFlw}66|R3dGTs_ zRN;3Fo~G-!*72vj5)v-!GkT5w%<*AS2A`b?S+Q%JI?_q_TP!k(W8)t@&+Bc~s;m-b zZ*JnJ#1y?E3mfjjKm=d)>+p7_t!u%lhqvzGYNr;z&k2tT-FDYjOoZ6$~ zXw?Qd^68A&`6Tg9M^+0>54}sR^t5(`5LH`3l&qTlHOo(GuIERu9NF0<&M$Y9M1G{W z-dlf_bHz|?Yjx!a->B;M75hAtpnO<&;&Oj_mP6ZeswA3mG6i}#jf0)KQ)j~)4s+Yp z=|yklSzX(1*WIgmG}})MGl4^`XebOM=4Y+q*c08)FvD6I!>^j0)Tr~zzG|1q3#XPT z)RdsQx-1^IMJ~C%zp={lAs3BxHt6}uc-9hHHhSYoS(3}LrSS^_^C~-|IfcO&)K$mvK@&-*9&PnWR%A>*0=9xn{VNB5mKUXm9gXO! zu7q&JZ7A#BOH{H4Egu=rCFgUZ@{}CO(E~Kl)ClVteTGwS^-(uvi{~|4SwIA*@XSj* z=zDp*6(aE@Mgy8$+;hCianH-;08U-*hu-&_%cpf^9-QA~w#eEmh_WY1Xa7WRidb+( zcH-i44P~9n@<=Yo^1p5hh=PsQ;WmaF`>tMo7V1g17;IHU=XU3^ z^0d6r{hV8@X-|Op^_We$j$NCPka7*<6r%(&Xxicte)bPkitT->eA3sO6L%&zCt3`p=1ZmiYfA}ke?l4h*1 z?81ubwKf=}Orj@ydkXf(hC={B@kZ2mL#>}ZodMO7Sd)zHPP7A(nq;uw9Pr8#V&7;X6Aa@3ljWsul3#|Z105l%z9VjpWml-@F+ z$T4H{=6)NTa?zKqouNFeVxbSa+hIJpq9uC2x?R>XxUBYdq4EaJT{!)8EQQb3;H^l* zDGV`ddIAxO$)x>wYjp7+RCdTdf*OnK?Rt86* zt%aBDzo^G&4ZV0spcvKSbYX7!K?16P?jir^4A z7vAo1(hR9mMmVnD;a;v-%IgnBv>7YY$p_z@RzH1e!_;s1Rr}9DHB8>3l z$WpV(^ob%_R1vz63T>p@loG;3MhjVC*>DXsg~ZRK{%8v&nY@aOk{Vxz%w#jfT&G7c zw!fWlT0PG(Jqxdy!x$wZqR&u~mUtjI%t@%m%8s>H`I&@em3dsG?`g*(|ItIuJ_)?q zMCCIZ$2Xb1x1QD!@-{&$FT<3}+3|Q%!UKx520itY37}oUjQ!2K|5-A)kzn(& zj#cjzx!NTFLi|o`aeR->^#JECE{Bxrw7?mW2xX_a$FZo(`-P(()JJ$o5;?HtYSpj!!phaK`{u*qjl=0< zHv`d<)Lw$me7=Wlll_JKGaN^}+aFYr&Rmx0Tf@lv<@oY&S)qx`C&OXy%IjET+T#zG zatcd|$KF1i;Ep#Q96$Tb<@jU)TPpzM|W70|Y zQ0l19M|?R826f;q5~&BnqbVp$QHj`NTBP&ixI)5eV;%Lj*YmW?fSX9?b$x?`Kc~x*z09!RZnlGL@emf>O zJ$465TryvsU&x<@gM_!E`-ReWXSTEPb!FZz=CUBLNNh2^(|&D2aly z(MQ527fTdj#qI8%hse9v9~r)aw)mUazrJw)=Y4J$0>u*wE+}J=n*U=})ku0}J4bp` zU8%699(ZCukTEUah_=OHbWsFa)}U-;M`-VQf0Ib2WDt_DbWxwM!hU)SZ{~mRP!Qn$ zW|$|5%2m+f%iMCBVc(ktx-av1o(-NoG6WUUyBwQ6EhSORYTwMtx2})Fq3lC%Bx;)= z(8j$0!aT=%D!L~D!!XGr97o5DHvJQ)lnK`*l>2Vs>b~I+Cpyp45{FbVmO= zFmwY866S*lW5REAekBUZWCM1H?r4aA(I78~4H)OYCm?!;N&X(su+{VNZ~hVVSM&qd z{ztI=WGC~|$n+W#;OWVpU>Q^c zC?8%-)}Oih>bi*nfZFi!Prpf-4_(8Dxb|U1@Y+OLJbFf^BNRAFTHGFp+XYe< zhYl5rH{@o2X=Pt{d4j|SnQ|K&8_UZN@8UhqHf4l_gb1PzdbA*4@s4V6+xPZ^1;yS+ z*Km9?KYX|H3vP%@1Z<~J5ha~8ScEIL@w00e zrj!}|s4HMhe!qD=i!oExbMwD}2vttxF0ONvIypTvq7xt6a~gL|TT^)SO%jp=|qEH?1JKLvG z%XnHr-MRadwt$%F^RQ|7=x+!Y{^svjc=A~_A7_3y4=srmTt7{n%r<@svhyzt6ffki z;HYw}^0P6CEj1F(ZDgG>;Bv^kUf*z}0V&j|zB5_#Nt+~pt+lzEoKlEMPTqo%6tRL) z=i-GlTJ+41@xse6Jc>!TvZ14z47SKI9WF3l(}I%~Aty;j1w-NT%X#{X!PaKO;bE(d zB=N_SYGn#3XOK_S zAn)E+OfBb3k?4F@L0K%4U|mEeJCnH0(TTHSibj3Q6K1qCMZQMXQXL%ninx~mG1 z|2+VKfQ2f1n1;qbENRQY+^tz*9R_5JDF(fVMoUDWYKsoz?eiK1nO*Ugn}6VXhRgxim#O{AaZaIv zwRNQeb=-sJe8y2&@)9k*;LnTsurw8_f#CNGSJ8hOE$e7$2Oh~8rNwDa*xWA`FY#a% z^BmP06yiS_ybLm&0-ICh4Z9-Sb_Z9G+#Q7&ZH%V!e5i6*V94l?c3{SAGLGA%L%q^@ zEXwsIVi3(&ePPqmy_{sx*qBtAFRXSfCZ}N^#}Na}16v$z#fkJk|LxDU@)R#F4hqUg z%n-nYCypvrt@alo{z@5Zzc(|TCQ>wL_XFkBH%!w}qSKE9RZxl-vt`%3$M)X$Rrd9G z8M=3ff$Ea!BBYM#F!r;8Eo`~6#2)&KnJ zO8M*8DABw4|Ki--KU|TS ztSM?~pivdAUN}y3^C(jww&=c8)GVr{H-~W$Js@p)MJTAKn4?4|m0ztuDPryLbvY-4 zlw3Vt-1&y5h!{`aUGu^$ljTE6-vV<0ZJi%}tCLM%-q?gPqQ5zhg7pWAzr!xT+}%HD zw%gyCD_P_coN4TMpeJM=%zKkNR~ce6edfo0-{h=8Jq=Z)f)J9Xv7G@PJ=VWsaE8c136@6uO{S>@UoPo$luLGqm=lph1*n`k9r@QB?V z|27CGIsGhldi2}+SK_!%>@6$X7l-@Eond~;j>>GP#slZ8hwDBHOxq=QLfUw z`Sw}*gz)cWij(K4rEhKBMcV52#_En*(THl#=%{FjS%2M~J~;c4K1N^^0T#ZCL@X*ey-3K<9UN`1a_p!_5Yqj? zBqh@MBe#&3+cJoCKMm1%d-QMnk9S(Ri!Me|*e_@wpvwP`Q8Yx~{U1h=?QSb3(!V!l z0-A`=_)RQ$u-?O`G|r5e(`B(y?jKr;Pe+)-7YEI@`82LT)L1($;{dmJ$vB=|DSn=I zSx_hiY?zehDVmIL=R^){_*uC1MY}&NoKJADt9O6%u zs{Zy3!2};B9DXB*Ew^KERz10plH|a`JF#e4QaLU7^^KsUq-3Hr`NGS#&UDC{l~$XZ zL>}8AmNF$eE)I@$YqD z-R@uD^G&g9r;R5tKTWcp%dqTf3Jhh|DxsNw_KB;gXCaG=_s^#r_j&eNzF5`vmvW`X zzopa{xiTdv^^ zEcI>eYz%ZPp3lI#rtmCG%pVy(KA-XMfW%D9?F?){V&*z_1|kM}V0{CSw1K6Oo$*IT zc1{*PKKOr?by}F#7z$rxLtnn4xrQ;k_IM%s1>NF@A^X4!&DW|N$sC$?3$jhyM_17w zs8n+;f`zFi$o14}oQ``70%;GKZhKD^Gp+R`jvuRzV9lCk)ffFv zY$VJT)9p;$JEH(d{3>688(2R)1Zc!i0CcSJDsO+83ZeEb8IPj+Oj1T!GC(`NH#~h8 z^2MU*{RlC2i#*o;{_2TT0p6@kFyi~j^iP#X9LSoA&_LGa>xQ3Cc9!B{6sT}}%MPI!*&E&3@a=Wkk{ zUi1hHWy~+Ul%mi4G{X?zwg$P{?xA5%NBJmvRWP;o&~--ymvz1oaL2wq>uP0>#cO_$ z(Y&)oBaoo-?q!8^P(?7$ml9w9*))}5eaA~OS+1C)CGCfIq}JeEE#W0xgmO!U3jTe= zmPy>|LsgLdM1muY=QK=YZ)=z%oi&zz3&D5r+Hz+$YNB_Wah4`}U9vg_-)Gr+V{?H| z*o7ay$VZ}Oy{Wp+C7`qiQw=G4t2=(yu;n7aDGgMX_%k1oMcj|Wu_A>*ZL2ty##5ZQ zs$ae!VdzdnOat+m*&+Xv2X0g4E=_k%>aRCQ%^!o!#dqi3*#FTouWR&OFfW_?K^~O0 zQ*Wcf|ITC`Z)f&{3*5t{05sG?>APuj$bD!++qpV-DWR|Q`r`I1y35N42SI4K2c}QW zo^1P+l+kS&{tU7Z?v2=Ot*@3)J8$GHm4_H9LsQsq3Kg|741DzpMY{8sNwH1}^I5x# z2~*7Y%pGvOM9WCt*94s{5$_Ux#$h+-<$k^%Nl;o^GxrW9@}KGUye_ZoZf7_StCk*> znx&25C`~hK>}NMfsv83vCAmk|tF2@2FBKh@RoZCXPJj=7x}Y#cfpfIKZNr`~!a8%` zzU<4}{rAmd&mn>dKZAbY-^v3$%pjG#{e*VIcFXFgCD5)JsVwQ1?=_xX*}ak*RB;Fs z?0a@quX_E4)Wc&n#VBb?YKyiS7^m5Zes;s8_%W%fVZ#0tI-67>>OJ}s=KrlFCXPWF zClg5?GyxYrkz#F89&}j=V_@XsvpRTjwky% z43pAONhq^JoP$soJ&W8QN1F7@n{)9R<}TN_508e{Hv?tL6NshlGI1Y0PXZ|&YpL6i zLsn7DUL;jSwWS^@YbLNi-Be;J3sJJU_0`$;e?=%#kjk8(#b@EyIH`rPh^lA z-d(a#`vZPIUw_It3Gg_J^^0i0o@R;k_5S8qH5a}LB6W|6{xDJKisnJi*ykr45Y>T;e2QXcIAM<^IP}C zhd32#0%h3tkEvy_mi4PdZ_ZaJb^K!XqiMP{K$$D<<&*<4TcdSG{ZjFnFza(K9VM`| zO=H#@8#}s{<_@j05_9$h)k<|D`j^7sxkwRM$q?Z3{Qpea?Qc@-8cv9A+}s?HOe*#nG^w#|phfvx;>FruO2-%f;}@m; zpX>keyMTu&_=OVID?B)xGMY5ymV!lZFqVq)8QPRJxH?=eLsl*{d1h z*Sr99a!lk|XFK>pR3(>lH1cW4ccT-qdsb{hK^x_Jc8!v7999d;o6)QrKBf ze?UXSBM8%aZ~hS|=M*?V9UWYHL-7D@xe2!S%qa<;M2o2&!v4SxcBFc{mA5yI$4Z^2 zwzw@$>NBE4G9aXW^aI^~XCeCbf@s{jT)W+4P8xXd@y}?CaTPPg*6s^|&N%9`?%fR9sBeHL8`M4;DT?O_pRN-y}^_^BV*p$FcAyH@3PVqFCmkh_>BpccJGH}5wODIBYFkiV+VXQOXtuHYsxUSk z5<-BxkPIX$1)}tJ`bDcO?T(Gzb7(UAg}tyX^x4h{m=M3=h~Vjp8S-5a0r zY9q)?m^U>h^=NkSfK(cdA`wT2hizpzH?y%}dQbzi+>!uxNRdJ?-Lvxx`J*=L?W3R{ zjpFX;^pheAFVw}hq4d&}qi%8d%E*&_ts?BLJXYI!k(_ezzO85Zy@%A?#d|+LsbBq# zL(ud^snTXhAa!HI=?LPF1ip;alS%QFgNDS8bKJXAETWOqjrG*qlRr;)SNm!3DP!|T z9*?^Wt`5_*^`6J`8+_9|F?Kw{4_5<>kvU};BrR?>sVhKAz$Y|l}!WH)A)I@y-j&YymWAh+hiMG>G zd$+ou$VpUvdMa(@_Ty<2L`?GNjGp>t#2#E;q;fpnGNG;I>G`0zvv*fdXQ#*B$}<9@ z6ZkVRF|pfAEf0y*G4-DWZ;vlD3AcB4b^<)KW2i$6E5Lge4nSfJb)&@`>gv*4?~gJ} ztyN8zH;AWK1+1~vuj9A3!b5Ap)WKYKAs=}t!mXO>B_T&QhaFO2$+TR5{kSHB@$K30 z;{g7rd)Ky>;cC1#PqX`hYk~lNLV*BWgWDb6W>%)@_N_v=Gc7zT$0tWK?ToCS_Y1ny z6h$N%?iXcMll&gFrb@3+9qf`S4tF^%PDV&vk@RhH=u@kcnf8*#I*&a)o=%HGOw>D- zkZN^VxIvO})`k!$F`O#|I!9P-*veCP{kxY)Nm_zb7VNqZrX{a461h}Y{?keJoZRih|V-{=o zlAi9!=RNPQqoDDjoACuVc|C{7_QtgfgM*S>dF$)z*p@|1-x;ud-XOvwBId1VH(0F= zCo%iS({Qb=Z*5K949?6bl_{M$@sP)uB!8WA&h#xW0PQxd}(s#qbNpN+V`%{aUDG0=>ljJEj7qRt(IVLSrQm%(=>{q zrd5|MjrX5>yq>u0bn2=tljWrGbeVrw+E=(SKkPsKaJv0kj$gHadAadX6J{dz*WgPu z5A7p>DcL$2{Z{Dgx|^G|;)T+y^oE;bZon75AS$5SHQd54o9I}vPedD)G}^Xolb zHqRHKuyms#4Xuwer%y<<7k?%%y8O`6das=CA|8rtwNCZ*57nCX1vZY4p6(9d0Qa4E zC=T>s=MmC+ad0n~p{)69w%bu0DRV@vgUxMpnaVG$Gxa z+;;Cw283KcpNH}N$WLv4e%|$RKWb>h&OfV5ej1X}1ONX0dpI~oQnFhaXXl&g5@ke^ zF*wsZfP7Kht|}Rb9f^rS%Q|w_eR_NVShFt{+V&3)cC26jxLZ7!Gq0b}-gLPbUG=;%0?9LL$;9?!WDyZapi`Y8^~e=j&S zKIAe*#o~8AD1Ngt7qeYW-F}k{83*xgYQ)Wa)*1U@$6PPR;k!7#+7d_agzgsEovlV&-YBAt<)F#r3O6hxO?Uy%^uwAg?mD` zt|Z6&+KPIND7=IM;;AHY58j-b^wV9v@advx6Lvd?cielwE>)b*R#@>cjt1n?FQ*}y zHyezmCNGQ6A~Y%v31rR%)YTW0H_2}iA0SOK^5^~j;OS7|z5?q%y#xAH$r0P^=lp#U zM4s&f#c$GdFzGdnjf|9IZV9oumdCTkfupzAUkjE?bz^h$aG^FtHu2m{R(ABKP8Yd! zqJXDlgm8pJM1=dZZ&G^3W(Z@lGr3%T14Gd`nNU0lCruJ%v~_7$p-n}e2qg7;^TJo& z0_5H*v#+t}%^5@U9qj{_DiDhEKHN*#SRt8(|9FP)ibBxwkQTp>;}_)D%xE{e!N`c^=CiTme-I%1!2O~xV&1-YuEqvS9S{X+F= z7xs3Z(?P?8IxJ)ejt?%n=!p|gS4y&*XnVn#k5UP%KE=OAM1y{I%to>Po1m1G6qmNe za#L+#Vc}-RdCAwe=$IktnUac6=C3m#8O%nqPEOY_^q5@IZRZnGtWUYhfOqTwn3j@x zOf)oRi**)2R0Ce25w_03LM;vs&RiNWD4AuQ7>hG2F;b+Y;zmVc!H1kBC8I$+Df$>= zLzBr9rrX6hAw$LL%M|k(TzEworom&{JF}}$=Tncvm5-|UE~c?cixVy9A^n&vHsa`_ zUvTr1KQ{54TvBwE9i_2L{iYxdIyG!FV|&He?gAYFA)~I`PrO=+A>KY0GD>M_X`xfE z!(Is7o~2PP2hxsq@hSt88i+(;tmKWA3Qmqg-Enq_$_Kfm&F zgei0n5?Sp4FL*H9FadKFx-Aqyc^g(;T`fX9FfvkhYhhelAeX^syZPQ44EDBb$|U)g zK(CpcoSBpJr@{KqHoL!TWoYgf%4F~#m&k$Ou`5{ZGc6#;d>U8WXvV<6006QQFnsq) zNl6jQDZ(Qly7vnK`ZN}WJ?_vQ8K!cZi-`L4@V1%Bl!mZ)>LBAjYLxJJ|FscjhYdCh zG^U@gWzSGlhGh_G(Z&zueLCiM(-q_e8g*GiO&CC;~1p723dAE%57ywM@N^yxHyalDqbXBLn|wW%jf)2 z#zR)3k@267-1s4l_uVvqw%jW(^w+1QDA+uijPCIYSlw41Y=V6b+bA7o3!d18lW+Dq z6Fm81BGnU}ZJ)3pZO-xIPp!yeYAJ5nYW5~Q--g(=r2B^(Dxc1Jh_os0<7p2-7`IRg)-s2d3eB%JGk<#$F2MEOkT{}ZK6LW^LvdK z?d{uL78@;zRg5K6fx=9tvmDuZ>{50}aKTxJy&ax2+cV5+zBa|Em7N$hqPU z_V)JH);p1TI@@?wfE8c|_fw^|k4v~(Yq=K)lHk&x&>Kx;)SLUMGxxj`_u|f zRO6{_AS!shMrg2ev}YiBQKclIiI)4plF?w}H=tZ5wkQPeJ?*jYvafjRvLRx{8s+K7 zo)Kse(5f1yCMcz6M5Py?&pBG7R3DXC$b56Sl9m5tVq&qS@0p>^>g+77t+uUEqjr!d zl^~nWBk{ICB8J@A$!W}bZ?(gRjEu~;ZKeI>Paii22PrxE;c|0=EEb?dA|fHRt%$?0 z?*euXAWh`>ZgQo`)f;W{;^L;OA$(@#7r|j+i16@C9&TO2zQ8x^c(7pLWH@`g)^%`j zfQaZ~Vq$_tukj8JF3X2ZQ}-ODDfXE=<)`$LEShEMy4{O1Jf&C*Riqvs--edC>`6qxG zG_Y|ByiqYxQ5^rmi|q{v1X5r-3#_1(AV5zLSPY>nU9G8M5jMqT_%5&vsEVrN9aT~Z^sIEs0O5!~A-b95b565N zJztveD=BWs@EYKPhIv^N53EnmU$_`8X8p2;K2s8)?xbkiZ{=iZUk8N9eq%Nqo@=r< zv$kf`e0O+w=)d;<4GF-=E33rE$LIgajqmCH=FE<2{LkXTf^NpMRuhh1{yBWAjE3F^ z#+WrYd-rl|Obl|IN3oZq3|@utC|2YJ+H>9{2aNl}?FFvP!6d?aEc%&NxACz*err*K zfF}x%XWo2pu{5hi;{BlNRJCg-?(HL2ts~CUp zmG&Qc^)j=o*!3WzpkV6eE)MRXRh% z93dN0hFPgExqQHUz0Y;IGyBm1c~D|$U(^T#+RZcc^TLUAH63`Y>#-Avf};KEqG^N! zj5t=LZ?L9-B(U{xfcJRV+~_WeVy4E-$|Hgel*pU`;az0`;M2bao-*}Rc#MeQU;ce_ zFJ7o20I%F@fY1i)O&!LTQ}{z7x-2!^KRdPbwK;he@$(S9up6`zr6@6Y%2STVEU87; zQR~cphv~Df9;_T@;}8R1DGE$s;IYj9G~^N!1B2qyZ#aVOZw7s-82a~;$m)ZGadHvZ zo?ZSm9}XK|d5N=XjBiVC98spP)Q1S=v99gmW9kX(FNFONGM57GGH%soI}~pFdn0Nt zz4m}2uHQnel_+Yg*kmV`B2FLML0E}#u1@GDq}1E>7mEQJ@X6V}DM^^iZu`#qcXKof zu=N!bgJtgb%f6xEyx;U7FVL5RLIVdVr>%S)mf!liuxSWcNOaaV=pt17Dp!)$BUiz8 zq|1{3eQ;#y{6r%~g%AzyA=O8ZrGA$_H#*%1Ssc&qX)H#t)Rv;eYPh+XvkIMmy>L2( zS8wx9UAvtgvmxPG^I9E$r`*INsK`jBfpfy@JluqpuwQJvPtv^QL+IJRCYk1Lcox3C z+T)?`I!{F@x|`(w_VnJM%~D9#HLZyHX*194Cf*z7zAVY2Mc;st+Y{;_H5$*srGiOi zv(Z{ApS=rFi$kk?5=cEmTMk1|4z_bKux*lZU#2^%@U11Qe_Cuh6Y`gLH1(1&WkpA| z-uy}WeK0l1d#2QIi2Y%|&1c8q4^Pv)6}Fi9E1Ac*uD9jUya#Tme?dsXIIHP}Ez?! z#2rL2m^FIo5~20fGmO^`ykaAj#Ga1_8r@k#pF-}`*>Te5*d8A&esaEiq2}*e{^D2a z8lV*nZrHr>5o~9BGN4b8GGgG;<~{An9DJ{SwYJrM*o=}OC&BZBg8p%JG9h3dZ$>KZ z_Qo5059`h}%D zc|{4sm|x6>o1Eq#;kT0DGUX9DpLL%gFc#fNrk5!nt?9jS2}(8-8jsJ@;BvmTF<0~O zizjh7hR5Y_^Q!k%ESO2RR%LIk5h4@c#pH03&fqdpA z3B}t3S?>t;Us+1A1vHg_Q@gw4}r)cS@wT(3XUvc5~g-Y@v)=5B9`^R-o}aep^oa^Zuk z+zNGUn0i%a1jE*TI+|lyfHcl#H=`~ZcEVM%n)sX6cLC)^&Ee@|>T1nDlUtBS7JTZw8p$Y<zMJ*xTO(&wdKlxQa8popY}k>E!7qx;Tyx4@+&Yy%XV*@TF0 z5#In(%;{%+ay~u$3*}|byzcDV3NZ&jO1$tAXVe(y;pGK18vyr6d8z_90Qy+^bjRQZ zx`$p-z3J-5s~C(KCE`uh-pWUhFWrjdb5PjdO_D;wxN=?rK+|37qnby!=`wE!sV_z3j+ezV-Cz|j>?)^4}3d&e4DJpkiofdc>-xL+Q}2^*@JCj!tLq4 zpp$-UzhQqQy<`ja?a_cZ1bV;Va*#wcl2_~H-gBMM9GBFjY$wy6+85=vdD;PsT$;Nj zP)cc~kUn`;AhRjJ&&ljwdoB2D4|k`kPc<@BzAi1XBsgNIp9JnqsWID;>v6B zUrbEEr^zEAtJ;{vX>$9_L zt<;v|!EeiRb8|EZKk5@?4I4vmz^wY}8o8PX)CE+PPjx#~e{f&U#Cb|9`E-6Ey6$?u z!-@|CKeMSQJ{^NZpXMIf$D+zirnZyNFWf$&>&s1>_97w6MlT(vlX@%4qufg1(S04< zu-q=iEq_i}9g#)W5tfxSZzkUF91-JRv`mt=zlzb`W-AIL&7~->azJT#Cv;uZjuS~_ zcU41H2a}wi(rb`C*ou@Pc>1>2Z*h* z;`@$9wU&nko}-P~q&deR8Ed0s!P33T&V%X~v}yHeXs4C9F&H6bH-MsX7ip-D^iD#@$aU3R~Z7kVfh ziIv+d4Yc*=C>;1SFc?QE1>E{SOght5;RZO)ISaAHLe+bvjY?pDFq!#a%tq^@VtpYJ zv(y|YyZoPPp0{3(U2j&y)>`?97qhCa}6 zrg^2fHIAdf#B})P)iwQ4xGSxKlguUbOBECTAL+1@I^{?VX!s2#et7 zx2Sb&w-Rh^$vnhGPVG+&nEjkXd@Q6e+9pmKCB}har>G$-HWqFA2h_+o^t-+UWD$^e z6KlH-iG`d8J;uJH+|-gi## za+-!%;;*)Tjrlxe7M<=J{;Q*0wT)9P5sp z-h01?GssMf3CemRl#UbAx3jYY>ezrakTH1x)Zaf@k@X1)2`ItcV`GsXJ=RcAu-<_f z6@Up)VWFXzScq7D3proa0&rSnIixSg;yx=<3^88-q2PN?Y2SdjeYkkNB9ElLEa?-U zhk3+ABW@Drz}7do@R9~vpS&&{{C%_ogSo;Ug7d?$63ba)4RUU-wZe(={DJlA{rXD2 zzLw*!;eGu11q=AV{H$nDV3Gy z05GND7G3wGxzidd>m4DqYW#M}3;UPvbFkR4Dy}}M9@6wVU@+KuPGt$cchzpjsHqMP zJ`dGwvblS(1wjGBktqI4%jFGv{raDnKZVo-iyejxDiTUf5`#;I zrRXg@LQBxZ%Adss=vIF`1@N(6G$&@BZli2h&($azq!!Dj7A%lze>ghc8&^@Nbc?%d z;Rx0+OF3G~_E#|twGcK${&-Wp>B=?DTdN$O=>QRIDA~wqQA?3QFTh0h8yB55vc+Dj zZzNBZS%ZtDE%tO#kWY%qZvo@y_DGJS=*~uKZ!Zmb%k&DXgKa3o*BAT5UyuxRL)xP8 zvowMuA_`0u-0v@|Yijtz;j_|nJ@bg8`-g^1JN@8*+z$>8j@F|m$+f}?4{EOi)|>UC zavgxuwItF{K!BRh();KdmKBw{ocCl$SHlXp#Fh_@fwiUw$p>-er4b4!?PJ4`QPZxP zLenNWGT9hKIgK6?{|ugVQDWLh6UoH)3i^|G7mXXXA`RA`3>Ryr4`mbSwZezylpF3e z?(H^FdXz`WZ(==CS>!8*l+4^|f66WjS`kKXC%DP(OV4pk? z`i#7cfnTPSsX;+}W248_U5RI9;`9OyiL%~6vBe8hpM)qzq9jU43<~K?2g`}o|Kza{ z!gS!}_@cg;zEt2pRt+%_UltvrnB&CFARb0~h&(2IUTWUNeO3&IKdYJ4TVuE1a>-|R z$^%3NUqc6JN=VD$}od`LwI1A zh}b7C=P3s-RJ9=#QQCzYFbQ5_wr;Dg!^&cV2VgSyWX<#bX9N69-F+rLNIR zQBIB+C0O;rj|a->Z=RenfagZMgJS={J!~a-xKO)WEMEu|<;C)W14}X&Fnx$k7PBOb zFLGW?C0)6PoUaRP&l7iBujeKyJ@*5He0IuL8t(mh&7Yd^1M-!<@U5B2@>?qvXIj~% zx_0?`=Id{U_chK6ugs-KiI@t)ZJ0Q=8OmHnof4ew#@72cxhw!d_FQ|UG#0YV3|&{< z372UFkn6@8I+CW(%%tHz@bZFOJGEHi&E)3Y&rzQm0MAj-p`{D7+@$Vu+C)z7njmG$ z$MA?Q44S|A+)f7@(RraWU3$C%yJ3}|KN}=bPPN=LjUReyHMMT;4nb>A>?SLdv)4jA zMX_?ciVxG2WsjAf?lAI`l))yS z!KjhSEh58Q$k22E_QS_?<_Krw-D`Z$G=|~%?3?L*U3Z$4g~MO0?uKn&cx`XN7mcF? zt%~)$tUN-rSeP;mo1mwg8H>e9vLd-OE1njQCI#rQJ=)E>x`_L?B(!ZVT&TtzEB8&a z$KnM&|N4vP#m$wA8Fv&qTMp*59|(AGB!>*C!kc&D``&ncc0)4y#K^#Kc6+uNia~4g z`~ii4KvP|vCRzlDkq#VfX5o!tw#O{MXGyq*E{@6kx?)4ekNPcIn1{1z z>q?1vedIeOw0PV+$1q{Awf@DEd!I^gOvqaA?Z#YBPI9KV{qOQk8f1u(YerDcDC`Ag ze^mPrRn=fzV1;{X{wmlGABrxyU~UiONt-vY=wz^9UUu0Or|Z^V2kaoEJp51>j8r?4P+=0Fh$sx_D; zb2(aEY(CalYlYtZ`*|IZzCEru+CJ3P*hrcdSSs)&OUY}19NMfm0}2ZZv11j@pTcsO zRl}7`2lokSMN{@$k;S);aJL?Rv(X#xbG6|ZT0HpG4 zo4Ui8MXX$sjt!Fwu=oeUl10b4XYYGK)@AFH+q6jVB_f$;9@)y#81 z<*^A-xVc}{fF5uL#I6X;hf zh>ydaM7P5#*+@GQi%@%^6nGCCgoSVUWYvq4^^R#LgBlMODob&_`jg<9e~w>G%+dhW zl&bmOJKXfLyi75Sx-c3Qd^v2s0;7B z$Kik)&A%^uWeNM0N;MJLRenZbg}61RX0HlR!p9OjxLrI)_VGIJP=j?}4$Y_0Hy0(%3h22A@)O$)z;>H&F_I z#rC0G^T*>u5$Rg3F)scGpvAy){sCz6&I@2|@>>8YeAe~$bA^tNi~_|~m*RjL-~D-> z)hzi?ph&4@$G9HB<58^pbkohM)!N;nu(k>Z19Ude^T}|ZAdTz`Vmq#@i;Ax|9~}a- z!uWJECTsb#vFZFw9>3TT$~U*2(8`fd^$d?ZGh>HgE1_DvBkZ>;Y=?kBkaAGVXBV4& zuCY%IeZ~-Bm<(J0*M|LOeE)h#2q%W%!M-gAG~4eY&@*#G%bvk}uFR+6Y?(OX<;DeU!s9Mo6Qg3Y9@(wfdUWor_~zSt}mv_AjITh?H6(3JR~ zdO8}I9gxbzje{$KRMLG_>2BAOw=@K5Xq)z}1c`f`<%niVXjbi~-w0hkImejKz@3?z z-bAQ4pDu|;wD8rW+_@V>KK{+L-_?XCASbGBhO)xz*g1e+KiC;br9c3RhI))DT7 ziOMW+a?>}>iLU0F*7tMo_BS!?ig9WWnJmL>e=DuP>r5F&At1-wFo|=_!mote=dB>V z4l*k|uYyj%4l_&cD#+qP>b|Lm%3q77*dJf%CBW7?U5(U+k)L0FKeQAsv;VZOKgb~X za4=h2)C*ZKVwaJ(qGe3|(h7V3Yjyz^OUdJDPi!h(zHw+5WOb=!i-n}qSBCAorF#A$ zr>;rP7k_uc>ot}Krt9m#CRir4c{Dd;TjIYNjAjS9x+vYC2-zJ@6nbX$T=va*T%TlQ z9~K@;;jt}S%~+OFD}E}~2>+;%xE(+7f;vcpW$*YVpd&?kt|`Q3XgcmE-~8mLk4od) zLePhxNt5bLZsIWKQS{fY{>%PvMi>k!Q}{Vl6CEgem00uiN?EBrJjJ(7^vEBRhF|5E zDJm3w@KLetT`ZzY!d8#2$owYQ%r78Y-)L<_C60Fa;)H=$W1;|X@mnuH04oVFJ6}tx zGQ}p9xH;NieU$PQrYcS9PiPpj!Fa;5RF&oM#t6EVddPnAiuPfQX$lpNm4d$BAA=hk zgPPKj_IOiD|C%&|VY)k{4E{6RiX{^_jb;NP&|?QW!pPR6EvhM~8nzyHu}nn~!dMadlsRuxw{6Z){`Td@N90)0nkWd)!w? zbXd{I{j>cYjSkjD?|(0vr3q46M#anUEU{+Cu`tYN`d@!nV>$7^`EED{^xw67v0N{~ zGM<_th4QTZUwP@a)6QuqYB_MR$bL~IIQ?ZX_0ZFm>zvK!cT<@2L!bWj3!8zkv%O&8 zHluk@>r*J3nX7Ftt4|bf_5SI@n^qy%#fX=4%e!4m&-#Z_WrxFEvdiSl(VfQ3Bkd-P zAd|eEa97%Y-ED=p$K2oDjnEgV1p$b5eVSv#j5E@rt%H*~ochQGq+dg_n9$ec9(@8k zSKrclKp_T6kcIx^)R^2(#8Juvk_;1ew}mQwfW1LB7Cq+4!Ex7CIcKifuBVjy_3`-u zf=a$ok}VunKts*ZmZZNqD>!I=gy`KsOwB;4HG(R7jA!OoX7K)?AU-`tvk19gJx!lm zUHjz&hs{?1aR6-4lM##e;)vQ5~6EdY6t_kOW9p=2iwnGv4tlV}po5jkyc7 zs~Wbm%}+Hn*L{PGlASpz#$W0Prm&8P!pMi(8goUoE$;gU6(L(3Fqbx%8#IXAopw$^C1 zq9u%6q_qZ*>oXby!aU_0c$h2`+&#!8gArN zRPu{s*y|;^o!F-T0v1mDCX-`^OYPA#?TM#i{mPHBF>cb1s2Q2#Pi-2e!oQ-S^W%5> z{GXoB<^q|5YpNid6fZNae%ovL5&V-M+)%@tH^a0JQk4u1lvV7F)?)pM zQQabu#P`MWfj%{2jpjE8bcEXNd72EakjnD<74CH=IGGOf;bUf--ns~z$4dPyS})#G z^DY=+0xr1+J|Mpw^zwJW*6_0}DwdGWw|IZ&X7s%7wvw`G$H=FeXB{GAE~i!9v?{(A z4i}DMKu5`T6fAfV0GhSTTK_d@W=3-F-QaM+s}k?xe4U`4b2=Oi?Q8`#mIU+7!$Cp+ zd|<>A!i%1sL~SU(;u|2D&Sq;C;J__Dfxxa5TQ8>UV#Fj+&bI$28^0Jg$BR z==qDGe}@g&Re#g*6}!UD`e%Mlq@+!A>)k{XaN=E%NKHDQhFH3-#ZW=IKTT%Z&>B8C zdmK?*tjYP=>~RhfGS}8Z)NIn)y%gO?*LnuAly+pPAldcNd>6h(PF)+vNtN{emBUO>jCyz8n-RqIwxiuAa_XLDo6TvzwA zYnTqEI~HUW0*G8b{iHz~pdOR2m>vBKlv6it;NLyoWhuoZeHw5}Et|phhikZ0Ozk5g z)`pue?HtPe*C{s>lO8Bcbu4FQY27~^w1JE)3jWfxjB20>H8Cz)UPiTe@*6upHHdEI z(G8E*PWsza0-2!35Q-h*iBR4eV5gm-Tw)M<%;N%mKYwA084$Be+TBfJu$4$f0i-C9 zo#Wlj-`?a|_Bn3;{I5gRA5e!;r~^Z%`d3bV_0GA-Jtn`lJ9ILu*RBAB5Z^zfKrDfDu#8q&J zS|1j&eflFbX?TCc@W!DmhO3XQj4xH7`=$DzzwAo>I7I~#*R>9C%gew}+1mZsHb74wnO*m6^GAYzqT_SR zg^=LjtUlz1^R`R3q1S>>a{UUma4Zh_u1g8Yz!?fRU&;6*DCUIHCyw!9u$n0t-3{0A zh9KiDMn1)WL{KQ)7$qTdLnMCcbL%%IrY?RRYc^I{)7{CQA*GDe7#!P%?;LgtSrThZ z0Sz>ikKNl6@%;-+;MAzHe({J%4o|kq-G1+kgr-v@APITRR2Jby4>AzUodlaoq`x5j zQdPyk#AM@3k)g=zV;+i@5l?nf`H~;%AY{QWG!9aGN!#uuV@5TT@Aa@2XDd650kgG@ zr%Rg@a*~HTy-?*hIWWrdmat{Y6yWhiXFtgO1*LkXZkx>$N5UvYq=Q(raBYbzbV@X8 z+up$oS1jIn>Y67*%kui+wOLtKv+g*l_b@+jYEenHJ8Xvpkx)nqS{wy`Dn*Px2;dBJ z9~PgpbMQnM-#V&W5LSB1mo{Ime0=KLuxJsL&fuQbpWQ6o+%oi7%wRVN#$4*3r@j7s z9IMiC-LRXYpIeF$iz5D^b5eFNI~G|n+J&~-XLHh1K}%RlQ6N?rvy>^2cyhz$t$8|o zzz-M(N-1~YK!*vf2@(7FbZ)G8E9xc3ET+WigkG(tv|==>r0tRF`X~6m7Tq4so&WZPWpBVw;Q$8^)6W za*Ia)wWs>=%i}Vd_S6*B?(sllMSWQVIesM$qSFuO0gN ze>V0*leD+Llzir*ky7MyV2RYtp@QJ4JglZnseCHTmn%w5r`$)`QrBQ72_0hI5T^lY z%4cXaTn2lkkTQC_Ny$j3dQb|;R*z+Ey;%%+KQ+)6TS%NnAYqA8GK?FYY(Mww=m-;Q z%UmtKV6S7eQLkj^VzTxkRBUJ)zFw$QF)K6SZV2VI)`n zVW}@^fs$TrLb-M6IAkL>qd_~*USntW@%^T369O6(PO(B=jUf#Xuv;M+LDoaa;>7^2 zg(8(=S0p>$=coOz%2y^yBKpWs(9qL2R#knMh2mBPhV!suF|d+k#S%g<+BfNZ!van> z0mQji=jf>;1%Zw2grS_q@#7}-<}2AfPZJm!&(A=yz1sO`h>tJjZ^0O8NuE|=Mti(o zMV0nc&x|C0!~WZEJrTq{{X`#1tF_Eu^4P!y%Whw-qK3{cSy`eN>TKtkPuCU!9xmIgJ@h{3c!uoZ87l3rDl!|$(D zDwVBVsR`7aaKhgUzB&CcFgltrv<>X_v=Mhhz3xCTWw+z|-Lz_P41Q^0A-}M24zCdF zV?bM5TeIP0%4gaj*5<#V`r9S~DA;Jx4sKdoVTtz((RUL|;9vK;HZx}Ri>!2xwzN=l zj6!LCAE?Y9E~^+h2TafD2zldw{i%W@Sdv?F zjU(o(jr&4lRu3=#KiN!Y$jPXUU8F(zk)^ zIsMW^3|5y!GI!ogmqqyfvEdiBA8!(@g(u~yw^av&D8yBp0wR9@6xNh%wXQB1b8a6lwWR06L?$3w zc6K_*#)IM{*vx!|)S#v-Ny*4G**zXzz#dPF18>pM(8liuCnsY*s~V)4Nj2Y>mY(-5 zvrmDB&~W5cE7&D$lqH^5^|sHyWTXq?`pJpOCPgPGmg%XA;HMw^A@W|QSiYgqUtftU zL*X|%+#oRzt)QVO&&es16J>D5;O7lxw#V7lM>p{yuVc1HfzFpzic2gNp=-l3Q%9K; z0;ao}nVF1?Ojl%qL~;$4nPS)aPyj7(&^eQHgxmAbzyQR(&En#mv{vRBDm{u}3?P7i z?mcx}8#$gD9Aqg^{#@Eto+Lw|P&%`7+?UfpCn1YdE>y~rzbz&nWB$Nk~AOQen1Q_Ohuj3d{WMG4|0DD>B zu@|-;GVZuFDFp7DJ9RpywUjek(CEIMCLd6A4Akj3a7#hx(t&W zjbvhx7l5KkH<_x}{z^g@9z*++^{r~w2 z0Du3V&wE&aP7vyg`s+6&y#d(s|J#Qmu(-tWoPftAiv}tSe{ghEhzNK~$JaNs01ylX zRsa9F?7uJn&$HL(cL4hz>J;VlRHa;bMQ_HAY3!9_mFm#14KO?oee;Ugh{LF*Ak~fvYSZzK;KqV_p3br!xRdJ zU=>XZDi<^EY8rIg; zaEzK@&&NraZ6J|9^&$d<^PP%Z{DxGX!e@`|8faAIa9X=nSh&Pf7HDX!JRywK=a)0w zEb?0`;7kzAU4MKO*~>w3KaIZRB?-1!dw)S_V`ZtIByXL52rqhaF$s(X(L498w4d1` z&qE<$=~f~$r|)ZR(Kr+ex=u$<$I6vJ#kk0 zk8^&kowGAh^>=}qc#VIFf7m@ZU8Zpol@za=ADol&Htv zKam8)?$`cLuqVvJ!)|ll@`Z>OD7-~}`Gdjpo?k}qf=^!S4p0Eril2Gr9cE6t9vykv za{au%xZ0;r^23;_rV{dWemB=xfYRfd=;7pWPAEXj^|t{%a9HizxX?{*E_2A_(QVL6 zgiz*_VeQ`@|EIiuP9XP$u7HCEn!gj5kN_yWif2q}@(Cs>Lv(5vcwDdR>dX{ZGBP5R z#(?dK#V^`inI9Yc*xM`3_jvaAiaWskMw>~?-StccHey{sad31D%n@CRe(iGRiQwLJ zubonsOATI3t=PDuc{D<{>@p?H91a3!zmQl@nM!M5+G-TIKS#fKv*F@CZ^u>~mBdqn z+8}+9mqkp#$8ogbnAd30b|`~zvzHu_Oux^py>E7s5pUX%*{sojjKaNthb~U;SnkKA0}HpR10xK*vY~P^BNV7Nvt<>M!Q~Q;T723g!pM^&TIU z6D7_uVs6;DO1Lf75Z9iX`M6nYeROxHEGL;N>67OrZ@*7b`s!*^mYJBNsfOgo;zQ?` zI+A99qZSN(m~aEXLU}p7`8TB%ZIdJl)aeYrVO^SD=-M=^bNWu)9Yp`4cbHgHt?Ct5;$91vjD(&^tyO%sAdI7iPdRvgED)@0em_9(2>0r3g z)MB_%?PZ81%>GcQJ31V;J%qb~J1ZHKd|T0$4o4jO1zrw*I^es4&DoT77azNpEZ1bZ znrxxN)9uaD?wIH5SPZj+Lr6Cm^K<%*wCae$UeD^oh2%d$G<@x(EW&MNLgjeSLkLaG@FI`>FGD8y5+J$hkodIkX?fl=8;mX3c{O z!sOJ}d!3Q(ciE(0kq;7LH}W&GLMwc`i&wU^6rdTdO!&4&s6RjK65logKqCR3Tct)q*vk zw_l5_m~3@gNZ9DVGQs}-6F!^q`7M!m%_MH&^OL)$5AP3CYNpK%i_=^ksJ)lI{Ze0K4RWiOMJ@Yt%vb&x$XwNX%QXEWSjWP{CC9^J&^Z~_Bt5R)hg_<`4?;i zR!mA4oE^j1h{YgCHqmx}Z|}GaR3fKlcMR?)ZeJVTEp$=VnwaP6@Yp=iVC#(Sb-F+Q z0J(=qn~I_H4&KR?j6W|6e5iJ#7N0 zjt{Tl5mJTf&gQ1={v>G(39dON<8s9I;h|}QvuybhZ4~1r$2`gaD&Yvkq-i5ko9R5B z{J7yUPEwD6C#mSenW--dO-s{RS^LXnhjJ!F!@d?}={UHNtj$A5jS~3*l0Dtn;yM#{ zT(h?_5E1Ycx{LBx1PR8En7aI@K#*zW@6bD^jjYJSk^I9_&$c=7%&$#vGP@Jnopv2k zdTaJBBfu7gdOMhj%3G@wjl%;>Q~Sojsu}6}tNT~Gm&dHUUFj!y3+YB!TKWrJ5lsn_ z-N&Cn4;F}Qn;supy|%fe=-AqzscS8@KneM3o?^Ka0})^pWG#`Php@w3$fyqyoQF%X zGE85~Xq!%+Af_dD^sgwDoZ`>Qe#c(XJSCakJxDDsDyYV<%=nYH<~#nUG%iGa05M*D zez58s_sEfEeXu8KqeBL65*_OM(0?Mb`r&~AN; zC*wX*F7wl@&8N%!D<6PjOEMc{ykF)WSEl^-s@TLX4mB7mbrC-hGP~qIk0F3$EV~ci zS=w?h<#O#<+1?VPckywPnp$zB413A>uMc`@yBl2|>pPikwnq2c%Lmv=oCtSF9e~O( zZi>}tb9H+>T-I6QN(gJITOjTPeu?C&W~&$lH#e*VMq;yd;v*9_Bwxm;};MhtVb_ddLZ&8FFR=9FE*z7BeSTqO!d>agdk-2 zH*k=2;?{?cBP1oRlb_W(EIHO-%Hh`-CsIg6$drxD4au8tyjv8EZ$tikRmPtDKzRWN zcUjZ8QH+8}(3As0Jj_ruc5#SPwb;Y=t+Lubpeb5&=(4NY=B*-lNBc0Gf?8skPmE1d z;hzt)yV^5>w#M1&EUecM@H_Mf&#e0`U8rpQ(;*4t1W!+%rR@x4O4T{|WVSS<4p)}r zrXuD$)%GtWw0|-G2jv}Nqz{0YM_%qZv+cplbi?cs%0opj21@&D&7VIqR)2q%quvxP z>7bW3m|T^snwy&jx*t0&m6+q#*HfuFmItY2e^zJjfC&o9LDGYifdJxjR8|)91m7Oy z;S9B_%Q|s+JA)exa?JqcP8gNc4?A-M^y6K^zMPUD(x_;HGgmd=V_#$x%gRz@QZp+c z)j#`J%Iu5-&5aVLgbK%)n~j~v&Qz*xq7O6CRu$u>{F-czuF|H}bGLb?1~{XA0~;G9 zX%_+pBUCSAc~v;VLW5M8X4O3F(>Tu#y^6$x$1ZDV;fQ^m-M_MF+~TDYH zWh~tjsm>pFVmac8#FAUN&NEJeovkd#T+Am;(UdI?wVH)*1HZOX-xI~J-I@w)FpUK4 zPUolko`{}!17cntH@59Ft@^~!<{AuCM?+cqjaZ>#F@<4Ix8USpE^Ngpw8}5@7VZMR zRI%~ANQJwpO+O>12Lgu7b}rq_udov_(WodD0Hqh1Dk^et{A+AnV6xOeo2qfuo4gD7 z)09H|$H%(1Cf-)k;&Ix_^GDRsY<45Y8e~p?TKdgoAQeQ4`g1tV$M>?UxX-iJ$@Foh zZYWw@C^ERe{P~6^yWIC#VYIyMA!dle96;JQR7^S6TswyyTEgU8UC+A-b1Zk!_0+?X zcuWRpSK>~lb{wN;4ym?OTsihoXUf4}pW6y^;OaLn>9w=9NEFMo4eC@(J zgW9^_1y3F(Hfj!+p6(x7`$9+x90AY+lB)=HA*iWy6)LrKjK!D6YC&}30KM~rxH8ut zCO0EHa=d0Cdf`;}^*!{bZ-)hL#D0=XP8Y$Q;?<2|ngq$NK>nZE9@!-41L*&Oon5nR z?rb*a`udtbJE}(q2=1Afn07ei<<=%jHntS;pA&SdB|%hCUom5w*_0v?fAKtPC(F+- zR)P*7LgGoVV;+6BQ;n3}Pgk32<(0Q>-4V($`gWpu^PUQre@5SlZJfXLJbPR4<@eoj zQ*yL5?&oLfD^-X=SvGhI?b8y)-L$`8oOYtIe7o*GQE$7f@LwA(peFoDvQSP**WU!67w*B(FJE^}CS zu2vlk)dDLxtDS{lO*i=qqmc1O?4?h7@{?TX0!S^MCMGVxlE(CGA@L&tZUpwm;z`t% z&zj$oJ!$Xzz1yOrA0pGmDdU_SaQUeEJ1;fDbf=7$i+&r9T=^nXdpe=c{{6z zlN$M(Y#JH{O3@lxRWOIX5pH2ksj#EPuZN|Uk?3lUhT{M!{I!XM(8bSy;mRIR^s(<1 zla%CfxikVip-itDC_^~i@9hA{IX_3~IW&yKxYGK4LR&J?udU=`)wyEdUKqdLjkdsD!xM<#DCwh^OPnb`mH}fu=F^ z4%7bAHps!fqVrwIZt|F^3wx@lJdle3nD*7_X;Gh^;!H!naSU-W=O;I*8JpD2#nq7U z(W$W$I8>|Q^b{C&9%llbLX00$1&K^d@$C1|?Cp8wJt*@{jdj+QksN2`D{kdlTjJXx zwC3GoJc!gwyBUG~lS)5t`W`+D(DArGTyt=6*q*p;X=H3hESoXn6Q&xtS^4b_gmQKCsJpsi9mu>o2*q z@gR$L5iFGEy4Wj)?C&-u6;+H_zLCNkW=@-CZZ58e;@ITLUHB`g4r+C{SGcd0J0Rom z-|J?qsU)JnEf+z*GU#xS>WZMCuAu&5g3|(_@ZnTm%1M;&6+mNJ-Dna{=xQSQSc@Fna2amUdEQkhFGoSeI-3IzpUQ*4F9e36ZtQ#^!AILAi+L_z_2CTl4_+>>_wour z;wV;b1dQ`=N<5m*NmvSi0+qJccpEPQrIiToY|h!*g?SNCk{Jn0ZYLq)p6x7OZjZes zouz5~=HA?^XA^wq`N#L8rw3X*lO;!&O3#oec89J%sr0n_*xj~j-wO_W7QO#g6@QAY zIxxd(9`1k2`Tcb$0XO#ABl@0+0`KOLeuf_tWc!AOeNoUiac?FwU)soLh+)tgMT}N< z==j2PLwm;;D43lARm+E3n1b&SQziL$o5DT^}%fo;HO zJa{wxu9BPe^#u4T;< z+V8rvwq#g`cHlAqM&;cb`h&{mUbh$SPzt-Cgoh-3>nxoKxqf2rm%Sks52(kUyOcVUxL=P$JD+CCKpZv6$wuI=MsB2W4H6oqYXpbQMEM`S1bT}oe z(LQ8hWW_0Wy8eURBe<4Gk5MX{DF{>se_|R^Ihjr?{rfyaTjnfvra~y&$UMi#yyYj* zy9*>S4L3H@P2uge5I(ZaVkP~XzW@5}qpK^|(@Oy43H^g|C8eP3-Eul+x4{?)Mto)w z5&*-|Z*p)Tiiwv#WBO?9bNX;L+p};oR!cGBiy-_0h(dfnVqwlsq+Cp&W6IoM^wEAg zezYzNu}X8M(|1{H@y$xQ@E{;|A`gJ4b zmY6F$6UFK`5`=C_)`IQA7&Z9lsvK#4dj_&@llE-coU5)d_^Dr8viJeI_n4+-hZi>z zGsYRtT4MHke|dO$kEx^K^tgjLMebRW>XR+&)Jw8J;k83rpnTQs&RZV}IvVn`KRO3GW?iy?w^Sj>-o;whL7Jk!{P#5XJT`};e&2+Aq2yVpXbu`CjXCsU3`RoB-A z1a*^Jnp~MtrUc^yV<8t?{7%hUTelWw-vAn`k-x{O^uLrIyAF>-6Q6)H)gt-}R6s?m63EB4X~o*R@^q;BN4{`NXq84YZBv1fySFVc zxZ6cI2f#gK;Gi0!V3r!ex>;KFK4A z2U0GjVu~b^%ISV&L!m%Q^0pegR7VaYRPiuhc>Hwzb(sbh_Rg8ZpdR9+C)IM&8P$*l z-=U!)fc;RfN}D=@5&To9dj1=>yqt{8m)HR(?v(|b7!q4s+mVqG+F?>O{mEzAYK#QU z@Y{ph_=k$EDsweE!l!2+#}*ESymuq%8d@(_G^sJr?KgLM1_1&>c^l)7Ye&t6$jqsA z?CMq8*O&}9mYOp!WcE`>)yjHqyX#u?*P$uO@^_Q6bm(1ilcb{2)QKM|kT@8w}oy9pELb#u)_$KEzs`(r8BO~KPT09vvIHq_07i(`B6<51u zZN~{ggC-ClA-D#22=0*JPH=bkK#<@;3bz1-yL%-#6z)*CyGshIcf)g@(|vlJuSa)} zj~^6cu%Re+?R~HNT64|0RNdidHnRo@v`yC-3U2)h2$XT@Ke84OAfMI?@d5Wm%o3dy zf`FVvLr_%IOCqA;PgJM^8X6kTdo$y6bE%1BJUkxo4Ti=+fZQ-E049~ql2 z`6{8#<>UoBx>e(T(bCvp|0->+b7|z|+3fz-d;=A@hquWdUO?AM$9kI8YYXlVzq!fP zRd}8$90a$S?y{U|XwKGGnaLLBiFuxx51oBF!4}WR;n&a*I0oLa-kOa;NV>5ijlBgw-ZOR(R5^lKPktfXY)au#ku{)>6b7jZ9 z#THses5f6RqgA971C4Qk7q{791KXpTAwEYDXmTSl?VGvL9?Y@4=&F-pN(Qn8D1BBy zoZP(NJHDAlsVQZsR8%19)~^QV-Oa=u7l-jjnu8g{Ufdp1c9%OZAN}sDsuEqey_~#u z>H1>DDmPQK;$zt;j%l6h*_W6K?d$A{64v7NVDl*mqSstNm6|HMtoV%9%^vfdOC+DP zFpN}WcLqh2KJct!rt)McFs4%TELwF}`!&);ssh%28`4gRgo6IwW8f;EvC%>WC{oLX zwl>6lfQcTngutU_gbz^Y*~~R4lVPC|uyzBfcPwvqC;u6~%!^SVR#>(X_5Ew+m^FAu5f zFWUO0&SJ@2VtvaJ7|hlBYgmtH)iVfF^E3V0Wu)O&{h$zl>=!wXn>ijoF}qSl*f9r% zA)Gg>7PIMvtqL;-`mKVHh336ar!c$xfd31xVg^^U?d3XCS6k{?qOSq&ht)zbbp70_ zx4wDzb>Z5s143kvk*wkweU`_#yl8s7ePP0)yQ})n0=aTpVoC~?-9ejW0O0agSfLml zO$FQMOD%enk|aUADnO+WV)-VyyUy62KS)>jT_fpGr!ygQKa} zNb{0n(ABn>*cjtZU_h4WaSw`yi!Q`@pWJ1+wB53oDw(r7J@i52NF~YWFW;_bN=U}( zT34wfwjes$LTMaHldKh7oFz{C-&CqMAN49~vbd24ND$`p%;#eR$IFC4-iWn?9ovJ` zR4|B8aglgeDy6<|dE+s0%#FVWiwC~u!@@wJ&pR#~E&_FnhdvZu%r+B;Z#}lXcXJMW z8a}#1PR5_Oq#cQ`ltX<@wb1?Df$}$l*!2upwk~M`+LpAMT$wmHIOyoYBvr^HnInY* zQPo>K;nS5S!otF6JWTOWS-?giBm{^iumL77m1uC&q3jKx;MBOka?V)laN09@#V%O`8rd%RDn%jrff zzRuzJkp(-jdP5CgBT3AV=TzhSYr_UMp{I@4^_DiXM`J&b=|!eu(wemcKtr|! z%G>Q;KI8AKh~IwHSN{4b8{SMH!(86A`)`g$NMf}ngjKRqkmRQNi;{F( z^+!iEdYjW~Q_G>dUDNi%k9F?Fny!+Pk_-$C%!y&aGJ*EK9~bxc(-IP<0E^_d06&>a zZon(@ZmcXlUCd`7Bva;AzwAvtXCKtIg9MhdQS{kaQ^n|IV$eCbVCJgjtBbNN`*OCo z7Ub(i?o&zB`mY<@$8CZLuA1fqiP;9keh@t`iQL|s+oLbyZAj{iy9W}OZvIkHIwDxi z6cc6jPKfU)*Bb|6iHJ7`S*N`MJEcmrOcz^hMUkbV&ALIk{UJPsZ|ijCU|dShYx>A@ z4UP^GSCngG)qZim<8Z+>sqQtg$|>gt(ptR5-%p$R^eY0M$3G+0Vv}2zqg}?5nUrJG3z_Yt&>VvCqpP}GFm#^qU$|Qi*5JmqyDHB;yuD5&6s$c*I zS?ilNG6m4YP-PkSx4Eh9Wt-;M&vTNe^SrSt;QuK!`PM}L%E?ax;wmrds-p9%`*?Fx z#Z8$oRF%oozd>vCfjNWZPSgswQWzt!eSX0lJ@AI7$y(HWGnUC}?W}%&b0mzX2Fnx`~MR{Sf zT^rVnTUD7yHlK>YPivhTYyKKj{Vd`Ke{Bc1$A6PLQfA}@ReM&4deYkT{o=*L!QtfL zktT}L2ji_8+7^uMnUYqi2Os&qf`IwOb(bQ)PMyjaGQg?fDmCRjM8t=+Tcpx$W)jK-w_etUo*gpKvQ>;-{G-H0hGaavke1aUtUT3J?= zEfL*s93LB(las@4GoK=<65HYcQpi6AGA}MJ78+d+vL$0g^qJJ{Vr;RKU|UF$v+4w^ zS&^*Sq{bU;bJ%*HpO9 zX?l}wQV(2}f8MLKnp^03t2I`3c9JnkAV5syKq?QEj;Em%*`7^jKML&N&Pp$r4M*zIv`BLt; zAfAZ+!iGh^$jU38CIu_f`Sgq% z8RrGW@ek5?kC3JZV>C`i&%K$PfxbY|Y;OMnDT~uhUZo9LHlFgV^0s%^%M@h-dqD{zgGm!84ut`0LuYj&f#iOY6g|UuMLb>AKtRF$4Sci-_9^5 z%HRT@?^Bm_G9}4L>7C~ ze)2DOaXXtiFr-T=AP4YPuYUS7dlw zp^XM>!Ca3=toLDVVdLY9nSD*(G!&nSP2+t&pBNK%y55&5(D)&~~v+5M;xk__{ zST?M^JWCK>23MDS%?r;Rqeh+rRutUs@fADF+27Ef6}mp8r(rF)FMIA}VXEcsxu*1z z8k(9wu2f@Dkxb#ZJ?ERBX?jH{fYoYG45c(!A(|}F=8?E~*WsZpe|qV#DY9bAtG*!d zc3EyVgAvsr7SyK^Hgsy$`zOB6AS>t3$%7Z-s}QcUS|~X1EiR`Qyl)m`eqQAh8+Og! zqV8mv*Gh4JZQ)>3js53eer>s6mNtAbvR85(FX?ivD_h`BJyYw;&ql1i_d)Qy$iSId zucgU3s^<@rcPmTL)60f}x6ioyu;M+C|vx@_6Tliue^ip6AhU71| z1?wC}<>^5&SJfkb&{SZXPWvE_MaA5FdpJuxae{q9bR{}XmD{Lm+?S#0CHbv& zf}I+V&FW1|4&2J$Mv?Ytlp?pcQb7@iraUG$nGKTTDU7!ONxb}8WqV;4HI6ltKXMfu z{939-#@fonhSGyGd8RipG0rf1R)GpWAM75 zuo-s$ILLzdG+J;SF1G%EBU!InD zp^WStb{aoZbJORrDHaoW*idZUk9phW=>1Y;7)^|6>`swwE%SIdR4vWkd*8y#;0lBu zTi9_16xB|#NeX%C@ndcE=wQ6F)cs=R0R=PO~C!DXMNEW9H zoV3uN{Dq3&YBh83f?K~!rj`>w(BTIJ+@Epw37!qT!hRWaaw_Qk7rtJ^ExD)VI>f;u z3K|+Tc%kJq4+!F;qp|9>ZpV85>p?&!!1c9fl!U+X!=XAVoELy#{2sXLym72~_`sFj z*Vh+FK_ipYSAM`ss;;gs1s<84#0S7NjW0gZ9V1N(2mb$&k%Mc{_(XBw_sHQtKzl7a z3dq7<1PFl@fatT1SfYv8dyM{f4*(2==*0FI=I7@FR^ObCXhT2jIN#K3?Qd>w0ssJY-U~q6vhA0^yaGl-FN=$5QNW?`D#&m8K7mp z`$*%^a;j_!tG@gC%U58v{&Zn`w!dLfe*b+`pqzfNOZ_dcjSA4Cm_eNy*p8# zeC`goYeWD&e1N?FLp%(0gb)sOng8iIh~NhAChj^AU+<3km}-Y#GJW;oNNKu4eBxcq?(C+Dp?c&R(;=cX}Q)y%Vi0} zn-hmX7E`U!akoA?m`qLzyn*JB`5t)j=fBp~6{A7-y68{yAP}sS3~hT#XzcUS0kN)p zW23;)PwXMu=|X&arVq(;V*@b~t+f_DfBAo)j;PqUX_t1|4f~RngDwc}mipU{qav8x zjTLM>VKJTMyWe}B641pymAfF}_x=@>Cw{$NGDGdPUC-s#BVh{GWW1Yev;INyA0B-C z<_}zDz-Fo;(<$Nq01bz7=>1j8>`Y-!CZJ0aYYJViY7eim(hX<%iwQ8U?D`T2s%rGo z_~%a&)iu^n`j|SBJMsPD8KRO#2z_r

vv^tAU3_e}PDy5~zhZ}qSdiVnRtO&)C%n%m?yrmKsgXrhCdo0{7= z*|BjPY)4EV!H7*92gQzIr3MjVJg^amT5#u7oJyc{6QU-lF#rJ+J?z!q`toaJ-`B|g z;O^(xSVu=R($NuPpG7|iHZiYV+(F)pG94Q>Zyg@qwj~_{^@lu82L1P05&ZaIz4n9i zst(AhCKF|LJlhnjmi6M%R$fvCRwzVXQR zO&{<-aLC&~w*Qu6n_jMbVc%_Ez4+x*e|_Wrx#yU%1Mc5H{mGv{zdzCY<@VmT$f+Nq zp09odb^Y*xwb#5POoVp%BhY~bu*+6Jc#xN@xShDWkLyEShuPzNrxu~QG`6Fjmtgu} z3G)(`P5|?8LJ|oNk%5VB2Ha_y5h8L5W()e||Oi=f6C{ zoV(-CgMT~s2XCI;e(7m65_Wn~eCVqzc=`}A0;ny8<8>t7%|?dccVrB*;F;Ml_Rb*4 zgI9I;pk5k8$TYqQ_@)(CBvmt`XEJh7D&~WHs*=@=R0^b|yK2BkEyQVyL}04OL$((9 z0jH4y%4&gAQ&lq0S}DuPnPN(CB-2nFQ59`T)C-^rR@4aqBB+jP8YRQAL?g&)wh{79 z2aHi=ZNM09S5=Z`Au^(ZBPy;WD~PBB^!bO)BOwC1J<`Ngy1I0z3)>(yMh<3QX zUi^y3uzMbhB`98(Tv1n$V(OY_4l3y!a5Ga7|!do)#O)NzJE`^EqzLX4hH zcc*9THJwNt*QmNfvVeP_^$BKXHbFJ&c(hV=%aWygh!2b$$+>~(~GcMbpk?IFHv+#lhVq!x{=mxbd!_asQqv&MG>uBD;a5BK}C)d#N>rJoIa-~xeH;r zgj$yA#QB z66jIOk{+R6k^;EPyP*FbirSj*Wmzd(Qj58Tf*P2CYa$ibp>iNI^>SVFchodvYY?nO zR4?$nAmgE`7etX7WKb1pOmsnWY6|H)l!vRDH5(VePzih@_!V{%_|QjuLh799!yv1- zE!x^HZv_7sJKUFDtV%0kvyZ?#i4`kao46ALHx3|S0JRUGXbV1}9}cZ5?OnLJ$S{LHuCOG-^W|Bw+}A@S5Bj^!gfPtU;4&j;BIe8i?^mDyqu+dC-@Y$a{^;}n!#i;4jSctx@%!HQ$M;Q5-TU(U z-uIPL8_0k7YVa>VJOy#0_iJB6-G6=GeLo2P$Dcm^^UobP@VTEqefIBPIB?*Fzb7uo zjWo!&4J5ovTHAelk`M_Q;P%}EKOI0)C`7hBayWXtzg0O(apDK zp17g*Bj()3`@P_9VfUE>pTgrQ5Tz}OpwoP)&v7!cv9tG~CL-rh*ztFKUQmGvpm#OzgaS zr+i!*4D&U8@onmF0L!F_ZPFMnn8XefcTc}Qy*N#3(`arQU30i;;N*tbHO$!25rJ;g zny^BqFTg**IG}gxLR~9yK@eRoU{Rr?2M9hv)zNo|U=pj?up3~AqW)&5m3{E^`K_yN z(@su#pBvosq4`5k-m*q|=ns!Q{8xLoZ~bHSLmwO3_29wVpT1)fef-$x?ww7n`W83L zx0}X{vVCqeakKu>gX-C%Q|l5h4UV7DHr~8_Q+#Bf_E^1kOLu_WBE%7Cs=Wynn$V3+ zKW!qpCZQ?SM17O}4NHC$r(%)Aqy(Blwo@odQMZwIlMj;=xs->K5$Y&S5gm;(1g;Q) z@^ZL}g+FJ)0w}IW#K|*%862U4;3(7a^2?#U&?WG*so$SRJD%oP5KU|)P&~-p-tkN| znMo;(e#yjrXN0yW(H6@=8#)L+^wTlyy-=EqkOb&-Kk5t}KP`H-vInq-6M|}4%N3Ps z);8=M%U#M)xdooKf^scu0T{APOGCKh$;sr*qF?6|8-%s9x6W}XmG%h2 z{DOTwB}P(`z4JOA2dKYsvPtC^|fZlZeit9-%oV_i${J+_Qohq9UWC z*~QYgVc#fr{IGkJ8^orP9tWonKk!@6F6J-i7ahHjUqBLgWd2MT1g?C6Vx~KXsNUtyLxuCpcoqu|-sg0}va)|Qr*=DxOneJyzG z2XD1@#o8FAy{mTxb8aCc8uuJoz54K7cdw`32SMU%=~I)l8`86r#>~PUaQx#FcinmW z>d`w-onDVi9-xyN@VbR~LKq>`-74T(h>Z;5O7ZV`gf^EKDMN2dx z_=mhJjcDy>!55*ekY64CA=-!b|5b21`AF?4a)JDA?G19Wwy*C05Qm$*SaoT){@EAX*ayUd@OlS(Hr53FIQ5;UNbj88yT)#_zMQtcSy{ z;MgL-7>_mH$(X9(g>@=(3Cq(tu+Q;&2Es{kFf!m()kR7vC9z6Uk_rX4=oV^uO^rHH8Cf-stkit6 zTyW)lP$`-k5!!rV(WN<-AYw!}u1Vs~-q=joCD@6}k<3_U1IHJrXw4~QMcHw6j}t0E zUUow|U}1>`qgGK=U6)IXge*y>uF!6!=7wV*Xf^EDCPJ=-z;9VoSwE0HvZ^S0M##!3 zMt`ToW-k${%Da3jtg%WF$c~97xE6TC0pjdK5#u7Caa>k(YkI95C@KP|Na0)$Iq)o- zvBTC3hCQF~Oi&b@A6&)ZrFM1p;&440IyO>9c9L^bkbZND4!+W~Qnj)}Sqm0kQdXv9 zR46a&J8qsXs%p|+s0MOf%E&>5Ou%OYOAU${GoNz`MlOrxPU+AFlTFn*jN(+h8I7Yc z0WjfACp@15S}0uH_bA0ggkXE6BuerEFGLqgMn*%XQBy@+hhtL<*_s|yyeJQdTP1T` ztxWotN^ad=jzC;}i9Q0Yo+1uPF%GTSow#K~`-amSNH!(6_GcFh($I>S+|M<&%KiPV zx2F4gl)-Cm;L?I(RK;ayYvl}NbK*&Mdf1jEhALlL{nGX>!81a?r*32Bb(m{m6 zl5lJkz`+(2X`{NkdZ@n9Xnfm#ZEoj7x1@ggc6M;~z=oSYy-nJC?)b^i9!mw2Tl9V7 zpFaGdJ;E_}-PUWm#tuAk@MS+5*}47jET3BSbW&V%=Chb z>+Sr;;@k8b+XeaPBq9F!I+?j`{rc=;R_blu)6I?U?l_q0Bs#jUQQDh(1Z4o!Zf*)= z2i$#++c93pv&;Kh5|IQ>hrpZQev95KMG-)U;c>m_j_rG{#lXk{Bin-{OP}a=96zad-}((6+Xds1$N@bRms(f&1?H!Nb4`% zbK(p4&HnxWUie9ffzE)ePJ^t5iEAW&a7FxR{P8%+#ZiyU+$wY)Xy*D35IxIKcvuH! zE*BOtw4p+1(^D_qAo8XY{zvxid+J*!_kVV3rdQm2ZT}aXXP-Opr=pdH%%*HgA65#d%=q z<{rpeN&4Jpf*ahDtf_PJjUU(P zr!D|5hak7vE+rFkA9vfD(i(Jn4O$fgekNnez^d_8Wcw<_u3FVKtTc07OWdvZkzQB= z!N0|QS&OIq_GymkoU0-})Q*9sfxfjy69oRRPyy3uY z+WVerL2nOiRJ-c4#4{y#pufA|8(%JK~fvE2Ax4~kRBeK8@zFl8W?z-dz~XWuAkgZMW}WL_ac0gp&5pt zI7*-_3Nm8~f;3`oj1c`O(%;^ttUx5TNp04cwPvZ=$=S&r=C%9V zdr_pfcQd#1##I9dQl+``bJ%GenLodg3wtI3mjQS_KaXKqh@1hC;NI`^VedCC+2c$C zSkN80(glwF))2XAxnsbrnFURT1pZ1=ftFkYPJ@79on7@3(`rz0YT*YfS5F>&X1-@_ zTP!{hE4TIrN_)^a{qQ3XnV@gq zzW+Ji0}pH;Ja;bI+_&?lJ5qn~D*647d}PDP=d{|7zzAJu1K=I$t`~tKlMvO{bT&K`Uwi3H(bg(0Gb9+14UXMeQzX(&ksrsmoG__%--t!1S zd^I|L?%ZE*S=Tc*7@J$WZVSB^t=T-YV&(YIwHxu^NpkVEpeuYvClMzmq&_YoB*>NR zyIZ>`s`cQi-kXPqSF}eIFgwtk@JSHsrnvB7o$o1@6UwrZ7cp=B0 ze)HLV`<{LCY5Ql-UVr_wKeONX+0Wj1(z*VQ{1c0EVSncP0(KFd_0Uw`oneoi z2O!(SV=I~bCCsH z9qesyU(wwW!5H*>x&c5NJ#ZL;UJkmKIY2%=DEIR#H}%iy*RMJETu-!b<8GBc!Y~;o zl0N#>ftpY6{hM)R%P1bt0=NguU>Z`cb)%iT9q_CqaogT6bgW^jD_b%_lVlY>K>ug3*TBEI-G`DtbsU?k<0zR*KX zMq2ZUCSkVk8vu z9@;tDKy;yHfaK>;x}Jmgpo<;ru1PelNTxRQU3c#dYd`<_{r8}*;O)65Xf{fnWm}sV zVgFMn$VU(C|L+S=*Pc9fXXqbZ#$zw(y+l9u52$x{|1B%ImD);cB?Up}-~hj(y<>TX zmA(w0muFS6`mpqR+@an-PAB>jkZJz1D>u4xWDP zM=e7`eRPE3hlW~y^jh#Vy|?y-xPD6O>(fr@aq=!8IjjXT{|NL>65oH7m;`!TfznAL z+645D31Kl1R)t}_W4MXK?Fg%dQWNZG=MRpdvFu_=>V~j+JCAq)e#e@4zG;k#t($1H z75_?|(AEiVVq(3pKDC}~UymXkG2FzS*t%h0OjE3VtdH$G+4q4ys*m8ham{ZYm;4}_ zHY$GgHZRrt#^=Z9-&604;{gS$#}Zc+`RY7b#vQ7Xp<7#5ux;&Z+lrRHmaqRT_~q+Q zHg|Qj(JT||?rHw^Uw^%+x2J<~v#ahns=}6j|0F4g%76%YQKqA;1pp`PGr|?7u*88!Cp3oZ#F()W zDkBFz?rJNznq_--K|_KaSjY(+5fxa=Q3Br;vl%C2FW8hEluH&8kmaJ3;uj*Jp+SS>-MkQdh0{V zhJ6FwQX;i$!)W_PVBP1Fs(MqR@77~Suo{jXc;fK-7WP>t(z{k#kyhrOZUlCo)Al{_RNU36^M6kXp9s&-Iuf~rI3gDQ#! zMo@v+rQvlP=Q4yt>P+rRdlI-kkerjc<2jD!F}X{;U0_lW5xWbh>0&j^$cGA;UYoXyQ(P z7q&5tS>T_{iob*BvUkx35|xWSE55@S23xtvGYaq=IfTJ#44z-I67(;5c~l1|`sJw& zcu+!bIK83XcY)_UtRAJJjzAKcU8*RHL{KdUIRyzhO_5c-WNVfw2f9|uOU0swOhl;F zz-3H9vNF1!vL(wDt&}Dyim16!O;PngkQ7G~70tFRJ?!7IA`Z!iBQ7p;ug)pT&yapi zp~PyDl5wv#$!DFc>t-F`fkkq(w^S$W#0*GxhgD#bsgJCPC9t;SC_h)JxQhfAl+_}) z2v5wB>LS6WoS@_cBFYD)oa5viJRJltxON>ycwl*RV-Z5t1TB)P#C`Q3;dGz&$#EI!H4@>gt`*GqbUTk#~zlUE!-iK``|^?V)TS zyEQwRbS%{ql4J(Yaq<_Xh|ij#yw+muSf2&c)fhL}*-KI#n5b~Z8Wj#HA*sf!t#FDR z9`_QC%OOjo=|+(kXnfMtY$u~gykK*h;_6;Osk$;>v#64ivQzRx5mkezQ!Jtk9~1*e zKn^3L6zG1SRLV$@0yU_Ds=9no&LS-bH!C0=RZv#dWlgP>YGoVDDrK8$My~V1qPd6# z_TG*qHGP$oElTvLTqn^N#RyM1;dq{odf)NbOkblczJ`p& zS@V+26^$%Y^=efzdPyd^S_Nr=m$!Z7Ag3mg$;EJBJlsp7N~{6;KZvOaJq<}Uh7n`s zug`abZ&F8s;tENWi54r4s%6Ut;%qOcg8C!QvRol3Lh6Y$A>-D}z^mwnUIfpO@fu~5kEM4!KgSvu%e000<;0V`pdJpiE}9f~<_I8LCnD19HTrvi~9NS=uZv5|p%% z(}C~2YG?}?N-cO0akCzH8#i!dg?D)YDXy)lVg6->d?^Cm0+#(uV=xw3_iy1~r;*W4 zJf;bpU#CS1s^m*D%?GCBqZHzea$pD9T3$g_B!CYrW`h(7kExb35@q=r&Ud|_2$tZv znX>B18Qnmlt*e?B4kQ41Mt_eyqiTvQW-eM8N=hlLZ90Js@-z)Cq}yM#BPz`|IKC_- zHfDV;nYv5+p#EwtL-FsZWTloT#aflh+J<3TH17sQH_%)x43rF_ieX!7*xgCsvE(*g z2=6~kjD)3U1yc_ZQQ zG(1Z5s^Mu{5FTQPR*&JI(be^_YH?&RLM^AeA|mpJZ3FN!f}&#zj;-gCSvMsHcCD(A zDP(bc;020;@<>jmf^tv+>;Qb>XxEYLjGnPHImqOk60%Z;T`Kdw;5aItCkWhAQb85& zUQVT4#ZfZhe5pkUOmykp^Nx8});v{HP>L?4^0|d1nZv{SLR%t>i!xiKt;=J)mJbY! z&tC3rBa5^U$RaAcwWNa#F_1E3v6jROZ8`oz)V8UrUn`Yrez`GL#H8>zn{F&glB##p zfy?Y9DLiYjGj5TtU>KSuD^6Lfnx1buw#WxO%h$?*nJbu{8+Zk~h_ELk)O?|U41%PL zMJ3`u9O|xHXCs;|i;A&$Z%=209HR`<@hTP7uuQ?S1fgb>A;4%3UBscsy;Ke-BM1^z zv8zD|qDm#yb3B*VAWg_|`j=3^yG)-6+rlVekFMsZilA%CC7I4Hl(LTQWgxmaLEg|f zk5dru6cybv!*T8?MP@>*)EG?{@9ye}42#E^t$;g^T$!C3PEc7kak_W;%xOA`INT4MI3fDZ_D zQK1Q-p$Yg_AFUhum+o+S0rl=q+;Dg`9?QDafh&nZIQf)B%LY`YK?@Q-I8_#r97#4IjOn@7=RkXdazzQ0uu05U@VjH7 z0*8pRXAO$Pg)r3uT97Krx)_)oq^7~QfJ!!IBS=(ZPRubMB(q{JFlDjDc* zkOb7VP@*c}`9Pk88P3)CJ+w3NE3{K6B`P4k9LBsRDM2KMTezf0g8wYll#=eKwq{DC zo3nf**~s%S?U09Mqh8T5EW`HdWjN9&)G)r_TEOIz6vG&EIh*cIOvm5#SAVwyER=>c z7iBFgkRhED0sQ3M&`K2KhskslG8zwKH=N=zWdNTQ__uAx&175$%)!QALAhZUtN`&D zk3FKo>@UFzcm!az5Xv?OK35L&P8?0JAyaYgawLSrg0gBVq^pid7VNy06>_#N@iktj z4U}|inIKp5%Dl(h$R-VpdnlY6$sslj+ZAhMMqt#$r7T@W$~y$ZEf6&5VGUqhw%&(~ zb>F3Q@ccsf?vC_qVIze5Pvesi~mb>lycGyl#e_^&*90L*S&AcD zs49TBDJdvRsgN%Frls2kehmqS+*-lJLyZK9v<*wO%&c26Gxa(U#3Grt*kt%Fj;r$V zZVp0XY&tQWu4m*PmCqH6UQh{279uK@EU5<-7FgrC3qA!wF&g9y#3P@_&d$RNw3n6u zgJf7e98-_8^4@UXQ25RC67UGta|(f_BP;Lb15<}!z`5WjqdF?Hx)S&$fE;Bt$QSKG zMGXv)HWGktu+{LrF-(2LIKJO7x`N}PHo#{M@p)UZT}{@I#F}zYELz2)>}3`NO439t zRAcak_M#KoedoK-I<~{Gr-asn6mkLsRWFuv9_V9~<#5AmVAoW6AuQG4ychXk4>r*X zSuaLhA>akk64;A1vipXUrHVl&kW`XDj>!Sm#&c+tz?KCM5_OTzn2uv93jzbJ@SPk4 z0FGZI9MAJ~3o?|TWS26UYe6m`L!O!;g^<6)p*OE*cp=3raHii=u~16{Lfzm&~O#R#;F;p;D>T zZ2aPuCEX-TAx>(qkJL@aaN|b9IT<7YEYdV7&}>e$McTfYi$F{;3|sYu03wxyIFPLu z%GL<|Vwm-&W4|LI3*Xb?ID8T%J?x9X0YTDuNhXCr0!)<=6+6R5Q?7*%Ku~w#+eJQj zuY#i^JY&Q{dcbM5re!)P<;jIy)aQ84UR>{JFVoQ(>U2kX3Y-Zpk%#3V62Jawb)%q> z&v2;91q3hQR~%&wS>W8HCwfY*0?9^36M_PdLXTe znxGrWst6FK$|Mo)eF%(X%8^8H)OEa+(=s4`?3>Er`-{vFB>@-77*}sHJOI`^6I?yR z54~y~s^K6+vXB)b#x>*;~lx@6oXBqxPOZbzqRB)9G*`Vs!2Fj#F)-o)& zmJNi!QcK|72{NOrmvJnG-z_k>jDNGe%yRC9W!E?)`W|=%At)qIs>!W0QnQ;0X8NvN2ONs-}m_v2ViKPb`brX%NRd~@cT&Eye zLJBm;mvSlqPNnF3N;0qk*8_&kdeA(FF1Sjyl&Pff#8*GmnnEFOJDOz!D<#nt@oS5s zKv_d~NU{Pv#Ph}K6;fPXienJp8Ed3~jHV=!wNNftnJ99Sl7-)!#+r^_gBt;atpE|s=&p%r>4-FS5d@#NcUgZ#9OD?T3+(prKnLO^8srk6X zjk1@j*g#RPj+5(td1zUU{A#tIsq1~hs6xofg1RfFrU)v)mAr(am$lwhL#4Mg2zyBp z<&}(v@?njO3~O9~OL$@>Af+%e*JQxtuH(^s5LRfB3W(B0 z3esvkS+0T1vbfYt7J!Eq9#LH;%K=|<$~Db2Nsj__UMekcxct{>XEB@;TF2+h^fHX% zvBdOJ^TA_lhODV7ZX`q{+bos5Vv$NZVyaeYC?+&AlT0B@5N^GU+nEa6sWjqd@^aJ+ zV*^h6dwT10VZy(jO(>EOMzFIZD2ehGG#BdyUQCBe>DgMDb^-yXmrg#Pf-E|4OvQw> zk5y`5*lr-XHAk>bJZH{vicXRDY&&BCa06Q@fuGHU@6{9PZ%S*_q8dq0y`!%)jwhea zbWSrW$*U>fDVbT%D;pKh&?GCbdO|hGMpK%prx-wog`kx4T(?kk9jBbD*c!@^1Q1qA zIzg#WLQ?onAQti$iH77Rd`}zh>DokWZFq&csOzw)b6FURH4s%e@V$HK-6HjA&NH(K zAQMd8L7szaPmZ0{^KOvINl7ayl6g~Bz#WQaO079agajysbj=30sAn=kIaP2iK#gVO zh*Hj!837B-4xDNZV09j_nkkvOC_=6;2b!kK;3W-7;tadsD6*q!kU>ehEL)}y{>lxp zVP>%a?K79g>x13QbmA$Z>8rY}@r-3$$XHhH$+%g)ig*VP)bUJJgPS`lsn-aKvt`v# z14yjRl*00toIK)fIO5u}>spo(@T5@kjUex^a;lP%@|jFt42SDO?wJdHxLVIWX(pVg z3dU4_gAblPI6O?9auzy>!;= z29OVSMc}4OGY4m432eok2@8oy3H)dwaH7bFYPO{Ex|ED2i>ZuLjQWgh8=~X6wzc3b z5|F$oSu$C30&oxo3i4e_p`&43Y`*;7Jk}s|;rF6co6L=L$(u#gyd(RYjT_sEozr$E-O=>$Ib zIEa_Ij14f%F- zA@hMGbuGf&oFNNtl(dDEC39}nuDEglK&BYv@$5!elTjhcnyLbO1<6ijP1!(p8Nb>= zt@^GK);5%gK~}>4hWM2}tjSWUr}&5>8CI^nyjE*GBhG$^bn zwC>;-U}t4O;@V_gEM0uZH2<+8SpQnhlW zni54-a7xHe1-j2EmI*$F4}Ge#%%_G`{De0Y$r*H&;%SeEKMPkETnV7@AIi7 zoo&3AqTa{yo<5wg3ny$}7CD~pD-d^+rkM;3+fZD|pes1ZaxdjfmG=aV=5vLLS}D|Z zLj-)2ZRl|W$Sl`maMMQF_I*p$L9X76}jhXsVbOZMRZd8s`6jsbx97vPcMO z5^UCjMjMJzw2&f}lXB7)M4N|r&Wa0SAW5<#`g#1~D2U=tIJijjT-RJkQgSh8 zATY zD&f8-1Y$v%S`{Tr$i$`m0```G$GMt(c`dI4^pMJ=lFzBRJd^j~V`ps(LwU>2X0x>@ z>RcpkV@gVb0LEEDOF zoAIHJ*q|drSKhsX;U{J$)7us4AaJpkL}McaRdR(CS^Zz^y$zt;)^#R^3(U+L$+8Uc zNfadO2Tvp==pPnE3YLEaOR|DEju&g;&O|r9To_IeInwTOvL zLGDH`ofH+s9NpOBJ{iGyH=6ZHbwg6QL|$B+VCUO%nR3ZxnAPXHww`G^nYd==n2fq% z47#TWUBsbkU}ati%8Q;xahFX4gTg2XpjEq!PGgeF!!FD1Njh@VQ8Nc~`Sdk>U6kh! zI@;%Fm9KXnwMy1rlE@=qLEJmeoAp3q4n5@UfzoHO8#%V-x|ncUhw0RGnM55g4bZ3$ ziUIm40Z(B@=y!9~B|SUIodUSTICC302yKD>k{y{}c6B*Ni(cT0vYsWlKw%_)FY9+u zrl;^+y)a2U7Wph;SqQ_1aQzbdxV||BU19UUD>MqEQb;3*lt=x zxeX7_G>0%h$p$k)P4HL_N=C-KLU(Cmvk}Xkfv?jcwv1Qndp7r>d@YQuUDBO%3(C=J zq;;w}<+55HC!7V{x!^&#y3rcB7U;5m0;7sJz@UpD)eYt`-ROhXCrgGsqTQ^B^F)rR zZg=%A)%-Mcc!I$=h=J3@s^z&}Id&b}*5VY?p?fo5XF1GAaSZ3xtISrl*e+Zrl%rXn zZ%HGoM?5~~zItKnyn%Cwqr7Cu5{Ec0XK0M#ta zIwJ0@oF7$@-(wRGgdBf7b|>Rb1TsNBD2Z>|EJ~tEmq!tEku{h#Yshdx%b`i_*M@z` zmL<@APTZHIG>pR3qG;S9-Pi-szT<^al!6-I#~>Lq7xV)L1Im$F68E!!qxyW8ZFpI2 zL|xZ^J6Y;em##Z$6eX!L4Bgxb*f2B-1J2YRd85AV9+A=rbEG+g%;@#3vf%y@7KvA^ z#=bN6wctQ0TS>SWCDX%^>@v6Iti!Yp-EzvatZDOk0_IVr+t_Vz^4esw+&;HyAfFkg zsutu~=DM2a=W${e6x8N8=zw$>bBTi4rbQhX53=J}neEEjfTATFbqrrG^8Zlg(T5da?OwtLZlPWC=%JdKo zEH3H0F?BNTYwN-@E<0hfcCf3yy&ZSfPewMgtY5lBE!jBos2g{}X(vAGgGp9p zAeRtmG|*)S2{GkD_M+5Iu+G4fOfH+ONY`%4OtO*5zk^A5PzC`OA#Lppd5#jF8led? zRhO!^F&_8{v*B{8-?7#cT%Bq`jhF>uZCBUr+!)%X?ZGpQ%OnI9i8guy=&Bm%AD1qz z0%A%_u6*GdU?3-x(I|<~xs>YD(P-LHDKmj-TNb8EaAfq6nV$>VUaj?`P3LNCX4@kf zx_UqGG^kZykHf)W#Lt#8%`j>0N~@*(bkNiTE?47P-_6qP^U>9wbM0pN6!W1i_b4u= z&86dx?^}t9Ca@t-=wL)1aJb$m7!SOd+vC0d1O%V~GbqS$c7%R2P8dvyg&F!Im_5Bw zG6CI$Xw?LI8_3eYo<@C)6mUrx)566S)wWz7NuaL!Vt0e>8<`U~JfwFYvo5CC%7iTsQAeKzV>+hrZ!D|0UPi~`ac%4NxGofO3tFQKZ6s~lQ?GJ0 z*=>56VauUom7od@JYNHy#t)-OfvbX1C)8=WKAH~nTn~qemxm$Bq{Yw~6}2rZ<#wJ| z^Nbn`yT&g5AXewL36NjYv@q0MH+n23VLLqR*-?8GCwd%I{4r2Wtx@;CTn<(|9$PTC z&m7%k^W3X@+CkyEAU&FxR8r|a=PFVa!m&YmmYYQIIAC%zVO-}F^mq6}JQ0Q!;}%vk^fTZnx%LiQ>1XweQ<1mk!pNh=y96M}8K|Bh~{h zlhR)5SbiV+s@?0gr<9Ecv(W89`#UjcX61S)*S_sa(X0`?mUF~8;Ka>)?Rm1M6wtY* zluqF_n`9#vw}-4N(<&g-%C=`C*`F1@JgG88pX-qdKD#TqJp}pe&ZEL{c(vC8Vnwlq zZkrC{`#5A#;Ca-i;V5LImQT96mfCUR!tzV0zO_F~+0f{dGWJd`c3+VI0Us^;}pEj#3i6D7o8!^974JN2Vz;zG9o zh1()-CrEUS6{(dbY2?omc{-sH=Jrjron=#8O|-TjB)A1aaCdk2;2zxF-DPlhcZc9k zf;$9fkip&EWpJH0r%u)R2k-i{KXmo(?sZq~u2pMacXUJlA$l};BXH-oPZ=U&Vb!9Qflze`Kqdk zVK0jmUA{Sl!lzd=uOw4 z?4K+*Ha{F#!V+xwxjhV65?%vX_Zk}}{6`&52S)VF$zCs40C63TWEta9XWrQ){RmXi zg1d2FhcdL4RV!4Z3tqG3^|)!XUtG_u8!B&i?I^w`w@UkrJK4^<=MCbxEa^61Q7m^7xRFrP%p5%DNo2?E-+Pp19q( zK!&-|H2VVpNhy06(q$Go^CYmMY4p9M2RO9VMxeF)_@QU8?Ilj(S%+6ArL%-2I^jG6 z+yaM;p$=Xtpbju!M#LOWtA~@9h-tNCaRXvQz8^k);#ou-vTze+-kHsQ z^4^SSpr%dsrsjC=!HxfSwJvYJjvBJ^aDBmhpOsHHVDN7blvH*|$ z>7bnB{d-|J_xYRdhq!h2MhaKL@8~Z zi6dU>##PDWF1P3IL=J9KNii#;CpB{sVCokI>IX@$iu5 z3*288>Qo4f?QD46{Fo=TvV?b9*qWW!HR>Kr+^UTfn0e%m;66p~+yyrH%<?nGJLtQBzY8ADvd|KcH3N*0bdiDv~<%x?yK zF-e+9mJXK9SzxS4B_8h{L+^kznG(wW>OH!(m9>_NO&PU>W`p+4uJ}E z$$hL`-AA#A(EoZGIHmZ^}Sb7cmnWXS*VWYPxo@9{x5) z6{3?#)f!%RQ1sk+t5qiX;;bJT-@98O9a^^Gp>CqBH(*923$aC&jRn)iiYqvBY7>lAss9@G97E$@1cOWLh>yGB z>!>q(jf>pUvNHtkIVQ-s;rL5Ra3m#D`igb<5_PCLvzw`Y7FI~KrD*%_iXQv;RVnK2 zKC31W8TsZweXj_WEgZ;ioSU>sIRPN}_#E(&!40N!JNwL=a_8n~e$#dlqf}HJJ&`Cx z?X=~LRm*B8sv6wap|D23*BEFCT5}xNGno)H*gdnNS!#o!5W;JJ+;J*>;yul(p1o4~vvY_oX+*OX&Dy?&=%%OaJo6efi!?g!rAw98+S ze{5hF?sq49f|s~w!3gZUu~KO=)_f-O7$dSt$srHW`kZ1!jSq7&)%f}PzJ&}{DO}5!sd{&NM5@}%du$kSBlfhitK|ORRQHRnTtQuk>v&)319sJ z|CE-s>bEZqcy@HRSMm1yayIWujqpxb>!UGs30Us5(?oQXg5`w%mBMNe8 zdJm3iRuQAFu%`OjU%<+qD7a6JU$8rWP`C0$zDkZUX=N5GGap{qKj|t&bZi{HVOTD5 zT1jgA&H2Lh21Itrpt77;zi%z_4O_!wJp;?K|`x!H2p?$zg1u=hlrPP5Ve@{qglouCQMBVJGHOsu;Ch8KjJytPD{5d@r`|X|0BR{24 z7auwOigYTBP{((EOGLEaGM;n9y6r$o9pDn>n!*LR|D60sBywZGADd!|%f2tT#=k7H zgJpn2NT#CA9Yi`X%^0|dgc6`aR5SJH9viNtz_AVzAn@K;X4>hMk!@=9iFD6&-_EnU z5h6bOBK<9;!O6kgyS*tpv_0RLr*q)4qsjA|9W;q1>!PeJ{WRklzMQs2CmfO&Y!4cR znMqMFQWcsh$je~H&jV)U58*zN81}ksO6R%70zt=z3re4?5P1ux5R!VVPA4&30-D0a zZJas>(>nJL9;&Ke`$%;hF1WwHAgkRfr_cu3@PstUnWTigCxIWB(>z)UEf$aD^|X>E z61W{3tnpIWuY3z$WI@ne%bpL8#rQr20z_^?qrz)o?LMSmJ;)-DQBvwlwDMwqhQs5l{F8(DkyUHkl5A-AGqLHpaOE!t=~?IU$lloEke+fZR@Qj*u`$%jhaity0B3!HgIsZkda8C5^J2EN!@zjce1ff1Kf7cDAF|)*@ z*#=OwFp2bYV)ht#WY=$Zr?FDvhkZ;y?<75;DsYdIqT#3&5#5ecN{>o7W!@@G82Mr2 zr9fRiA8lP&K5LI6$h#bZsF2Ke7eh%c#P>@_b-O}Pdx&Z3+D*Ah2Q@f4X04x}d>!pw zFpQwABU7z?7K2(h=SDy>yJMQi!8Kc9U&xPxM%r@D@WP>%64?JFc7sgh%guQhU@?K{ zMtcpa)C?n|qO##b94=Q;SRGj)h&s zdbdi!w2gs)4YO8k{^MWDO2i9o@YWypoy2cLHH8Z@$Rly0kvWbiYXSBrLBGw(@V}}%gJtQXLH}J z(<@sbb?T)2sZx-NqJwG!N={op-8R3;Hz z_zuO8|Mn?IgjGh1Ad)IeAyr6B>@&*b%_bQV94RZfAwH&xBWUc8|M2#Jw8Mu^nW7?P z^h|Xvm7J0E;rs`3Dx5zmr$l3Pto%PMSsRB3U}3~#Qaq(=_UN36vI^c6LdkZ{W70AE zh?QMR?tTe2H6>u5GGa0@T^DH3=;{Vc*OAY=cMu$XB)dt_i^a5zbX@Bu7`+Chbuy+o z082TCx0a((mt}vI5uME~$mi2W5eX3T(Y;nHG64@ec8mVlaXaJehJX`C*l#*j#2=--DOQHzU zo?)(%m~i=t&vLlvgkO5s&Tw$ zUolujcZn2RWTiUmu?Bx~jgek{6`HjRkD;Q7Fv%$y_>x5E^#BBET_UU*~iG3^b-dF0ho;(qE7N+2%oQI6!rxzel5pzf_D zeqDP}4X})^9fS3<)HXr%5w}^*A?vc8+~X&9-)jCuSA#q=a~>~--#_Z^g$gyegd$VmsvFkO2I#(PZtht5b?A=v>NGJMb;j-=0S%5)mPc(YRb^ zh!J)bmneHczh!SMxA7~eF9{W)?RGr*016%L*e^+X{7Tny06gG<1Sr-oN~p8aXMLOz zvb7E_7UJ6NYxi3kl&y4FAixZ@|B_iBQA9GY!Yax=sW$M7M3nYR-cwEdgW2Gop1fB) z1v-z}ic0>WYPB zB3d29;~>0kZ?3$D1ZBioH-EYCYk>8f7Hd?FN$U#7QsTXu67B@2Y{Cz{oy?6rq=Q__ zS&pSyOtaO`_$O`&QPA|F{JgMZrVONl#!wP%J&|H69dvY;T_l9IA%@CW6sivdynukZytG%CH@h?t(wyQ$37>sd_e`P;>;VS8^es?bo94m_JkGp{-DT&6I#>~-t*m`J8zXM z43;zwOS9bX&IyKMp{v8Pmq~GHzphsccGs8ee@f~s1vB_?UJ3I+0XVbHBJJ#rV(4nKL2Z69}HjTep&EXo(o|h7-N7$DVhDTik{x ztCKK|F4-4~7VGh6m>G1wD$KfhbH=<%mwI~n7Y{X6mUTGh44e?KRzs^P6b})7waK~P zGgNs4tb!|r`r9e5j$52>W6UcEZS4nqe7>Qr!|<#1aJp92x48GhIWTBeJZ5h2gSJ>9 z>&Y{-Eg5yO_s0H=>8zejZslLN^EyH98N&|o9g6x ziAq+Qfu6cGa)%9)`hQ~2YC83>j2aX_JwreHiH|ttULD+y7|!f#4>siefIbRm!%BgI z@z(lpju^d9KUZYAZNf(NVzk#)b6NM)ISx<;2SWOPdw_mdxc`uya|@~5mPG-{>-4Gm z_sMtF+nbtC+gIL4qk{YBW+Tv!%wQ6{(mwt$4**y6M?lhb z>NHP|t)1TX+I+~`L4t`l`R$HC`=tnzacNuAJ0!WaplS_PJJL)GZH#^B>5!H|RddYq z;vhigK3hVH+iz;xk7=BKi*PVRDXY^hMO zX8ty928UVfHjWhjeur=4endK(;S<4AdZWM(TB!7an(g&3(`oJO>V3VHi#&;w2w0L*U0@+ds3AwGh7i_4QfTMmf)McnH+n1Spl@^GAkoz#rG$ z293A%!g@0#ja8`lK2&rI$t{4Dyl3$Rg2Jc|CPq~vTdgW{qLx0@$h%Z!*I=GL9h4@tEg&sCBK z#V@I&7RW9KL|OekwV^d~Zn2gswo5g~N~mNtPZ>I%y26@WE(l7I(@@s5k#)zXdCh86 z0Z5!R+5Bjp^I~iB9)B~16-2hUS_gRUD5mSh*cxoUlS~itVr>>X;{>xh!%%qGbE`fu zA{BM&AYeJIE@Fx}3w7Zrxi5jn+KU-%xyEM9uzS30m&!~1@g;3A6B?Zvz1Zkv@V&8k zzu?u~M>{tjke7#RU_cC5t^|VMCbWTU@8$hx5rw%U?ABN%| z#6wei8_tT$8kV|E3W^zTLk_dz3h9_Q8Dcq^w=u^S44mnN*Ri0zjYc(Yg(>g%;caXJLo9%fIX)SR&Js(C?&%!e#stTP3LByDz* zBXFR}=rXMDE{dYQP+l(S?=w3c-nhw#;8ALC?TZQjIMQIPwItE%rD$7R_GR+!P=Q5l zgH+F?*j*wP+#fmF!E070rO78rCw2(*;FcWa&i=;NwBw33#Jh)YmdF(S0UMFa<5??B^V$)>)wHN-Zcf2^e z!MP-Oohn_GyG9M8QS7?%DZ|lroo=qqH2yAw87yI-xT?LJN6u^}pZV+kM&?S-kcJ-k zO&D3Q?f5azMG&>9XRuc5_=;eFtA#%j$GK^#oRVF@vmRA|`{oZN%A9&EtpZo6FYk5b zOLN|8eT`LTy#k#7)+pUVkDhO9!xHzmGDBxQ7`*&`cYSy8!<+^X5l{K8PB81`F)X{z zg>&MEJ_FIbj*N?t(XFLFie+*F;VwJ=Nt9m0VDpkKd_C;YL`MU3+C;a0@|nx7b2jr) z&4f?ByuI+j_o|^%>}iP(!u1qf3tiGkSc(5IQ!($NUkb!f+vwMca}$97QOXSFrwxAk ztR?6G<5lStI#>V0u+p6F+47P6QPH!24vsEOx*C8~WE^@{fsydFy+_DwJbJ$e`d`{E zOtWw1-KW^kSfO>Uczitk7uJOsb-{={RvKr+c_K06`<5l=n1$gFv?j^)G>*xx4Sml1 z23UcPE{GS5E4E*w-E~;lb67BJ&fjb{IL_ks0K6cvTr;OvbiYFzZt2oj$RGDPR|y*N zgKBvEMGVu7x@p^-r$b$n))&raq`njy`Y*WkW@Oeg=GSO z2gDP+RPZnvP#ET&TiW!Z>E1cqqljzHQ?*aT`}L4hz$c{@;LMO!YCqB@h|Q0?eK+3E zrF4vUy;se8$ikv}j5?tj&sK?tTa_tzgZjzq1?|<*v(r6?c>=o# zt0n{-Jf3-jcQZr}9g~FlZ<2)WNTxcDji5!HTfH(iV^KJcn&6XIupWd8QiPlT{ylS*3hx$9$$owRbxz=I| z$a4K;gS=XQM2AJ$Oqf!PI#-Y~_`YynCQ+p$HscG{*_d-2J=AGP5KkC)HdvCwJ6J~I zxHmXw6evg>=R1!Jb7Z$#yj20y6L7q$=y|=WIw7bpu6n%n8V{e0uVF}eOgvd`(I%J1 z+iDU+p=05N-O?z(iW%a@3Oda<=Uf|(qkSrCjk2L zmzdC!E#3t!S;eCB*QyM=G{Mvf+BjD;-1fzyny+T~3FZBX`l`5#yf80ZmhJ|~Fha{c z8DF2VP<}N@F~T2CQ6KJ#b?L_uB_<~8z3{d>u%WRgC>+lExmCb)L|4`{*&F9XaC3c( zogP)2CBhp@PPnX)xGxN5{DN0YjrUuQUL$sojLYt!q!PlsF(=@K-~9kT=V&;h6^MLL zca{T4ig#(J$7m@A8DVDUCL0HP6>1b_55lT&mn5ju9i~QbZT4?pNDur45B&Y&LGay) zB`Ck_TQ{rZeXaS+$ z_S}~E>Lli_vP<`?Q66flK%t)L<>)`g{awseUQK-Tz6gn#shWwN{ne6AIu$vqNaEFc z5e>OVue@KbjCZ6)8dIyY@qCKB&%c%OeUlN0CiZU1L+u3M9CRWogrC{>n~Hn5U^&jC zr6Yoxxqm>4VAr@0e7Wt-jaQo82FpDjne2SWRA$3i6D}9P-)P!`;?44w?9)I}F=&x4 ztmn5H&`FO=k#{9Zd*PlZt5Wz=)+~~~KiAZtfu)U%HBj%tRvJsb`v2~1xgrd{HpEK& z-_!cSGq>l*SRV+N4%ueoNfwXvSStR|=%60??OSsPhv(RHN48+R}Z`nu!0 z?In_n?LYdM{mMUlM4Y_KpTJhHj#Y;1(TQ0MVxzmQBg;38Bk?W7n}K!$M!w4#^1N7U zJr(gjBT7H?dOTcs8d@O*&bMNYg1A#{q9xJ~gMqROTI~;73;g6nfBeScAxImTG!cw` ztNe5e>h^(s^m~9nloKeMdBY;@_y#=RteU9 zDA02F4Bcq+SC>=83hw=)F(2?Tk3u89!$ENJV?gK#)K1~}-bN!B>vdSsky&wqmb34Z zmM8f&7V{`{K@`YrymTtZ1X;UF*qw-|%H+HH+ zL%oM6zRhAUhxreW)VQk5R75;}*6XSd%(nI!-(Sb!yJ0>q=6_(risEp~jN)bwnM<-Y z6h+5_nOSi|zNZG?uTgliBqDI>u;HivOkb=nyq_1WcaPKBd;30wDR3eB*ay<)Ud2EVP0;{j^St;lKu>M%WECaswn1jxB)4CU3*$U}y z_E2!Ta@RkXcPpW5oSB%24PriM-%_$Te2x4mGia z+Lb=wo=)xfAIWHc^*Dy5(y~%^#@{r&^;VcZt_N1ME<+3ch-A$V!;GNT8Ue?Hw~S=- zIYAzl`-i0K{Y9A_eWpr9;c!7_(OQj2++=>^`C?bWGCNJ5Soq)O8kxbg3+cWZ=$24( zsiB>aRo3s~CxIk8AJ-KGI#heFRjU`l3;b8aGPp^WZFExHbVs!)gPgNJ&OmT6l7u_A zo}-M^RAUdGJ>jW&v%5uFi5|To-46-p-*-?>{EqY{9CSlS=z~VoB4pb3S2#<$Ioe8I0L+CSmVAaDszrxOZthQ?x z(kEPh0T4fJG|FJ1mj*7Ms$y)=DR`Jrtg9Gaj{)Fq+B6UPy&-Ttb-mkIF|6*CYSJNFUI5yA31B6xCk zKHb_Y1B)Yftk_K7(H<`=gOvlzcMl!SGM{w}@wxhT-_D)4AY_K0yX6~tD^#CYhM&pd zgqAh~%TDuQw0_M8QBe zintCWn^R4SnR(1E+z2%W+1E=p2EbOFM?-ppufdEK{7}lGu3P#gCE^7sSOFx*w%X~i z`set|4FFD2%n#a?W*)vuKMgUK&?^ZoNLyHYEQh#nv~d3km&eT6bqJam8{BfDsJl#= z+M=K-He6iy>9eF#nAW`9=-Un7i^w5p|Cnd>h#MGaA}cbL_=%nawl;x(!)1X)PHhx$ z13G73y^)_N);8@++dCZ!5DawIgl^|r;?+6qs@OGS>n}9I#bDOiR5v8p@U%I+f5>8l z-FDWu$0hjS-&IE&K594A9ZRy5EQV33L34<3hDy2eQDebBl~*hLjCL2)t3PejT<$Tt z7J&9p_TCJ%iN^W4r4^W+2`N$B=LrHE?H)o_%Ul26z0sjzTk7@V zFQYu^zQ}s}4R>H=Msq0=pc*X%1b9(H-OeAyY~!=4?D6@oRHSFeF`j~Tl7UJCz$j-v z^hGzhz!1z#0Aec}qf;;;Y)-P6W(hAWjN3^0I*KSh0Mj1oNxFKEd?TvaFp{CQZWp`t zx`tj-(}IhHsF|;{`Ap|&o5lJUe8s*$%0&Hzu$rN(RM1dl>csho?UWx1;f(XrWAuK#Vz((7|hmd2)SD$OYX`@mJLC^C1H~-yw zKR=*u^7DwJ!1;eL`inG50z>(w5#m>X%ce;;j_To#=x(g1fiUH`Tc0)JZ~#m8e-sZU z)n%ag@n!*hcz+gkovlB#iW{Zy#{SE*mE~VUAw0<9+|j;dYNP$(*dQ5a6OB6R9?Hu^ z*0}bL?X~ZBD1Fr(Nm>Ni5Ih6DBDt$aCEf&wF-yyR;@75xUaXuTs~yU3MwknBjPiS^~^ zRVfd1Ssxy&;Uw`sLPkZkC~^hCytYCzox~u|A}hEiS(_Mtn7zL7Ca31uTG{k7iwF+v#{e zC5tjZtI3oQ&Ej=x473RDh{L$W|7eqcH4!2S$jO9w&27*iyj>xJfvJ+hF9h7+agcwA z%v?@wjru9b-tSKlM|Qj@re{PuPa;>CA&26=p@N`*TD&_igMgz2hJtlr@Q7x)8pZiB zMGOG>hY*TSg8hOk!kH6dTyA`AaqLQ`6vQUv{+z0=vpknc4^WY15)=0GPKLCLx>=Rg zv|Q0z1bLsk~%|fN~^$LLkMlad1J+#Q~07F|?#4;orXtrwz*X4U4FD0&N_z zO<__)EH%-!Q`jxsD4Ls3Hs7X7*ND?Ol<_K55WEgGdIGpEncNAR?~HnW?K^|w%d~N$ z_4}kd-Izw>jmzjmu$A~hD4Si3OlUhQ*2yN@)`68DQ;4by97 zOpx*x{HOKD3colN2DWAyZIr*e{Zon4TAhxx-a)TXBad^5;-zeXAY;IwyG zyBgn2u21(_yP#uODdi?G0=>C4lUg=!%AJ^E>FVK)RZ=bE+i(_&rCHfTH-#!cHB>s) zJVOcVxcAM z+$!T219qg%=_24DBh%ih#PUb)RQVqg`A^lfKYtefE4v-Ts znh7#UGAc^d#3JGR&m(Kro%b}0IW}T8Ez7LnDfwjbQO8M8@hP`?-6>iuG546$be>xGURUrxT-fGlm{F7@gGyKr6t3#KT-$`ttRo*- zVW+=Cix5oUGpx)MVq`@fvdy21CgI6=bO;QKZx|_ryk#ia1`_lRbdn#QJ2D?j4x4=* z{K#0skyfy+iJW4z%bXC{m@IwuA5_wNDh!-jKSsy7{LT$JO!R)?IeW?YFY(-1;qvb2 zzl#}r{~V@A@ZKBX6oe-^`!{HUAAaYb)&1u_<87gcq0eWF!Dnvw`xcc>OUCRO7*di9 z6H=B18PN^QYlpNpBN64(#3V<}GNX0bROBhXGu}Aw@2*zXVfHAO!=GUlfL)PMO};2A}`b3o)c`a8QMyvp`}M`TxrZ%*}*!mH8~~TTM0T4JLI$pRS!t~TZ=qbt*yXe`j&gXn(MXF@Zy z28Fkq^eE#p=%8o1E}njsrLj%SE?}q98QQ7L!l(;FBUErcmaeiGaGIwpS9GO`I0S5E zDR#5|&i-z81y^|Q&ZP7fk#QuUs-@lb+u7s+rxo z?EII#-i!_HxfW^BuNov;twmTZkinGswPB9J5e~uP7#6-euW`=)8Dax1CCAC%H#GsKEXp*@8NS$#_Nyi z<=zBiKuv8R7dZc-KnipoP&TLH{y6Y|N^Q1J1v!g|kh83M zK6i_KGu%o!;#XlBH0t*qKlI>E2h?s@Oqp4;Oi=~z*;-nj#&8kcC#&6Q#Y|M=QGYsC z1Y5z$#!SgG@F19POf=rEj-9i~t#za2mp$q;8|mPeJoLEptd@jy1RC6ZAZGyg%fQHq zbjQbJ4g5JgoZEesc$qB?^3P4?M(^FE5AfX^<#eds8JLeh!{!O zfpBKG6rNjiiQau-?w?yWUBmFok=M!Q<>VB}Q3rT$ou!L8-Se0UE8yZ4u=vBz#@ZJP zBi@&w>IS(c>0$}@5_F7ngdKqw9h!?xLO+;la)3gcDGy5J>zW6vld?WV20@Gr3{yw7nW({N##p6lYK+uL@b$xn`Xfu+9J7J_O30tVgVB46JY z?7TZVDJh%_L|g6mHpx!NJYFGu)#FlT}30ppH>3#=V)`pS7P!c8nLt>KmBwX`4>-21Rp1Qc&^R%`-j(A?i zI;{IL`^Ymq)+SDC;+i82+7xU1W%i4fH~lhI??ohu!#~x~eL9vVVwvr9!Phj*ibxwE z;X|L7QM8)pP0;yvryj*x?9a^587t&+teI#qs%yq95KXu{WVasqri1*<+pE2XCsKjB zmbFG%<2Rg*CQ1|m)B;4L)S}FPym|*LxYV$@2y%m0SY2zP2|8q<0})~n?f1a$#uJ}q z2lQKyT0EfA=#Mb)zXJ&f0k?!JqQ8+o5?x)(waTlez9BrYn2`+|slCa9({C(IyWNr_ zeOKQ|wb?AAE815(bH-bFU}oX>-_xN!>&owNx&1s)`1$l<#n$r)uNFOPcYmLu)|hq= zd5LO~3wUpOGRG4*HaGzr^ipJzKR?a^9e+xfafon$PXFrg%okumVpO2h-XRZ*xpub~ z3D9Zxu#MY6bsZb4YJ!4cDd!!_4{jy?tsS&!m*8SwEn;28N`O0`Y`Uu86uCYC$|(GR;36wAq>Zl2hVZ4}XEo zT5-zd@?WE>x+j;|$4^{0suo|;=lg0X0@$L{Gt$z8mw+|?^ET=!r?!13FNeWxV2Q9} z?<&bYmYKilc*X^WfN6VKe-v38X_2&tg`7gwAVst1(k~r$rV>i>jNsjA-smw{tPm94 zhk$v(jGC{d2Y&_IicydbUZZ$D{Qh{rUX=?42}h>4R zK(DnRLwc{doZb_`n;TyYUe7j-J}T~>9*n9#pF`j~+a2`-wI?j+fYNwz-N?kckh0?o zWa6Z#=4f3htrQ{evKtDVEt@+uNakidJ6~ib9sFF^&I2{?$o45|+y)bbKkYItz@R`j zvl;sI&rd=BJ+X(WM`ht#JW+FP%bkWZ@}eg8v`n>VXc_yZOhyPMS}B4Sx1Ug5K+BEp zjMYJ9J&BW3Hwda*Ja_DwsN^MIYZwBjB4&(Jog&*HTrr`W_&L9c#dyeZYTHC5FmQ{2IE59 zWWLq=D&Wq3v%D~E%4@Ft3UHSf67L3n<#wpz^pD?;Wk$rLlu05L3xVw!f(0W3xx=jy z#X<~qZG|W=FJde)+=Y|razy_PpecRlwZMa%Go_b~`qA*6L1yRvfFKD<-c!e^URVJS zH?_^fH?W7F^4^M1DEY%=o7WQ>n@yg5SFyZ_z7assd#W#;9y`XxC7~a^)wO+tJrehn z?rC{8J%9AJvf*A%zQD2YtRPOo!m2a3`*err^QY>243Wq&GZo8T+u=mWdZ9eX{dba2 z=Hc@vgY|(>pZc{-h#~%^>c6#ZJDug5XBTCrmYyNjsm|b?j*sf z)~+r1BldlK&_G^%fiBjo*Cl}&b`Vt?qEEm8N#6C~i=gbxi?tBOyIyzO<(fmRjZPs!xb1$yxqA!9H(jQt|vx`abmL%81Kmcc7#pd$?Y^2lOSWdGfxSF zoPtpe@7vL)tsTPM>11XmaxrIN8*p=&A(1D=VzBv`!^McO|EHjQ4Y2Z^*Fd4@Ox0`z z7xlwp+u&EDD0Kk03jmyv6O2@4&?caPIe z`3{tOD0UUT7kq`VQu3@|K>hfNrkFZz12Rl9H)jj){xuu#m;pPX1n&tX{ixhZf zz)?zrkul>_=4vLkuC!b81=vgf^DZ;+DP|h`x_57uLD)kQ z(t^{oL`UZ;o6&T?cqR6<*9f zb^C)Fu3ka~S_HN|j;}XfA~Vc49sO7EyA1YDp=Y5Z_;|5w=9@_?qTMrCg{-5#gfi=rQtgB>*DS8|1>-4fEq_uIU_T=}zHQnR2@z&}a>MP=Ly?ovE+)HqM zclGw{ANah)u=QHs_6gSOdtMs=0diJcj9^OAKvB0f0PGA`>DTUek)Et+J!IJ(%%+vqUY52 zN_o>S9}#KvL(l{N8F+g;i1YE=6LSTMRTD}>w5q8d4WgwW!!G|u_UuI+zkKrcQucNu8U-#df93e?TUld`l?>D}LMsK~l zxhzp4B6#mnZYW#+s^0pdJA(bANca4RyVYB zeo#=q&HiIk1W)0AvvfOVEKv=4&_K1J!fx&N6%XiR1YtjDzYAQy4~71&8^G^NT76$B zj9yy516Y}9UqLF;o0t(N#5@&0sU5)q9AyF{q15NwX$Jf!#Jpo?qhH<)|EA|l5ET{O zLD@+P>IX!#z%~L3;ef;&xceP(=^mZ$gEJSU9ELaP6&kefIb%_-V1A}+n+sP|f zp7$PW=O{JI<+)e@6zpvzp{ro<31FoMdmK;>D+Cbs|sPBIxPs8u{{wCGwI|eUR zw?pt#9`?@!E2D2Q^CN9vU}2|8d%cj1MaBcp2C$6v{sGwV+Z+cBjuCqqoeOr(p(~=C zn0D9yb#~0NuA?#m=Ss27F{OA4;Ap!cE4hd3Ec8dbV~BIj*ohd{w4HCJ417< zluxr%{*Y+OMP4_3dz-MWtPadE{jfZBTT{xg zUTB}dlHz!&zeU)GpCGbGXvDbL?yBb2t)Xl1Lc0*wtoze-7C4%_|DDik%0+MO4;U}N z4{BqQ+t5vrdd}lu_1~MBsY{NulN~ANkJ_pJUtwnf71h`7|Dn4C2}vcD7(#krNKvFj zLYko!sUe3N5D95X$&pZy?oMfumX4t$BxcAVhd;l!?t9;R*Z-ci_Sv7a<9qgb*53P^ z^{lh@HseK3vUI`L5wBxq$7>JmGuG~IGo1s|*UD`8;4>^1d@;r*>1&413@&pv&K_*H z?!j+wZ0zgO_c|7svb1=)4@gkr&uYWJ~by z*$cfvh2{}`;my~%i1!GB^9SjgT{!tH3Z(_fe#uxlBU+Z#?kI@+UhcVVE+r3W?`-!w zH$ud-r8&+CL|^x3o{hgwo7b1dw->^bHL zqsFz}b{)41uDR*DWE*Fn^K&T2F4L}rQ|`jKr1Ed-0-Iki!K$%%+Mt8}yvt)hgcP;B zn*qL~VG+ojq9h&(x^ zJos96>gEHzkZbHMCm-b2uQvdn|m}Fz%rDd|S0|ZsE)3B0>AfeIGa&DA&R41)sR4e5`B_ZqFiu zku0fP-%u$8P@z%s-Hx*C^h7HuUoI&@l{fbTZWIH`1GhSs!cXPuFdf>~ysv#3Ps968 z1E0cghRgGFFW(JOzIC0q-IaeIJDDLw7c- zh>bp#YeID@6J`7O--L7svia>klPa8j=RvNmv_P6Xca_QZHv4u1-xHS*c8P@*d-&;8 z>rj_3b@pVbYw*0*P0i6}MdJw-dMRSlpM35Z28@Xrujva8sV59)3qiGKNgm5%XLi)i z*LA5t_`JPDSo#KG`R)sN20X-lV9Y;fgJgUjqf9}mv<4oy+{v*-U{hRCA?PW8XtlgO zea9oM1yN=OfmZQ>Zq(6D%Av(l3r^-K+M78=U(g0+9BIvl1&fy*l_> zYcJg~8-^4++(JR%v#`&49vg5z!O-#tJA&NI)r)UI~GX&N%(jZ1kZs3bh+qN7=KDDaU4*fmM)iCQOAqi68r1A zO_OQzj>Cl_&3*SK$^6?oj+N7xd51qJk*!wx@Dx5kn{lu|AaSEzebntHMRHeGB{141 zIzyzax1vvnJ$F}rM$1Pi(N%xHEUrUs@}s=^6DI2|^78Nl;XJAi!lU4X)_vs3-E^VZ z-Qx4!9fdWu-~qf%lAD#ajJUd+B}4Oz!ppO5$nTXHqIu=TkR~(!CZluDw0oY?1bH%9 zFMl+(nCy*vY&aD(OuXXpuFqO9;GEox!CJLA6`RBasI4_kc;JSY36=+skxuXO>I|N1_Tkn(sRDb2W{fc_%}&oJwh@dEBPFBxctR z2?RyVmwx1{=T;BYx9@jS@z)i zB=mID(c?~(d3DslzG3P!#K_WJ`qqSECErO*fF6!?A%~x66sM5EUDnVy`U5YH4U$>8 z4YnJlesp&0si{^y?~yH<%g=YIGK74quzvK6OnKt?FKIUk^Z;y1Z+wGG+|)rhgPJq)a7bEsbfx)!&kB9C+ZjE zAEWG=N=l;@nUfzjFrG|m?%Fup6mTip26c&7`;PZ&F9HEO8c&~ z#5w7VW2LSTAw&I7p6?^;=ijs`<*q7EzP3@Hyx`tS8jwkg+!D4E*L?P7w`8K?6L(bv zziLJrcav^UQ9`jirKW3g)#Af4Xr+CTmWH3%r9oc0;Ev9uO~5!q(X*i!rh*rUtv8b- zMYL0XehSR_++vZjgs>`mCwjjrHk+*Q^^n@U8RqXi18-D$HDU+UW#Cm!(M|7-#WMJ} zh>O=j3lrZy4KewP7CThe<`4C6P%iPfOGu)-{2xxy@2E(yA2iM|dzHUJL^hgL(tO}) zw3&cl9vMw*E(!PLwwesJg}{AX_Kpmy(m+z}l1JRd+|2%aQ7K`abo@q0k66cVbIgz8 zX1*#{`jyaa}n*n%1I~Osh?4vIxo>u)Qe`jpz}*CVpG?UAn_==BQ|eBNF{PU zss5tWDNh0P^ARh*etxY@0L9YRcNfA0_cl!H5@Hl;@7QyGD59_u`Vv^8{q010rnO{B zNJf*7jx%;vr3F@Yn(#i%I6&)_J)_BU)m7oBS~|}M1XY_q->EK|Zq`f@1{f%&?n*l$ zE^3Sm?p?jwR6j5vEfOPFh?db+g(!$H2_A=Ay+8^5Ac&NR&CUCK3h{I1D46^cAovZx z^5B`3pgwO-K9K)aO~633S--lfqkiMuprN0ZU%u<8@x<5c@={)Yf)fv?_>^4O*E^ve z>V+XQ{=c@%C>^f#t@({g0%S<`r1!$h2#p=B3-I#z#$c-4#?S9czELxI{4*m`?q&Z{ zsj^druEejRI+<6dAIoN{#&l&~iYL%J2E-@>OC^{NA}1fkXHHVcjXK&ohR3EfRnL)T} zmU{b3qdznBer(KYCB=0tlOle>P2iiR^FKXyZAM!~D~m@1YbUc8t3BseHaW!~7JaJB zosJuMZH_cu3bzp1trsrI&fdsE$(p{U!Vv~KPbgXTHP$NN(5f;`s|_3|3Tr&`6oXyZ zVSNu8%-CuNCz^L;lbtrD`)3RsRx2M2E0wyjDV0?Ug|;hm)>@=Dp*CFT3w-B)1(uu5 zJh}_6)3GbAiFJZu7uCymHk^$slPXJV&8(xXqwMxgt!G~A-KAIaiU}iNy_B79;7lm9 zU#nprNUDkQE(e;870A_Wk&srO>M&$zOGg^{NvRNye(I&4Mm9ca%YC8Wy~sz;W*ka!eplMU5IT@a?D-0Fm~M;$+@{>ueT-I&O}5Bq`S*LOp0S?X=b-d?O0 z>~a*V+BO@%*Xa{MUgw@U1Rj=`s!!Z+HsX}{x)Q4|Z&apLPs$y`xko5M$T}g5T1`CZ zY2Rd!{c^8JeNj{2tkSCCG8DdfmEIBSR2-G)H3F?<)B2;H+uAOhjQP+RV1GL&0vcO4DcxmBjK00WJ(1+w8M4ww#j_RrQ7t&L%@&**+& zwSV=3sa7r0>zA#B6bfCO^%#n6gK-s=CBLPxT>O!IzOWIm^{i*)jIbfU@H+ z!`+{y$$Dze>H4b9k^0IhRQ;uSc?fUlPXF-L+|kiT*3jDV;*VM9wc`W*!x-aj51Rsb zX$|A-wgvw+s4B5dmI7{+ZLYQVscPvSPF1^*xKhQHL*?hkWb7!A+ro%a3*&4qJ`2`*1*YT5+FKi|Cd96e{-0Wp8T>-5p z*N~(6N@U2%cG!jQ4AzU|%rXG<7Ws;Dewvb)y@V=!FJqkIII|6zpgJUIxVwO?0N6be}S2ZrLVS_<(s8%iiZ|`HA|;+)>TRz-zXu>*&ENV37+C8 zGD}Yy&40| zSMRv)<@BKW$=hj%y?aHh%Tw{Y_u|Y5&(o8_Ak&PyG6b}riFxXtCyw*%D>jQS1ok_h zm^F(lp>_=d>P=n?-hLAgWtX+?&%G?G3;Z<|w^9E0crL%DasN%CZpQ7FriR~>-6$GJ z%V?(G^KUfvsbJ#O;?+Fzf+M~Q3aWJb@jUocsAhV4@udxIV6l14Bvaz)^aW~YAVD^0 zVlq~+-@FK0X~oBIp8-3AN!T=8A@8VYGe0f&;7jtHiFAG>$<}bSeFvn?Oj{np_vSeh z>&zix(}W(`aIKj5iVR>q)&=MBDMAFFjS4Gv;Zx8)CJ)qh^?$cXYl>LD#NXug0e4=L zV6_2&U;sWoHKRfhAQ%^)oLWi&fD?@WOUHG_l7gCDm~pB*>-JygGREB>RzYDn0{B(b zqe_-!I70YMI*Mv!GRC80xG;i4(sdjUc#q@)4iE+O132)4{spFfTuaJs-K)eI zxIQ!;Q2=v%^n)M1mqR5bZYRkRH65=Qf-~%Y&07wBkfFN7|oz=+9=nDYftzJX`t`*`|I*1u( zfq3}|KvL&~(I%Hn`1L#&Fk*FnZN`5hli++P}?}dYj_Epc}{fS?gXn zYsS)eT^9iz;b&n$C=MUF0t7&cr^6WZ9Y9B@0?9dUVLtpU22jGGCJoX7yvOCB1LOdR z2^9E#W%pw=*uH@-_^|W?EvY+ULi@Hy^1Bpff85O!#Bhf2AJdL%6rw~vLq4Yk+2N*> za|#8;1C+i8OyC{@?&G}2r@o``^k49O=vmQw*R0N^dF--Wh!Y0(e)WFWl=P%{YBR-6d<4{(j)^uU2$v6?ttbyVP;UFC7Bp9kIJsM~htB5oUf zN<;KdiJmzy;c+?684G}zTY(QpiG*4`Nas+Jw`d@BhrBLThPyqraNLWZ>&1;$a9FS% z$>Zmrjc|wVIHV|4ZJDXq?@pzmDQcr?BQbUdGhaY9M%>nRZ@Q!8=5 z*CAPWy8I;aI*Rso==_cUu$Ny<7h@NT;0=E)%EkptvdU^tmxvORPD_U7d*pFIB+JhL z+PFS z{}d@qRxD+?NHy`G`}LR5t>)-MYgbX9kDXEE<~HaD&u{3+Z+j;p@V}Bm7^Ignqc{2L z#a}Hv?=_MS^qq2^_28@d!A@T4nvmz-Dy!qN?fG45^)pQ-3$v`;#tucMW}8{2&}Q6J zJ0;P&(rP8E+z{w1U@Q(ue>8Nlx|MN0*rUCV92^2K=Ji|+t$xqS90CH>yma@D_Xbv1 zx27j7QZ@^~?dOx%YY}q#<-Heu4!^hrri<6k?c6-B*mrBkt7Vd&G+?#cuEs9GvFTOz zn^BWpw0?|zh-?AL>KtoinKnZryAZ?3lJjs1|6al3l^yntn;qWO;=E+)OWCEG7q_-1E&A1Cepgs`cf^49*)DKak7tjeO|a$x%PSgz}X z`N2bc>>oMQSQ|VH+uhI^>Ez^R^}{vRr)=cLp#pm%B#_+1=e%{EA`C=ngfB74DGCP zAhUMkXr7T>y+6>Ci>>W%7gx}u`KQdTfq`{C*2HL;qCW84eH!q&+gV~n{5kY`a$?P8 zb2AY;clQQf&z%^a%8RF|Thpbhd`?CWhULUuWbhl=_cVGfpMdAZsNk^cwL`sD6F2b) zUmLx%@8cD~UFK>Fbjc6aEih-z!~PJD{$M z%dLy=Hb)ou%-PO`L-g;cVgiCl3yWA;ONmH|OFg!elol2fmb8@;{VNu~O|`R@|G!I^ z0bjoMwI!7j69F2Uh;WE;h?@O>Jc%OWVq*X9Nfey!aal6H*RiseB=S2c?e=KY{Ohc{ zL8trlHdgfZs?O?pI{B2-Y*F(jcr0tZQZmk5`oqzYJzP!x{(CeA`S3osSjz@~*{0N2 zwfp&D@pqIusdGn9^~+Y+2R`zVjt$#reNa-Lw;5h@K_0ep!qVc-je-b_B0`Pcs~Sc3 zr2V)fFrX_iBq}fn)v$&cSgIOW*%}PI#`3=|EAq0Yi}ZgQs~4p-7BgU)CH^Y0_Em=G ztJITM2#T5bn3+$SGf6`;nSwJ3r8DVHGbwvB*{m}kvu4uFW|9|kbxN$EcNfjpHu#dR zy`lL;epL*9)l`>N?3eBUA}BSHJ8?LaG29(r4N9lxPTnV)wI-EKD?>kxO zh*{_!TKHZXUG65kCbqjSw7v1dWL0M^b)^YT;p|7rOi zzT-=aanomeite@s5Pbt{&nZjIDJ!Qbh}o2NfP|&8gq5`fHS}S^5YaYYP8pEq^hgVF8*ZhT+zw>D-W9o z)ANR;!G=u!hJ@mVbjOC2orY}YhL0HyX(kQH^9@ zmd=cpp81xp=9a!o|Bi6~?mqwT1^&I8{++4*J=6YO_5KW@wUY^Rm^W*VR~>Oz-6L1u z%ddJ-SDlE5_b=j`*#hNL{Dw27tw@iAfkz@>vI-8eO5vyqzNkv6mwE9o?n}c-h8Tvp zjUvAoh1nX#z7`lEE$LS;`T3~i$D5MjdnE(LB||bLgT5srgl`!`IYSfXp1c93F;|mh zR54{#6PQ%pHL0eUuVS6A#*?k0m8~Xgu3~Pk{(I-vrqjAse{)&XYPH{oW$6fJ>F#9t zp2O0+!qWMXrDu$#t5RcADs~fJYn@ALgHG#r4WFrh>Mt!rzb;USm~>RNbhx{8+)-l? zSz|<0+>||@giQ;Z zgdMGft(b&8S)C1kogMRSoxe>lBBVEe(tmlaih0>Fc-cz!HgB-)4w&x_$wyCj1@4aE zu=Fdk{JhWd1Hv+VHss2s=JvQxWo5cN-%Fst^$`P9B-NFv&t2Nk^>*suE^x!0cBS7G z3&fcG@VU?SgyA}pX(({5yv!seJdsARo6uNYJN8tbY&+cG43 z{Y7u{oFk~`2-GEDzN~L|Bx-?{K^^kA9MPZ-a1ci#h$kx}6a&}3eUdNEvJx&gj{FSv q>*aU6iEoIml9|W<=j+Se0|NE%f!f-UiU^B~3Ja5RbE|4UA^m^I?Y67{ literal 0 HcmV?d00001 diff --git a/guide/ppt/oopm.pdf b/guide/ppt/oopm.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc61cf74204903dbd1b0ffcc8b6e9fa57c15a722 GIT binary patch literal 168704 zcmcG#bCfMXm#1B}ZQHhO+qPY|Y}>B7W!tuS%eHOTci*1rwceSxd%jt{rvJ%vBJ$)u zzu38RfE z47&76rq1@RPR6Fr1nhr1mFUGRZCp&9=*4UdT}(wxjqOcL>19mq%v~%9n3(zapqyQt zObuxN?d$7uea3upX?m;Ou2IsPvsGyS(nX8x~AW@IB^Wc&a1Gs}O6XqJBx z{eOr(24=>8j=m+GNxMxpl&u%)SK!}oz5t>MD7HW*C#wSJf@seiPUx=Mol&2@^yP%4 z3E7yEWJe@3FyiiGAN%u11vHqv#E}r63PqSk!3Gm3Ts#4Xz+HHasY22PK4Q2qrvnf* z7;HL3B^ms_Z;`)Te3T~l(Hak=3+3_6!szXbSxpF5Dr7vE%@lZ&y4tEjY?Ox?oiU5V zj0Vyt-%XX<_cVki1s8;MR{gkR3rD0+O$<(1a4|kRvxj=; z=R75jO5sQ0r5CWnqK(PMyWU^we~ui$liqe18@J}JRy}Z6(5q0w5FQbIzJaEN!SWQf z!${E?5UkUs`EOUWU7oh5$vGtEZS%0Zd|p4936pz1oIVi0e4$Hf3PYOT+WEe_1W%Em z33qcS?@AKDEocMwJc-em*Km9?5=M5jHa7TxGj^y8)EVt!K-JOXSNJZi+WufQ9;?!` zFQBf>GziqkPeUo zfmFF8cF$k*DXJm?YP^nb+k5mdsUylIh3(D@B$&fIy(x!EAw_h}0Y^iQj{covvHT*` zFu_r#YX_yazMQqVd(2$B`_>Vu%<2M2DxOEr*(suDThCmVuQZS2+nzFVD-C0p7rgn9 za$AY{j`Vtk=*jx38BlI3cMq+$K0wdf=7|KATN|XmG>6`2pEh>UKWmilHocdoZ3)vm zwEHYM#;Xt6n^`~~u!EOiZ~Pf8A>e{LB45{}Ma|KYTd6e$$jNj!)(~|1QMzc%af~6S z@O|h8F?544;v*8yNs%+evksYQ@TwBUjl&whH_4FsN^ei4{E3XL-#(FC#Zt|b(O-R{ zHU6NgT4HyaRyoC&u%dN{ak*J;H(f9F9}9$Mpi^~zJyOFOq-SjNL2{Z^AE-4umELU? zKU~@!1vuzp9j4c`gzo+88c7O|9yniBVSRvJU7{U{y9^+as0kE5RC2yfcny(kzpm*4 zcY(V}Wc}`mLp3b*jK2eRrhV}?O)1BGPo!%6YY>f7t{|DU^c9rab}tQUlLr!XcBQ}8 z>J)mnRr>I07aXH>n$ovl%J`KOtW{p<`c3L}3C0KV^Etc=>l38vwT}R6u-2fM_ERY+ zi@ad>jq6nv)(7y@EyA047#$1YD@gfs1^Gm@s4ctV{KV9*_|7u}V>5Q<@9jDJhN?*c{%F3)9O@42`NPrvdALk{ zMz*|DA{F23A(Gswg~}f$dW%4ckdY>_6Z=wGas@b|#ne5{dJ2WLFsT>j;YSnofZl_B zY+JR+cS_+G=Z;VpJs(G&w~*os(4Et3kL^&WGtc5*;7cO7Zk;{5aq-$ z(owd`Qn4B(2h1qUw1Dk}?ihA|rqbzwUe!dqUEV*9TJ<;l_jOraLg+Wcd*yeR%7VbQ ze!s;w{B`^Lzq|cW753}inczc257rmV&8X__sVOj}K38KCN#h z|E7618D72yI<(o?b~nXA2E-!(u@p}m|9~5nd`@o#eH&jG4VU^s1*5^j-xtta9jL7U zLy2NseF3<;F6@IbrG5X347O!~fU-Wpiox<4WX@n~0mmj*H{$LX$iiDon&9j*bmd} z`{ep4FP>8;7fa>HiSa4W)^#YgLm@zmNSU$kiok(t_g;I?-UA?^97>6h6?6L~xKL1g zd|`B_E*iw=h_%z9EEjEIu(4tClHBy^n#gKldX$0*6la3MM+|RL5@||%zO9#GsNgRQ z2Ql8=5Ll0PzSgcI;8JQhcXp?D%Cjc<{D?F~Vdzqb_d)fut%trUz?;PZo7)vrV+o01 zMG0{7Df6+V&b>-@nQ)DCC@o^tKgbEu>;rvrYf7}+Ot8X)is1orlWrW!6XgaI#Xzg$ z*hK@>PFt9)0=l}MIKGBG&|HbCM7m@plLOuvr)C!-?79>k`%?2MsgZR0)E#d|3Du}L zGe)#DdDW=O1=`ePG^3u6wk@mCFJ7`mQ?HHvlx=tF64fgJ)5ZlW-eo!Ptc&ohE_{n< zp-xQrRw4LM|JF~D0|yH*)|&^vpPt*m?(Ur%ped9T!a=H-pr!?ATMZF;{5Cv+`)k135LF4SYKt;2r2GSjSoo7|+_l}Q^wZi_dRLSyRCSpcbIwl5og8%XH zuf+4e5;4nv3lg(%{8usU-*KLaor#W->0f{i>MscYGtjgA1HS*CgE9L*obo@x_&*0W zMown7{}tG#{{kCA&kN-%klE`GFp8*R6J&fAGB7U)C&@*XSJ}oo@8c79k%*$Sle=i9 zN+O3|b=#pg^PqjGu%^~yFa^=AaDrJlVj!jR=`94U{q74Pw-SdE2VVg;h6A#g!*Jam z665se+XK3bNUM3V4WAL)kJaP#^!VAsN+K3dytFD=7X~vVpQWdp9`trer13G2M9fey z8|57kfZ2NpRG1wMGf*sTLph?>gflx3yH5sYA zR#)P!z5&n=2@8~UwO|~&ZfxF{C>#}>uhx`GDl{d65EKJTaaFFjx&MSH* zmwb))i+iw1V1@TTqn)j%t=#?{x(HTZ&fGuVpnpiw zg!-tJ_bavV%9=w$(*$YEoH#z1;`fZ< zHcarG=GZ||7(d8Dt>SosPG2y|ss8~j!tvoex-{}^9iHh6lp1z;KcWaaO9N<;7pn0j z{rZ*J6XNTou^r>9W?&VD{sx*{|0oUk7bfyOalbk;djfnrHMZk?(S$A8vwb-y4Bkoo zuae@e^(1?9OY94F@KRe<|3aIAOI~E2fn~FrgPl*cRX?~%%}^Q@H;c~)sVmFq)G^3j zoL!i}Cmi85ap1Jz>BMn3GD-h!Gm1MFY5dvXUuc8hai_bRmGM5IQ5M3?G-c{r)}Xf3 zOEG=V^yQtrH1@0&jqRVwIiF`$gEXc2QtJClUKV=dy)`BF`8#x}FNOFHIu(15lZs$} z=mBl=f^{CG-k(@}pue8$y0E`69J1r+?xZP<&(eU{bvTP%%L!7 zxzb)$S?`8@`bq}gJ~n8)fk}Nm_dCrqa7-OiB>^^!X;-?KCLdXRq*K=h@9m;+O5-O& z(_a4*PxU!+bq&$y!<6U)t@1&(AE!KCSiYmZUm1F`ze8%=6$E0)^a4$2ychdVCn?Nz z#ro>X?g;ei(%947g@B3qosfP{LZ8TrI!N-mfT;^nLIQ6I@7oR@|r}&o4%%A+rRUgcUN>sj}#(B3kF&$#RXRw z8Jw4bQHpiGOdF{PCa9DaO|pVFC%*t1gNQ?WQ}BsVV6X$80Gu@RKY$G#5`~#saNZwr z20jX{z*Lbrd`yNjpC65LzUyW8rL}TW-mW{*&gjdw0^}`9T%^5Hb@HPQ0xuP9!t|KsW5_i|TD_<$Vm2QuB z`ZKY4mikX)R^@x@-d|gF45-@;?Tp^q6$gQ>8NJ3f_%o&YP#XM&Tb5d5ef2-J{NN37 zM_Z@n2IM25`tsEI(Z%{utA7!E`r>qD>G5LR9(~Yy^<}|)qLh3EbZ}kOHb2E71!56Y zEZfV5cinwPj>1b<-@^w&&qXzZKBPYiY=XXQEyaIbL542*5SmlS(-1zdklMNbDjrPR zGCp}#f>kh69%#aV7YUASly2CALp1L2+hY^V{W#;@R{m1|6NTa*#5U>Nb0!VwL`D*6 zpV%P9DDgS}D(eLJ|Occ<8?|HGDE+B1r<5t_kG@Nr&Rh(w%^2z3R^x)ZD}@ z4 z_-F5I(#yH6^%LjfdlsxDR|fz z)baHR^+4xHSk#`j_4A|mOA`fNAmVdYv2aVQTvB}2(C|{Qm+7Y&Un08xkLA-nq?E4Q z+ee-21K(jvRl5$Rv)pddZnEVQvTK@l!!cCF2yjzhUsHd~X_FswWe`gYTBP(SWTY5PHCI*JTYl2SBE(DAm z%pCuRLz{e|Y0(@xoh*UE@ttL>bt~CQXZ@YSODEY|)Njna8+WWwT2rh$tJe$tlDKIu5tR zJI-bzMT>tFVe-xmRovmpDxA)%0G|_Q=J(25Br3#Jp)W#b*7*q{Kbxn}lGQ==1q!Q% zlX<9!G6JB|yf=EP2HSuo23OT7_T!%h6p*4a0;JHs1Digd=5_Zw zAkmSD%dm+j0V1F$CG-!Ql%pp_QP7c9{?>`%$byw1#S=j>CkYP3CPwsNRFSlxDVqR| zNkmjs`5mQIG>mcqL|4K=Ks$pHcZX^(1>hauV=%B=O^HEaCxbXwZK4bn4!VFgOd`!_ z#Tfou4Axf+4e?M$OQlf<;RJr%ny^3-#WZwvGy9j7x`7n~h@v z+m8f}>Q;I;qw(`-NDq-8aU1*?sun>&+p2d6r)YxnnfCHxRgI7m4#WXqSZll4>p1x< znN}xc7%e^4nRT>Yae%PiUkcMb!=oHjPQZFpuLeT-ftd5qXPZ64D{HP2a!DHLJ z1%NtV{B>BRwyW@$=ku&V9Wibfh)}@{s!*A`)Md76T{blfKoI#b!OR${RmlmwQLtBP z&}}S(@KlxIPcj7I12|jznA^aI#s-p?fnPP&wWgd6V;wCg0IZN)2DObMM2KxrU1&T} zxncqN49e6l4ru}LyZ>ZGkK}R9ttPggm~m3 z=_69Fmf8(LSd9^iMAN~g@{yX`k{%#hj7H67Al>im)$yE5PHQDP@C8vT&a;8`!y(0| zFUpV%cNXuq`&cH)x3Q2!;^5L`oW0rm+|2~2-n#0ORSHTZ3EWskqHUhS8Q(;$l1Mqj_blr9Um|r+^L8#NjQm7XXCwryS>LW>#>c5Fh@a{);O8 z-L1_y#t(}=OF|SA-vgjwv}4Tn)VV{$VYa}B^V}`r3DW80BsKW4U(8K^xStVP9D|i0 z`Vm{To(W_~^HS1xi1pS{Z1azMttsuKQDId(ADi{zdi3J!$Qhe9_VlFzt4}~@2B^l zZNAUnqTb-6cI-}edU{_i?^N@6E|To$pBqPIt6k839%n$(iaX6PS_Ck#yg9u5@u{n`1K5h>fHqHR@Bp0?9ojic}pM2^L;RA)okOLlyuVxDCg0SpgT4}Rvi+RD2A@9P^e^=T9-sE_pQplBC0$*(-UawN zFJKl6m;UVIhirdy6Bu~dje?D+jVBqgy2OfZV z$4dzsidVy->8V6~x^A@=c}|CcK_h9h3qfEbZzpbG&^S}loSrib6|b|RMgudDqQ(?W-Y|8SK|>PO z(rVs~pvT40*V%i>x6r9UCbUR9ysg}8jGD|#qlh4`DI!ZO-Rq;!@9O;3DT3jgwiy{g z=>oG3$1{w+!v53Urb#HKQQREj~XxWv?SI}`bSq0Bb6$Em9^ZN(HacrLh9bVkjZ)X z^wL0EflzqVgTtWI20{RY0y2e0wh_J!(iMug^kdC$VeSvF?de%A*W+X9+ylz5T%lRz zQ%@*f`GOP5$In5bSyWx)%QmP|px$1Lgc`os_~xKqo7 zi}_Z1Y~CVl-O*oXUFf*@2&NGFr7X?yxX<FSkqxwmPauVRc3f$O;LU6JFDmWf9xW{_k2c?C4wzecKF(+qhG6iqwQl<&X3Y=e zESBX=H{Ts)e0&1tr{4P!>0w=xy1_aKE9|-I{roh0syE0x#|BeD!4%AtpV zFiOb>_~0)RZWnTRU55gNkYZmrRB;`82eAe?AK)p{xj*JYtwK9jr@_lz$vo$aCFy{d zoFJ2YooYGSpsaU!A{`~vT`KEqtw%}T4EgZ1uCn#c0RSj&kv&YrOqEN68ZeMX#xp7eM@OJ$XQ4b0Ioi4VXm6;dqA65tgP zFZC^pk4FTXbP=wf9!Q1I*HuWp)0*!jgFyhXGgt!~I1!v10gz%*j#PB47e}J~P~<&g zH4klD12tcT{Nly}p{NTGw0sNAjbo3^Uuc>3jKKhgSo-cRwStPs#G}7cZOpB#ww{Rn)y%hp)er%Zrw8Qfa{CPt@E!8EXhYwaY9+vDNNIcy&n+_oj_SlB(lJ)fP?whJ;hn4(4u zv3GtjA>5flO(wNyw%d_jS9=suVxdEZ^|$=*Mb+np8q_zr zt_T5gkr5R@K~S38csgo{L<91LA{J1bWY=&}i6mWDW7xi+IzzL~zQFOQx#w-<-GQp` ztLccQ9GtttX{elIr>3jwE_sSvb|F&=A4IO-cx2taCJ>2xAOTF9k?)|`T-_o1eP_SZ zEYFE;>%%WDWxg``gRx(ph4DoZCA}0x_EV=JeQ$@s!^P)KJ1WYt4&MR@&ebq5Et_eV z2p4XurMY8T;1F#oVWp%>{-ZqbspAJOK(q5Rynb*PHmNaS#y1`yb0g(-EPW27N_fDqb zm9*lO!pZ!%xBprVHXljf9FZT6jr$#b-RM}9h0OrbMIuNWM4;C)KlS%HEz#hMKHt+e=b}(P zoxaMc(oh#L*KeENS}4$o3}bZQ?QWLA5^c0%iPQ`g-5qxp<&oE>@+7IM&^oGxRI=MHbK5IL+4e^5w7zC(*JyrxUe9Uh$-y9V-rlg zwQeAZ5MdA5B(aY5wm{A`-!*3pYf2H8Hlziq^DJUh0+M#F3C-!tz5Kgl(K>3E;QoC* zfb*Izf1O|BneseL0?}Kec_c3u>N>aF8}w@HsQ-3^AU{mC&*Om8nlXv_=1`LJhqFXQB6DhNU%*b8P+FaLfH3P0{eVESs4XTB-4a2 z9uX5yXj(cbW&8>Q3=9E0peGeYB#6t32&n~%!ir7w$mPiCNZYs=yX$C2_QQ+mY5!N?8epZ>28_DL#O3&)HHq762l)TGp)f3zt@9F4U4c$&DT2{ zXzrBAELQjLKvKEu%C8k$s4dh+`X>SJrmVO|W@{Z@+-{A=ft6`_%WUKN-ay}^S*)EZA) zpr;R~O9Ayx$>f8yv1k8pn4WA~~7DG+@;Ht;!ZmJNQpwGoAY$+`%tr5MekiCI+)%7YMi=fb!d=M4+N-QvHa&W8Lo#0541vZ^=PfcsTO*7Z`^haI;-)XB337 zgtLRGh2J6cM)gy7X3g{k23+1xo3ep5`KIJ=R*<2Ep?Ks{$}p0k;k-qt5s2FpNh!bs z1CRw85t2zKqhV9)!eQrm9Nv0B-ajT|eUh%d&Cvbe`}6!-1i=dF+8N_`pEbqM4A|`) zKA^UMFRHAk9?5tCNLMq0(pT({82E&eH;nI znqhj3C$5oli`IRMYV9iP_zq*a{srg_n%i%@r_6M3fgM0+eIxqlL&@=ybYa?Xc5q1g z8VDM!-m+2WJAn^!4x3Z&}%yT_VfJ0LTlj_RbFa*ak<-d*dr@5S2K zgDW}cRc`VY`0rEJ9EST{s0y&3gB{XK0&Vzx_#u+fBGTd$bqm;eQcTvP=_8I(HXZ^a z=L)x4GE2WmCIsc*)-0~r_1D-neJXQM;_XcLyJtrX`@*_N7hS=lycX=?^sr8^D(|uK zdRQ-RiS)nx8UaJB@9WJ-;cCdQUP5nqmstK~l zevb=0ShQzSSB@r2fQ$O%^ITbYYRj7aYjy=-d= zSDAAyys+BJ4G(Lthg*cMe3IIOyKNvVj-#qxb0^rbX@9TU6cIn)=5YAB>&Db zobetR+kkwFPuhY`GwC$>eHw3}^<{drqPl}6nqP-)lSa|}SYa~y0T2w>U0$e*B04$L zk!?J#ifQrT0YbZxmsjw%GIpL82kR_R-o^wuE^cw7^M8xI_{mdBO{&q z$4eR=`wuqjktHr~j?d_bObZUCNJcCj!>PeT8bs5OArrG`P3v5qYF2SA(CK34_)0R*&%@3TX(2TL_u zyC|Sf-fZBwK=3 z0)FhFAOzS4B^!#$FueF>=pi~}+a(RQ;Y;qs)KZ9Nb96BV8vVOR z>Wu^O&lJUb0<^pKM=3jpRJt1jJwvopf)0xNaKdVydXA&TJv|EwJ32Ge-!<*UP6Phm zqVK=K0Ae$!�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 z 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 F{~w@=e-How literal 0 HcmV?d00001 diff --git a/guide/ppt/verybasic.pdf b/guide/ppt/verybasic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0da001cad8e3cb6dbc534dc65a44de77acbc0b4c GIT binary patch literal 81249 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 Date: Thu, 24 Dec 2020 05:21:09 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E4=B8=80=E8=88=AC?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guide/object.lyx | 149 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 4 deletions(-) diff --git a/guide/object.lyx b/guide/object.lyx index 33b1899..efe4c1b 100644 --- a/guide/object.lyx +++ b/guide/object.lyx @@ -1,5 +1,5 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 \begin_document \begin_header \save_transient_properties true @@ -36,6 +36,8 @@ PackageOptions url hyphens \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false \graphics default \default_output_format pdf4 \output_sync 0 @@ -75,6 +77,7 @@ PackageOptions url hyphens \suppress_date false \justification true \use_refstyle 1 +\use_minted 0 \boxbgcolor #d8daeb \index Index \shortcut idx @@ -84,7 +87,10 @@ PackageOptions url hyphens \tocdepth 2 \paragraph_separation indent \paragraph_indentation default -\quotes_language english +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 \papercolumns 1 \papersides 2 \paperpagestyle default @@ -1326,6 +1332,7 @@ status open \begin_inset CommandInset citation LatexCommand cite key "jvm-se8-specification" +literal "true" \end_inset @@ -2143,6 +2150,30 @@ status open 除了通过构造方法设置对象的初始状态外,也可以通过以下的方式进行对象的初始化操作: \end_layout +\begin_layout Itemize +定义属性的同时初始化,比如 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Circle +\end_layout + +\end_inset + +类中 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Point +\end_layout + +\end_inset + +对象的处理方式。 +\end_layout + \begin_layout Itemize 在创建对象后,直接访问对象的属性并设置希望的值。 \end_layout @@ -2157,7 +2188,7 @@ status open \begin_layout Standard \begin_inset Flex Tip -status open +status collapsed \begin_layout Plain Layout 定义有参构造方法时,要注意参数的个数不要太多,一般不要超过10个。太多的参数往往给使用者带来记忆和匹配的负担。如果需要大量的对象初始化操作,建议编写专门的方法初 @@ -2167,6 +2198,112 @@ status open \end_inset +\end_layout + +\begin_layout Standard +\begin_inset Flex Tip +status open + +\begin_layout Plain Layout +对象属性的初始化一般有两种方式:定义的时候直接初始化和使用构造方法。在 +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstlistingname +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "sub322-Circle.java" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +中采用了直接初始化 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +point +\end_layout + +\end_inset + +属性的方式,如果要使用构造方法初始化point属性,则 +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +Circle +\end_layout + +\end_inset + +类的定义大致为: +\end_layout + +\begin_layout Plain Layout +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +public class Circle{ +\end_layout + +\begin_layout Plain Layout + + Point origin; +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + + public Circle(){ +\end_layout + +\begin_layout Plain Layout + + origin = new Point(); +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + ... +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + \end_layout \begin_layout Exercise @@ -5190,6 +5327,7 @@ public class Client { \begin_inset CommandInset citation LatexCommand cite key "design-pattern-4gangs" +literal "true" \end_inset @@ -5197,6 +5335,7 @@ key "design-pattern-4gangs" \begin_inset CommandInset citation LatexCommand cite key "design-pattern-4gangs" +literal "true" \end_inset @@ -7461,6 +7600,7 @@ JDK源代码可以从 LatexCommand href name "https://github.com/dmlloyd/openjdk" target "https://github.com/dmlloyd/openjdk" +literal "false" \end_inset @@ -8816,6 +8956,7 @@ pier继承下来一样。SmartPrinter类其实是一个Facade类 \begin_inset CommandInset citation LatexCommand cite key "design-pattern-4gangs" +literal "true" \end_inset From aaa6d2dba507fbc5d8432ea0fef72b26e1f3dd96 Mon Sep 17 00:00:00 2001 From: subaochen Date: Wed, 16 Jun 2021 10:35:43 +0800 Subject: [PATCH 8/8] new images --- guide/imgs/io/input-from-keyboard-stream.jpeg | Bin 0 -> 22785 bytes guide/imgs/io/inputstream.dia.autosave | Bin 0 -> 3748 bytes guide/imgs/io/inputstream.jpeg | Bin 0 -> 55041 bytes guide/imgs/io/reader-writer.jpeg | Bin 0 -> 40943 bytes guide/imgs/tests/oopbasic-model.jpeg | Bin 0 -> 16464 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 guide/imgs/io/input-from-keyboard-stream.jpeg create mode 100644 guide/imgs/io/inputstream.dia.autosave create mode 100644 guide/imgs/io/inputstream.jpeg create mode 100644 guide/imgs/io/reader-writer.jpeg create mode 100644 guide/imgs/tests/oopbasic-model.jpeg diff --git a/guide/imgs/io/input-from-keyboard-stream.jpeg b/guide/imgs/io/input-from-keyboard-stream.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7a919320393054049c0ad8f36b5dca01a933e99f GIT binary patch literal 22785 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 literal 0 HcmV?d00001 diff --git a/guide/imgs/io/inputstream.dia.autosave b/guide/imgs/io/inputstream.dia.autosave new file mode 100644 index 0000000000000000000000000000000000000000..6706e911033fe76ac5948d51d6ef5c03caa1af51 GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/guide/imgs/tests/oopbasic-model.jpeg b/guide/imgs/tests/oopbasic-model.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..61f5d35e7aa68eb7858c0a0d31ecb7f2120786b4 GIT binary patch literal 16464 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 Au>b%7 literal 0 HcmV?d00001

4QOri*;toAxXSxLQT@H?%1YpaB@ z_m(Gfy_2>qTuWp7$~zk*T;~hcDwbJm?nb%@JJ^zCn-WJ!8qcejXR@Sul!Ps@sxc7*>o7MCf28MAmd_cXjD&DF2G?qE0CqN`b z%s`DQ(SvDwNLDZzFkT~$z!SpN=BYb)F;}50zatIHiVh9I?Guxmsk9FNO7Dn4G<>{X z()B|8!jbt2TLIag=V>rX&xJkI^d~sR< @c?p*Dc!fgtJ7Mm!5+WY=^~*V}>R%Hq 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�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 hah3+ma)z#mP3jn|H5>)^I literal 0 HcmV?d00001 diff --git a/guide/ppt/io.lyx b/guide/ppt/io.lyx index c8aacc0..259c454 100644 --- a/guide/ppt/io.lyx +++ b/guide/ppt/io.lyx @@ -4,7 +4,7 @@ \begin_header \save_transient_properties true \origin unavailable -\textclass beamer-chinese +\textclass beamer \begin_preamble % see http://deic.uab.es/~iblanes/beamer_gallery/ for how % to choose theme and color @@ -169,11 +169,11 @@ C的I/O回顾 \end_layout -\begin_deeper \begin_layout Itemize 输入流 \end_layout +\begin_deeper \begin_layout Itemize 输出流 \end_layout diff --git a/guide/ppt/io.pdf b/guide/ppt/io.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b5a14b80eaa081ed5629ed1e02fef9208cbe086 GIT binary patch literal 36473 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 O`FId%Xe5=S5dQ~0a&@%; literal 0 HcmV?d00001 diff --git a/guide/ppt/oop.pdf b/guide/ppt/oop.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0c4303245cf93e7ee99c81ebd011a6f97f2a8c4 GIT binary patch literal 106950 zcmcG01yEegf_0DtcY*|Whru0!yK8U_7J|EbaDux83+}<)CAbB5cX$3vzVE$#y1Vu2 z-%4dNWaeJFd%EhJJ~CwT!lHDH^sKOC8z+Z1uxx}NLMsDvSRNh*WfyB>26Z_Db7Mn$ z1|5LtWCUIT z5dx2}AZ-RkV>>GcTSH?zLU!Ok6&Xa$KG_@FGKhZCw>K6xHncJ_W{@`iY+`Rp$i&RY z2Ww|pZ6flDAd^$&0IvA`Qz^4!?SZ1r8AlYy8>h&vyXNUWUvG-1I*hIx8C+ zCp{AkDKss#|_K)GMoSJ1800$rT=K;9RG_UGyR_onfX5*G9w!yBisMD&Mf~I zgJ$`gLH{>h*N1sVe1#U*G7&33 zj951$UzJ#!BabIRCTS+ElW=R*uU1`7E=2LRhl%HJI6A$dsf$s3tv|hyzHP5-Z$Ekd z8W7f+dJv1N;2V9Ts~Gr0LtvH`o z`(P(LA8&0SHBki#D@T0RdRgtpA{2l6cfzRoPOX*0&g~3r2h?c zj|UfsiMMfzYgVP3DH`}$HIRYZ0UQG=4i`WDmESC@FI}M|?lz;kzCL7AhV=k*x%^2V z$ZbejhJU#wxVQG1*y{Y%(4|gLW3(f~7iaFo<~L3d5vqz2mmrYZ(7kHqtf6la*ecy#!sSVxST-m0K zcbr;fPf*16MDv-4(l5Q0yoqD+fO)toch~G5NfH!JD7e8^8O92~rk^ZC^k|ESb1tkT z*}Z2daI-rYOYM93RfeptPIR&V#njG-tGqq|jZ^=c2-9ocPH!=&f*p=v37!5_4&Hs0 zGA2fmbzlhcbD9O`Pc@OG$~@f&rh9cA>V6xodcOi~!_Az@fMw;CErCAM7DP`G8QoW{ z+O!N%{9Se9|7L_uSPvWqT9fprc8Yr)R>0yA8nNg?wSLQE@Lr~mx1v3*7Zo1tAbToI zzB%C1Q&@dir^9IRL*?f`>CPU~lH8A-=$O9d&#E1?gUsQe_k z^bdL9>_~#5=ME<{=6B#XhXyX3H$**IuE7~!|HX0vgCYIsUQ9^c$?&hPz3oBOeJ6Z@ zq_fuAVy&Z$zOAj|t}~pgoSp!z`xxhp`(_iZSwpVk3Ea6Y(qL%r>wr)(xSG|3uZozS zN?Jq&e5v6Q#Hj9rX%z68;)@AgUa$a++iOv8uL$>ti) z-S&JXwMH07y@FgB&quaorQZEMsTgX%Y=B-a4I4*!TA$cQv?NAk`R!GWuY@?Rw{5=s z7$wP4twgA}gt;gNvy#S{$=XDUlb`1^$E@est>mo_La#D5Op2KF{bJz-A9*{Q!f54t zh1IzXwKN^ggZ@WOMzT zL?stjc;D7>`Wmz7Vm5^)m+l7m-P~j86x)OPG*xvKKITk{{B`qqh{&`);P&ywWBO%u z$6=MVWW@i&GCta#%y*x#?zkN?Z!X5{FUW6|mkX7U#^a4A;A~AA?l*hnA9PjD)OIh+ zHDkU-$OXAF7Gu91i+;Dyg$e7zz|z`jL6eC5aEfAq9Ce_uAcZK(^*Gw-OmAI9{RW}8 zP?qSm8j4O_=9`e$4ko#8RF#UI{81!|Yk7Fijl)Z+RMn}g-vz&RXcK(ODy&&h$UP9J zwfhmE8f&CRfhBV?Ac>VS}lxVOMK|1#B zVFs!$1!DrKO~uZ0SHA~aw9Tf}gGNG_?W7A%avii;gGYb5H=M`@{K@$e0lv^Eu!!_}2CWmu3 zzE>%z3K;#>QD^swZI5;~hxy}W(a~9~#TCzKPq|%}Kwf(tPX1laP{p00To@0xMBjt~ zbzBmmO*QMa1Npb8+umZbe9;|wQ|ecGNOYl7P37vAA@|(g+!QOPAX=XDO=AXVIz4(? zh}Xn$3AzZSi^6Ixe&dmu)~B||H}`=w+iC$&!jU}*#?sX867G>v@!~PpH-ZgkZa={1 z@Awh*a8Bl%Mr%$jRc6BuYj_IqWUZc!)xP6W=O*&QhrTUo@5i2;=o_rQepuDoT&P311^iOmW z7NF^Wd)#1oIU4+br|lenL)-s5I?2NH_jK~-=ihXa>H>W59E}<_{kIH0&ko~*zt~t z3vmidrG=SK$mHgkP_T!c!i`K$(l`1<7Zvsy9bIxe^$=emnPGMPbfhAJ5HCuB-1Em^vLjflLq$)<3eH_Q5XgWA=sw{9>J^rXsPM?5eByM=uRKT+2eYXE;p?C z-u1EK{_tI9si?o=vlfEaa=X1qPVC8W%|mItn7L)vsxh)yo%wLfYjMM~w6&@0Ho;@T zJ)$|wFX*lTE{8uw*V7pN*$FP=2`ydNJByCIbC-;pI;-6}ztsBuB5O(!ua36vV*uG= z%A}$UQxLEu)M6PB36;x}uJ#e8eIWydAk{+{K9Q`~6MJ9gPqLeICXpov(iW6GV!;`3 zL0k$Ib|{yAxgGGpKod|LlQo;Rkf=Q4X~X}_L}}TZ!l~!5Va&pSV9+mp3H4`vg+nK;{4JRwWC%@gJV0}r23^U(HR0}Qmw${6hwB}}qh?#%?L&y{Y^G>iK! zHfJ~g#A#o)G-B>9W!0<$Tk?bR(D&^Q^FqugY;PqtW04E4QdT-{jIgZh23oMU6Fud4A8c z$^;nd`WO<&aB}_)c5Kf@3fQz$hvK>5oqlpl06^R$MEPNu`HYamcN6~ABF9m+u(a(E z@N|2*tTjK1XkQzvoW2;$tj=A= zEpI?$N=_Im- z9jFj*dl$=f2#1y62|K3h7abu^SA#VY34&Fp4tOWE=E0~S$P-D}Tj7sF^W7*LQnXGf z)3oc$cCSLHI#VIG2(2`yqgR-1v`a?&F#*NAoM($-i(#j6VKrQem@>d8Pwi46BMo8H zF(j2a^7d7>dr7Jt>|MWF#J(jPs%?%~zpQXSXuZ*HSenw6ADnnyvHn9n(IYp=h%2?y zdr-REghxWpP+`*K6W-g1ju?rdn}!0T1wS0)A@TRe2l22qk za}4pT*Ouk(gL?4k*1Z{a?2n5S2vsNGe86;QM~}$5@sJyzYBVw4(ZzcL$+oI ztdzehMY%NZdt$GdNsXf~idT^FTy92UWIx)|UB=sfY-4FXV1UOoynh`0TE43QGkB9o z)gm!q^!^Hr`pYX`y;$e-r>~B!PtB_~sJpA^N)mxsxxFrw(gGA!k-8cF^GKb{w5b=N zkYv@HOE8Pa`u1~7Oc{D{Nc|>|K9_~HPv)!3%rY3A=7s#Ax2kG_=0^pt@)20-(M;;B zFnDzXL|i#`NJ9cQfrPC|@Jl882Lru*jT|Zw7rxvt&u$AH-F}K(`&{>|+s9iKJEK;*|pLpQgN;#oTpzY6;rN z*>LI57wYJg zsXLJ=fo17OzM2UsgQ|wfLisU2v*I0z>6_fZOoi_PF*fSjqivJ4IT{jbPO!-Pm@*BP z-lSnaz@n|?!AXOQ;E>U)D5^r*p`!!}h~Bf9dmG`ZViF=w6WbbV*C@HSL5fy?;_;Jy zKPTD;2~8$Uezs=-*?WdgN*N=rYz~d;_l}e^VM+wXFdnPo2THkGs(9>y9lq&CZ;uQ;4$X1z6iL#`Z zI^YK4o?*0arYhy0RyVyIOg!*()dH4#5@;=}FzdInI~Mz@!ZL19Q+GMI9r6rTd>cu^ zrQr2_uGg*tD{v@gJw6&97;|TAN2u{XBE@r^@%}SEUUn~%#@2#~{i*bB8vm8o&mZrM(i4~gRZ zgeCfkVzk|m?ys-G(8YuOMMzmXvy3l z(P@>7@F!Wl$^DhpPG1ux3ZifzDgLspEBCYBrD1;XfCMce!P4{A+3xOA^D>zSbU0Oa zF<4)^o)TTwZqYw)M2gn#x52V52$|t!#*}8{+K#iE_W5bXpIrA{um9-+6!?;@IcW?) z)1Z|}N;~!3d-VLDcLZ~FbsR*OVueXgbr~bP-USS}9VcU6U`PskJyeyEB=snK+kn@h z_2jB1!Iau5)GxGO1pT_64fbNy-W-l=b#H1)T3>4EAKe-NG`sWr+aSlt_J`x{s>af} zP2_uLSMO-cjug3{Wv#2$seL9pmc7-=rhT+MOl%LQ^)Aa)dAEfL zJl&oqAI`Dm<#;<3pLw)BTfiKC#wy;>h27;1#Z+(goj4$m_?MQpz=#{4F0Pdj_yjM) z<*G&10EjnPde!c7RK3}cHbk+O_F58s53 z3=(U{gEsuO&oBmYnIMCR14xL{#L2#_B`o+*Hj#a$0sq9YnZ>C+jLXdPQ9}DLK{;w1 zdor>Bc2^4}U_cuq=6&F|@bThfvi^bnO#8b2%*k+e!?r1A2E*IRFG{fuf_)WbL8&r{ zn3@N;7|M!Mo9rS5w5=#BcLIqTE%KgZ1tVXVF@{3>M`%P_Tmf=bK-0>&vM11|-XiTO zQZN#=Og=Q&Kf;{j_;0S9F@Es1plp!t8A-aDewTWmSmb)+t;=-EHz+Hz>?O%NYJuv|jSOR17Q1ZjP! zHTa>0av(PMiDTeXXVWAxMY$b?CU@^Z)@0l=mh~l}5v?wH>$gdhJ}b1X%?+q<3ngt& zrPzTp9I#RX|AI}pO||Gd+*`}`ro;zG7J7^P8_w8ok$5Kgn$j1Kib*T`M zMHT#TiO%n*sOAYQwO>?)d(uOQVg^yGOkzR|0gLRE(gVDt@oo648KjQMvw$-i36F?} zA9^~{p0G50OkW1h1~dP~ENGP6jk9)IT|%C(x?EHhQ=L>!T{uMwco@XI_op~(+*g}u zB^DXUy8T@0U!NNc`u1#%DOlbb%kK?X!PmJWGsQE+=ql{3J_%;&&McEps+GdM5pcLu zi)Sx|+szxacQPW!zqVAE!HO`F0&UixX4z6l&-&R~34+1AjYnRG54(`YHa7BFB8KGv zPFzys*9MA6yF5PC9x#j)_1{{c3_2{Zl0oAx^O|2JU73|I(WouY#g<3jA2UBZ?e3i^ zsh8Pf%{r%0Tdj4IeD0VkeDctMoNs{~G6;_7UG1DYLSb@yNyRNobyXdQu;Y z)V=#ux6HaAPZNk^a6f2ZbEyIrEzOhrMT+fgSME)D3+1ngTG==G!%&h&LW@~Bt#4+o z8CxiW*!ap(XNvDM>}9$fhOw4sxoMpG96{3f^buE)CwipcPm>GEyv(~TS9JcxmuKPWBnyC*N*KYXBGxDRYZEy5mF zkFqY;KOOY3uf-4a;soci1RL~^JuE#|oHDk%?UK7MFw;Ztg%`29i_g>MbGXDwt~h=~ zOHs*EY~bbGNZ`j37Bz7qer`qz#O1~cT>hX3XWlo@B3Uj6-G+irm~$)j^kXr*tyVvBc{#&ya#% z5A^GOjf_i>|1LZhHeXRfQ4~&IrV*+mA!5`0Z2&v}qgxLINno#>*0oX6RGzNc8nInf zi$9+DgRj23WPqAJPG+tRF-O*|S{T2b!7;-0S*BY)N%;)keSWalF-sEUaMqJZ!7RUo zv2fI$tlP(mUDAWloL%CtyapO`@dSt(Q9LnLn#PZ2?>s&uv^AXQwY`BTpIGNBCE^ai zbGhMWGRU$^AnS4oD0!1OHqO8e!AD*mFB*>)e zOK1Ac)0gH=AG-jLQZ7S?(C~t#b>6E~>exJcjE`wRa!P&bD$wV8WzVzu2ClfN5T7ROq1^|u@Aibv>Ffhz0)~S z;o7mC;NP0ARx*<46LUC&SB$)4e=DNBn#gp$UzYzF?Sd@^W*$yOsJN!waf4*K)NhWp-CRAEeGs1>sDnZJ z`^A>Z_QnSZd(_qtn}-QXql+M%0tO%obV!_cQ&J{Pivk_XfSuueH<7S;3 z%a^hbRlC$q+P6=Z&%Mz{c*$XwvRvmsms{~#tq2$spD%dbW>of(#(Ey##(qLuYO>&a z3hC4*&lsD-n^4Rms=^waJqZfh`Z=P{vr5Q{)XTZjxw>APiso^>-`Tj85A}W#3EJX* zyXE;7e3Dg3a#b7aQY4AOjPC2|K4ChHwzdaz)W8~d?>rwkbE}$U8KKo+EQ?yKT81Oz z;)g-u%kS(^1x1Z8OIu)x_sz0SWG*kZ-l$G?BU5!|E?l^`^H(O+hwjW!+RxfYD%_j*#OR<@E7PTjS;s3f(CHfCo4 z{beYW&Jhugx?t}tC0jXu8PfWmaEMozsx^8tq0b6wt9xVnEr~8~|Hun=p}+WEJh~JB z0%P`BVFC!ejjh=DZ?2qY@@!{C*Ct=zmUgp181@)a;l1;|PP&OQ&i_`%pNqd+moCfn zgz5;*bA;UEA-t9vmTrx26HUg#UxO+u2G?{Cs@Xd2L<&%PfP>KG7}$_66ivcjnXZpN zcUOs}l6rKF{T1X=AR?=`E&IbUB2EaPFu?Q#`kY&20SdzqwM-9C7^HVIc?}O+lyRHv zU<-WEb|Y#7Wu%v6XY+n8jJGhRTGO(pc9agA?5|(!%8{A=GRn)>XY&EKJ?Oevlp1ek zPt`WN%8no~$cCR=e|D%vt!+cKIL9VsD@QP)wH?}79^DR5Dn;K#Q&vHp8-%8k`d99~ z2r#7&dES7LwtmZX`!=`by=Nncfr8&OweUrN88}OM^_jrGew*fntf1Z=zK|7kRd*xg zxXpwYBKD87V9&c55FC3xM}J`m3W}-6g=^=w5sEH4vaf23?0^xte28u^lnkK(?7Xe+ z_}Ae-v$N;^ARB-4fptCx2)35CYJa!V!i4wTd+_@3SqpPqCSmsou=DWezLhfK_Q&fD z*sTj~Dw9?~Z7%tPqf*ln^IziQ;3Bg{65ClzR6?H9f)!dZRl6USl9I{8hBxO6{kH@rF2Ht4~g z8n20&(!uW<-P#Uv(7A=)88i3uY#h$%HIWXjLwR{g;V~uf`qW>xKmo7?_Lm`my~TLT zdC(<%xeo|14QDCfp8*cJz5l`?FIQ^ePFeRFFS$1t*=GWb7f34n)L_kmV0QzXFKRBo zE*qzNjF@3e=w4_oQ0(mrFL*-#AGHhEzPRql$u#b;X}$9-ea#%w!d zlZg-AcOt6^%62}YS7P$sQJ(e#$o#L9-nG7E8~tJHjli>B+mOo2s-J5(zQe3OE|#+w zRQM^tM5B>e{YYD?Bz{njfk#U3R}8GqBf3)LJ>}6%P0Nlx^f@-j#{Fwt%pVNF6JQ9p zFAU+SX2l0(eVsy+oX`>IQ>m$*#ZhlO`Se* zdV=c<$;K;cwoHBNoO5EADKyId^&n3bjuE?bYiw^pznFvu>ZUL+#(}CLA!31LOFu~e z49hTI@4DYZYvu^D8!EnQc=fSzYv}8|;S3zw^zcp0`^qWJP?_RyI86aySq;|N-Cqgx zN=}qFeJF`{r2W^T4 z>1YG!qLTFyDX-LE6Yc<%7s1(cgK%(Ys;=~Q`xzrm87_u|+|JUEta%tC=Yj(g?@XuhiBSt}Zjuk^uiv9;9NnPGbXWbeo-n zQAo$bj;)?FMK+LIsx{$W#fJzPHSU+$7-BfpnG2DG>LS?NoosEEhxj(X9TC( z>A|^L+*>?gCRoS<0jz?^5kX)|d{_jGSWlQTeK)=ROZ`>xE2K}711A|BqPwY88!#oe z80kN}@(dwW>fX-U3hS`Ab6r8;XsqNI^6XR_UL4;MK8f7<-Df?Ve0Hufa#l*H80pt* zx!WE*-Tn*+0Zv%Iw7q7_Vc3pJGmRQSXX);DVJV%`eAzX4DuM=L<{%)v!*IPZrAZ)X zkKFfYgXrvabCJyG&7N_*9J73cvPVx88!@tYa*ptwhB~*aRcp{{fJf3I7+&{{O>EKD zUWyM3#xm#99rVxxeXNeiQlMm38D$yop?L#y;Mvv(E5vbCC$y$10OPgu8k3tajQ|-S zVdtppTU@N6heEdF*d+F<`)RwaLueKT4P>YcYOVLC@TYcKzDdMaPjn|*XdQRjTaBIN zCIug}B=;gcLlA)I&bm+mIQ0zV(@IN7FrndusPXi*;tR-gFB-|uZ2=&^$IP(q@}Z|d zQrlpFks%+@0n}0sXl1_>rVLs|jH`R1wOtA%y6I51Ccl6@+}6~_HtFk`roNHP>KBlA zKxRr$=r5ywfkJ;5-doO)Ty4ACp9=2=t-$MEKomG;#{kG>+3v3W65J7)`7^k4{}SBk z^+tFJ?ify7>ncXtAH1h{=XFK{iJ=O;&P8k+Au7ia$uWlN$X~POBnDUf47&Qb+8G%q z^#JEnmI}xKGF3zH)`tMdH&G5w=6doD0y4lfX|K&DVxB{IoRHZIJnjJ`1UU7o?7?l+ z!koLF35C-vYI)kl_5jFQiqx@iE_geY(<1Dt2`VG!k9db!BK3ePsd*~{rUpQ=OVUH3 zqAnqDXfJz7?T8Exka;S|Jgog~YKP!v@59H4agIUhS2GzFznle{j8b1dcjFul$z6XT$?n`Ee>vv|SdRZUiC9|Wkc5U!2ppHPGVG?{2mYnFr ztAR8@F%r>*<7mtZvU+Tpq3`w^kwzvt*C@S@kNukz{JK;Gv(_opB&%yE6Hn$Ut^^c- zf=F03`mMvUN!Ov_u)NF=z<5#3u@{U_IEvh)@;t3N^;Gi`q9d^SB9qYFaX`aMx>F7Z zhAF)g<0x7_iT)_joZUHgBMuYB@Aye#W+nOs;t$q&Xgmj~@m}W(f8xiQz;VNzLcEfsigJ<4f~pvP?N^4-sq1{E#HPRt5yE8wF`i){Q~iUF08j7 zv;dD~W&&_0|Mug2bOm<4bMW0~Km&OG>F}A-PJK2@4RsK4cM!pD*J7Wfb&x0Ms}f6W zD~GLq+V?NGoiuFt#aQu!ZNXX(iG=g3j1F2bk;T$kJ0G|%~v-&RTSw&{i{-F4`-O>6O`2$E1@1{hi|<_AuR`X_XBP1OdgPd`$Ja&nNaw+SsqNx(65IzHNsW6z*VZZvUkSbsB^ab&>PoLUhx}C%*AIp zZtcjGYP|Q2zixDPn50tIPyG~a9!YbybPBmQzqgA}tTc%45cx=H{purWu?{b-_G&*p z*+GM(cSaOyJlEt{8v#SqS$_46zlIAv=A&(T$uM4zOAe?_jTNs1&c|Z6O=i_))^LZX zhl8^2&WL`cO#D zO=~>*c5fY3`MkgraZFv{!09vWtQ@s&ovC~n_UIR&SnvnzlO!+Bxm{Tf! zEZJ)H@pPmmG7~luTvN6$G|(x?Mo$PX>`jmCy3bhayud?fb=thVr}NBXC27-Rl>QK9 zV%gKJ?OnY~NB=`@=t1e>G@fsG5DsNOQCJg22H*NBC}u>@QY};*JSWU1FzEv2~yT^xp%}U->us zV<+CGQ8oKEA;bwT%jg%lqM?#}vtXet7NyJc-kGSK^SNd$JEgY3)md&*9MpZe^MVa;)mD1t-C%W}zT*3(t!#a8{J>zELK9vdD zRyPKBC>#*n{mT*mk#vZ6Bvw~qPimtU5S7pDqJ4{WHYi>+W!O4bRMhnCKM%tGE}Xy7 z-vK~>>KF9)MBPd^`SS?vd)p9_!5k1muXM^>n9BHWMEko6UXQm!oU^WRZ{Bfh4*t$; zge=R`ffF?C0dk;+@CI&p1P2m;{)hycr}=)br(3Yas!q0gf!u6BFhi=bBBjc2^sk9O z^Opl0_-_*+c!ZT&1B3pw%6zTp-diN#JhJw~4Wi`3MHl7> zlU?k() z09;AjN|%TklhO5-fCexDr2Y_6E=fswMqZTr-y9~6tcB(K4nb2_YwJs5H(yBQp&>O} zxrLtM#RRzKId1?=07a^s@O@jjmm_{a3Xs^{O!$XUJe~(=Y5!>gyo-4`;vZ>Yt_dZa z?)C}u9rYUMmSAIOrb_l!pQjndwDD5f&9T2q@Prvt&5ntXq^sE(!5IRNm&m${zo}0& zB}x~I%CiD9e;qTb`6vAISh+G7NF9G7# z$#3~KY2}4zgafEsCN>m3May#k_^H&!ER%QHO*$Q$49v@w+6g6fb|5xKt2>J8eomAk z&?LCg-ufjXJ0|~Ru+hP%fI?SLQHqcf<(74ehK~c_e=o^29^o&A12QO*G(LF!X81tX zA5QRIge(^$ep5PTll*ElFI}N0{9U2j6L5A_ zLb%qQ{aWe+j<_98u?H;XS)rZjb}l@)?-?y?7In89r**TNQID;$5GZFpVi#!n-9uBo z-kSV4a(q2(v)9GDYVTM2z6zqwZ<*DQHm)t91JlYY;RiSSjrr0+oe)vwo9-`Ay8*M+ zX&sPQUb_6SlSuA{x=z|B%7vvV&HUg*a_?NkpqpNYV+g{_CaPNpHei)Uu#bPeXTwOJ zOZ;(mEL7AyTDEKO2Ilhz71`%U9>!}3c?9K6gfXn@7&$b(%^te65io|vlI~sQ zNrVMK1_gG%lTj}w>Ux4%>4)J+R}5I?wK&aP@05Fn7<1w9`Da@2kJ(W<19K&NO9oj& zCJ+c{mf70b6EbqJF#fkCGuFQo3=TDZeZ~>P@W?3p-rFx#b=80g4d3Os0g2@dKZpbd z$vcV~LmAxnKF@^7i+>wEVcGyL`e*4Y$6ucuD&pOaRHr=X)x%ha-yKhKSVga4gm-hW6DB6z?wSE2)5n$31?hkS_FpU2r3e71Op@F`xHj>9eY$-p6R`C&$l-E;!q6jUrEqkHKK#@ zwasP1Of@bHCB=7?-J=tY5V|Oz5;xw`w?VGG0ozX$H&rtP1&IQk5mgUfT38)|99u%2c1awg>)k#i zM|8L-BnkzizH$7>*Ua? zlwfDz>qm7cg5MK&kiwcfKU!P!ZIgY@R^QB4p+s786o6%2BUcjk`)Vi7AMuLB)jXnP z)!_S?4G}ga9Fw6WZg*iKv)C9xXgPyj)p+A9IsGr{*H~uRD4^)=>%N~u2d_{yzIqBQ zXboK0bj86Q<}XRGoz*{*+*=zDI**nmxlJl$z?-1Jl(bnJ3e~6XIIX=O3-MRY;`u}q z#InJoXY_OO`-!Q(``2ScSY$k`Ze|OPY~cYCM~Uh$(+SdzQLCk~ArVi+Ngi#KQ;j^m zU8+<8y%=_{aE2xHXgPr3aC@Tox0Xq8K}xs;=<_g663K-QyRq@!+0U{?kF(a|t%WIP z;>G);NckvekDzf>yb?j~L^0}EF+3G2B)*I3@v3tCZ4A0DS1S*ZULtcpc{|)}HU)gP z?_wO3aAE~?Eqgxkpn-vylx@6=wsx)NBA#zlgHz``vxO)cU+-U4bb<{V{yMw$?hM;8 zjk`l{du_e<#zj8LBWgQoc@%<<;5*L7Z4~g}lK#Ghk5!R~{LUi};l%G+@vHZ0+?lfg z)i8vp-Wws3>hcc-C>pbhlh7sV-#I_}D{rpC2HZ`X#8@LS6hpVtx?`V%e zVIl&FI+8c8UuPLr8b=A3jXdrT4{l~|Z@bSD=H9io+%9Lpt(%OfdKH&OJf~*ReH_7j zuIJEf@;tS_a(CctRZk~G%ug(D;PMJ$dkz9K;pd86Vi=jmEF$YVOxAQ^kDo)!k+Q6h zAxgUAOlxL2>W}$#?Nx#~cpj6n?bW22cz1mP^Yl|kyJR>5b3f)+(Y9C>duZ!)6#>I` zD{Z>vXF2v-0>*2C43lJdjOUAZpZlfA4_JJJ`s}NV{k%_Dr$?s)5HpcQMt-`e`nfE#W@l9qKrpZ1U?ugJTToA#@cn6vjWyiT=o76JJtA?Km z2y=tCn`^j>!XB^Tt}@3Eb6dtN1so`MncwppZsF&SZlDfx~)t$5EY!1@o>Cei5y zYGzBrBpycfg0|oxC<6RE++*g}-p=-72J8~6>*>Oi=mmOFgcG8SV+ouJkxfm2h2Y$L zZ0e)|SxW}N9u!HN`sI7}ZJwZ9kYsl7af{09>m{>@1(&mfX1&AGn7o~d0)0M1b|uB+ zEugi>6ZM;B`30b*nj1nxM2#nAx3>$j8$$<2UFB<>bV)(=!jYs0iLF0zqWB^f;69n% z*n3{x<40rJ3?=s^20{qoYtxQgdov>ShYLu9G4j?0ixm|;50{CKLbBi~y_KVhU&@nG z*|yia?K4U2T~j(0$}M${XuIna=s`g(V~juG7QtO)5;@}*|CimKU-X^eF9odtwg<}bAHf2mwda$_*Yi33}vUYeA$mzw{!njZ^=T#Msd zT9S=59mVEl{lup@SyF=@l+zCPe1x%RSaaWY7l|Ux699*gPL4qT(TMWLx0nqpG+8^n zHJ9=|jXsVHU(wI~K{H%Y;6wg<@rRy#dLAWJd%dk=URlL+HO5n=tVLI8Do(149~?}k z{`y3za*xqP4^Edgife3oxn^aypcN5p@JcCX7$XYf10%8Drj?X6`uBLMvyY)B61^Sx zNSdOb5{WI?oJHQ)xSj9qdrN<1#Hsej6eVyn4ap&C*NX-Vo@L1nuD4kw(+eu< z;uW|eJ(opTIJ||(c?_GshMLko8fvaRV%h_5p)=Ua-92?k!14V&rF{}xtTrh&P~Q^e z3+htrzrrB?92t8f07FpJ0H2I^&3-n1ZlYr(%OOrq-+&vR?%wVIW2T*8U9ykbVyWFx zTPh{K-{5bdop55gk2=>tkD@t4rnTPSZ>60uI_(fVyN}vTKlbu)8ZbllkHG~#7cBh0^?In205OLJj6}3I9pZ0&RiRL>SkDOXV4q3oTG}_}&2)t}k0wb{ZU%yUI2>J55o_*s z3HrY-q}EhAOWmF@ZFDxqES4<~m>>8o6#h8SlAGJEvx}XJU`d78?F096s9J zrAebt%)3Ks&+eR03yVO{n)~7)tBmcFZ+Hp~WjFaBV$Bv&%!ujX`?#ptsCT%7qbCWP zfLQa}sySqYYV!C~tg!;bn$IYEZ6w^K;12PD%= z9D~?OD0fsXb|&4CbrD<0<@|esU-i@?JkYY<@GP6qmRW)$UP7#%+4*cRCON>^`u%I8 z>0X#M->qJ5Q@4C5wr@9aux6V*al9Tnfi2XlXB6iGX#Gd}^Pl>&RmxRSWS2D=1_IJ1 z<(}dy@8d$+)Q+kWp_woaV?TN@NT_~*s_B#g%e8Dug80mL2Af_M%Aryq1<$!<+xIKL zrKW#)%^$Y1{=xRe&;SFX0t@GHXGIbo!4Fq@Ix;UM>z^?X;DGY~6AUN~x1T%w;XgRO z_zw{V<}+HJoRWsOKVQ`%2_6Au+TT`)8)!NH)Gkkc%z?>MG>%zxy#=nmu#-gw|f06``do;Kw;{nzu;B7};#Fy0UF_>)>3XP5}B^pns>b5%uLkopkm!HStgd`kvNmQ!BM)<4)kFpUj%h1AXV}DB~|g;N(un1q^zE} z&-AUhxfKr|z2~8buHADV%wH4|-bA$+0tLkSfqTio!D2>Y zXbhHlkE?pxwf*#yKXFe3EU4=lOk0N!UXAk091N!Lg|}WGbT}BgLh0A1z6Lm_&KYQz zV3YqL*2EcpZDR$*8caZ}0U9xXh&AH(c%oo~Ir0UhOPFYMU60V?xu}_{Aeeq|`6G0$ zcZ_SE2~A(f`hS`dXODm7k52o#BzACp9W(LLhw;<{`Y>VsF@RQ6rLqh3VH%ZvhXjLR z=TBXyZhv(Ch>&5h4gc{i;MS~+UYlTW;->q!XJ7mAb&Y!yAzK;-TvgdcRAwhVq!!3W zZVtO$QQ?B3CIV4xorDb3a-<$T+)jpb9%DP(Q#j4q!fc=M^ zwcl=qxn?nWJ?=Je&plJ0HKcD4q$45Cog>FSR6jp0=DF=`Ft@+IcAroI^s5U%R|e|L z)ZfThr!TcBH=0Ku5Np%)1W$U!h6LVMirFx5V(ngZ&USOIG-PQN}|@)w%=)+eYm z)Iq(GKSCMwo}oebb^;3tze5?fC?Go^lp)b~8I+j`{@BKGvUi9^0<>cO2xa8O!?Q}} zCy`4tQJjbB`uO9(cPde*UJSkhS}`qXeaA#kw8703>id32*g}0emj_mrPrMVPaH)om z0tJ9Xt7ykCMr=P^gWHV;F`8YQK;#+kwbh`#|7( z>tj{#sBzd=!cx*CIJ-$7A?KSf>?@FRV%bwyo&)IlbY7xsV3?sXyB0;YPxvGd3?~=} z;><(&u+1^Bx;v>|HThiu`Ap3dmFI}-7L+lS%hwJ$bjTlAQS!vO$-=>2~ZFr zy9Yl~0pF?N)4&$Q9Gdk`+vP}g%mY904T=zvfeW1ot80a*vjfME%$0Z`TfJMj+RA?h zW6B!;7xiH#*8d$`bFwo2uf3HY)BokIhztPU$~OtJ{v!3B1LB9giD@iI9PK*cOP& zVTMJM#uoOpc+}O}S8-MW;Pw9U&LvV;I7saBl`>c^ za(o^=ofE=*el-X{v_i<-npUV&7r(!#){|#UfG{$MYGr*QeGt6!{o(41JQ9q) z*)z`t|FU<(H$_SJO$|?_Ed>obBWJuWh0^3AEAVl3_ig7*640qz)&=$1%h#d^xg46Q zO{6i#vPZfqMg3^NS$&JtHhFB^P}J`x+NJ4pg}RugUL9>a#9+QbpUg#)D#xczZ^bxi z5U5unzJ>w<3anV&_X}Wct*_H*1l7F;-0gNoXs2k6BzosYDhTtK)%kO%Gi^myXb4^a z8@=QYz}9&I>^A^lV?$t!G=*&s63eRWp$bLRsVG))n)pAqHm=FU^o2LAe8>z z?MniIPt4QeC4oReRktMpgaS(*dc3;<*B_`26u#63R1#-mGO`orSQD1f0YDV>-t+@q zx@Q4^m_gFYnwVhxkV>U&pB9#(uo*Vyd?Z-9SB|8f5u8uUjp6Z3b@{&c%KqD_Nvn{a z{!7Jzc-!>C|J)mmPXAnq=E=UiErOtDn%4cM!ZyT9e}x7BNy!OHW-wadJ5fe3UjW-m zEXg5pMq`8H=r>>k1=daWH?%JyH=rmH2NWerI-1fS zj5pD}6lC2U2tYJ8Pp52f%K{-8K(<2RW5_tiK-jCn?YYVG0EImAOHPH42wPJaoM2c3 zze}n=fX)U6l3>sI?`%cj1F*`!vlZ!oWGf)m`Jk0XFbB$jE6+6j0Bn%ZI%V`TrTra< z2nP#&iC!`ReVQvE^1MRz^cZ|zoWrrKGPS*lo_pGa3l?8ww|Cp&@&{hy zoZA9}_`_T&0iu{d)`U^-^d<00-dZ^M`1spgp`L`Bc^wWkELv%uO5slP2Ay9T7WqHa z)hq)0G4jV558XG_Nv)B9uS0qL|2TW=s4Ca*ds{+D0cnsB>FzE8k(6#}M39h{?ovQd z8YDzSL>fd;x=TSNr8||B4uAKvH(1B>`JVUv&oK^LVQ##0l81PVtq7t{Yb3Ywapx(_vP71~)h-^H1Ic*kdOD~&DPOSqzkNQd`7qGwFtHoNk$_bPhF4>C& z@l`Evv$`qBdaLNInKOP&(Ix~QqPnM)BKT|5;{SLf?NDkp@3E_nSC2D_`#7au>>#7N zyAap(N^0M^QGb7Ezit&*S<%zm!0U+X+ta611TBV`p4X&bJ!^SuMuh$bFWGK=5RDFb ze3cUgp?%ww9-7xZADY$ctPRBc`DF>Y1%qiToYvM5NHeb3=J(bqWuOagUrKv<0jI@RgGCiRf&LMGHZ-pX%EXpUPlnv$)*YJS|*SIaXA%D#ve!3cFRbTJuay2k#^Y;(T&J5tzvP zs1>q{exvnsPvk-Q9p=@YL6kfbwb+U;tO8kV`|s{h?k-AH?$h>2)H#xfaK4s6LTx#c0&4?b+RKgBBYkd0$`P;$Bn>G$SEBc2qX3-kQFT zh4@B%&Tr>Hxe&n5HusK2_r6kOtl&0$I({R3sXZW*s$AsR=h?DjPQB4VmCWULaNXrEXjF{*dyIAukVx z{En_7GD#Spd}&PrO>SP`(ByN!PkdvF2-@9M0lyA;zF&qsw7Y`qKD4`@jA~Y}yQatB z>u=J4ZBokzn9!gd?_|hd|1so^PMnv}s;L52O;`dG>sNy`A3R= zgtl@l|6uZlq9|x9zW{QSU@JF+4f%a+u$7BJTX`+V&#io*t1Nmx{HdbBQhDY(zIWEF zj%2PY#(MKQw6U*&lO3cX!H)+Y^0q&Q{9nJn-1ex<7U^aD+MvJuWQB@w1100})0EvM zF=MT%!)aT9J;SdRS?kMG1P00uV4&qXGy4-BD2Z}(X(o+5 z*68|@6J%4d+K8!`GCTKC$LDV^g)*Jznf6hX*NxHyy5++<4K%$C=NKN$&m!Ab3psTY zb#*59vc?6BCqf3w*DMSpFasqdqX1thB%?r&8l&SzZGA3BwvyhnZ=Z0!nET$j(cnTg z=1j60$dLaP8%K^H7fyY9*P z5yDg$FhLHAhb(7il`=9fP^Y=JhwDU-M9^_Dk?&D|CRy-q^6?dadpI+|Jd46N^1MT~ z!ma65tzO(%t8|e9Z5vDM3wyE^?Nkb3o8`e>x&cdOy+p(9rB6r2A`grXL5i|(T%|Mg zqG^wLanZg!Hkwe1WZhZ3-DfcfECkZNYRe1uJYp({)5}=2i=_G`oYf4Wwka0Pt$Av! zz(3(_p=kFdHBLA-Tm9>V!Ij$=A^!xm4tOVi4EggvhI|S5)%HI9)!u)pR(mA+&=&f| zZ%!q)^AXMe<2S#S93G-%|6!m^gbb8DSc^R{10_XAsWP#rtSgP{A`5OfDj&(+ z%(5OGdX(mYYk@z}f8kC6MKD9a4V{9ckhYOQ$>bX1DKM)E^0F z8i|*mxkOtd!%h?5E_2xEILqINxV)dsmX4i^LK(-) z*hKj^DH&G{L%iHv?*h1i?gJ29d}-@d`kEI67yEYfzCfnN@jzn&^OOTIUn(?eH0Iq< zfFu2W&u&AKWp;>j9_hpOJ3NmJ%+?K)!a~EX$#BVf?ESFg3;v7aXn?98hO_9?(fWR<(d44U6-0XegWG z1s1NhWh*!~A|qGi_)KO*_r8%}hbDQQvlf0C)D+S?p%W5PD-x}3cjWdo@Ct>pQ(bH0 z?|Zi>7|HGn5ZXXGD|Q!vqn^LZeB}t=yI=n5=+}J?>c=HL&UxcJ2zQ zzgXZR5zp)($y^@^*6%Z+EMmi3Erko^NaVxNNIv?vkvw!Vk_DiV9Gt0$o@E8Z>4H>i zMriLYf%b0O#02=>-P={HcH&J$Me7Ec3x+KSP*9Zu?cLgc|Ne+zLirG*5BgtzvXhYv zunMq|eCg-jO|d(rdMi>*5I&OM%wuFK$}NGt8~6!fBN=29(O@|@@N@v)X<(D|2!S#U zN+8qlB5jIZ1@8aEnS(|$c;&`$07%He_U;!fwaD@Y@HyH5<|wngsFcrR4x^+gg}|`m zdiBEtym_#9k7_nUnTCz3lrsg|^Wd}EETM5x$eQ4vn*}HeRt$9hC_<}Fc7MQEfCkM& z=ouC%prM%;Pw z?zYhx{e9Z2Hy$VnF_rZ`6}N+pBst+ z`IaUgpK}*iqh^nGo4Z2}435s1c~wxou4N(AGFqgP2vtX|Fh)#2zIkRj{HeJ2FGKl= zw_>d2+f%aF4rv6GrAyZJiT7-U%{eF7{Y6t3L zzNYXjtaG-VOTr!CZQp`DzJRxViCO+=d*{k)69AkbbTzHo-+J}Or*d?6Z8&HbcWd+@ zbz}Q6gd*iAmMWxqPW~zT;@qc!eiWaCQ>i@TL@FPIOXX!iDmSz|4r;vyhVuG7Xei@* zw%5yMV@nZrgQ2{KId)0+-3)&GL|1(yie(Vu*3GPQd?9-6#YkW%FGz@#ujR8@e-je> zF_iJ1FQI7RoepKb4-Ah`JSTM#-IbXt_8FB#=K?AUtwq7+4aFBlIy)F<_8A#oToLEM zs`5B^*H-9j0g?@FhfRag8P^tlve3fcecqpP{gG_2g^~^9Xfr!FzK*7=BoN;KN;a?_ zgzA1bwB*7_kvdY!sqlp<<*7g^e~xEwMB`kj`Qgi%l_%cBsPpt+aBOEq@Kc2Sts5I8 zDsy@)4NylYGiw8wC^(%-%`Sxr%g;6Fl}+PNNKTz69^*2fTS)Aqzom3-Y6f{&_BD!o zK1$x*%qPY1!4l0TSM|CP&+oeI^}FpQ;%Q^%ex)dHsIb-y;bg2d3uN~er_OZ{XIU}6 zc~p~Z!MQQr6oukcJ5Z;xgS%osd;`ZFsh&*SqkMMJ+4LZD0|^nGh>E^zDCI3JvAbx3$05J*gl@0RBb1!X`w_a~7dHy|*I>ZMBf( zDT~W57P}t4k7Sk6dG4BFmzEEEEm4^8i|~oiCyd3Dp#!6W!wi z6oUf0t&a_7g{j4nPquSoA~I4!^{XbFITsG-{pjf@+~l(&c4$x%BC!FZsp^wa&R?Dd zcp!$-|GA!Xad7?j_5AhC?9e;I*RhWd$ki^JE4*U84Hx01Pegc|4Mh-eI2GY}lz$Q7 zxj&l(8vG){Lji|^pCWwtZz6o^WO#I8&44L{CO@D+&SjV$+1cZ6CvMlN=Wo!JKBlf| z=Pr)5ZcU+|z(l(IqUaiGLoq4GEXp)BR>*g0Jgypn&w}o%xG7CWawNy#NBEYkF)L-H5z%s&?| z94P0Y2))k6dmz3?j))-~WI}mCP$ttN1trB2?QuFh;b0JvuUoNOY#-)pK7j#g@O?mo z*B2geOk)q@GS3;0;u_{)FKcrc0bKG_v)Lb1pEPzT8^8_a8y%s1qrtD3qxoMkM^M7y z1Y&SbUlc$LU{4VwAiuWPfuC-z@ros7ioN5$-3rnz+Ai_2zhREHe#ac02|0xr{N=ss z70^%y;YYwzK-3q9i|{l+g#Ybf024e6Jb;#JNWW*6_lBM$YPgyc&Ji31X792qr&!Q7 z?-ekKv1c>H&CjBO{X9F3JtcuQ=LXZ+T5k4okh9QLsc?U#a>ECT-ox=tut$=&zBLbX zhxdnr_B&i8%v4g3**h@?f_FcddkJyjMXBG&%jIpn8LqyVc(=xp1-AmlTF7b^LV&uZE=8Ukbxe!U+kE=NnbTwCrUIAD0>Bq3E`C*FY%d_)WZ3alDQ9LbX zvGx`pLMi*-Qx|i-68wfZGV?zN)oh1-(%&Wr-*dJX~(tG@>v zezK>aa|Za&D7Dui6<$GHeazeO4;B7k5UB8^|DwVdU<8YxzTa`PLBpCkh)V2}h1&6O>Hi--}j|14zWAr_||o zvqQISOI=09-^ZBDZEO4fBctzW>%kWq2b5E8aP=~zY9$x7>F2Tgpx}xb6W3%l$km=# zk-V`Y?0-lx)txfv>0c(YV8{t#4z0%~pK7&}6%prEYPFeG(t~M~KkK zU!lvtwzqueJYg_iv;EO8a5__%T?($0nQM6aY8t1;zUiWh<&zun z_S>An7ezi#T;TWb*nQlnQ&5Ci?yTl&u6B1|mg2k8D6dh}a!tO+w4rMsJKIIy9J?Ay zAt2{tUMAc@T5cB}DRoThzq$BMjv*)5hQNCCkuLpSF|UuwBYDc%_Od6s7zKS)`}|L6 zQ?TqC-aN^FHT3F9WW?9=H7{yPMa+1e({4Y$xoj^`OwIkpUS-2Ll701pafr}+qYt!o zEN4gO8RtIK$?<+jj)|^7Cr?2Nv@S3rCmr35!`AOXtt2w7wbP+?%6!XEENgThuaR|v zxPG+va%q!aebqZ|M{u-1YU-0osXEU!2?CVvaSb_?%;MKnQ>(OBGt>)-gj?GYj^iOg z-|6f=XY*U85yYhW>b3yq!YD#EIc}~?bzRP6Y{KdYcO{045|PouJ6{WYLD*KRTaQ%; zGb}kY5EeW9CjL@`%KI;m4E(=v9sifjPT;p99bmKjcO=5EcY8&7!o@PUqA$nO&L8DP z+Qksvh6ikRKNWq`c446C+ai?v4b%Uo=ttI4wBH{w_-ei#zpqo^W0eEzC*#ahgp3h={ucD`kVL90ZD(>ZwEWw zko(-)+~$$z#;~a5C~Z*Iw3F-c-nm|=&xC$p<1ts%r)28Jc?q)Fmv8pD9=1$XHr)_M zN`lackIFOD7A|&JD_173L}XOG8R(Q4TDlWZ?t$o73G@THRT2t2q#*@o{w2t0SM%Zm z+-SFJoK*pgb{F7AJNwJ=Pl&`@vCjAq!HjlPo9`#RZsy#gl3%hGZwVmoGCsn2>BmIi zUpOMedEq9*5Cf<)3CJtKvZ{OxBwkevy@kX>cuk#DhP^DuuBX<5&rg4BNDiPAa$64(p4HTwV|RZ z&JHjSCz^gIQCb2o?3uyA@J@ZzP{|Vx_g5eEPR|2rK>-l*G45?`?Ze#pt#Y)jxaELr z*~#Bw&kSxo=2gNa6DQ9M#y_4J5+Nu8g8gCwfFh8>i%do`h#)9}{FD=Cai|-a#9Iv* z6k!W`W(Wb#3?sD6rgB`|cOR)Pwo&G!gUdY`NJVy@q#|vB(=Hr1?Q%75i?an7FiG6X zxElP`zIMrZ*yKiQ3;&yz8dL0^PD6vY;_=yg;p69bD)%p1?b%D&ygk(qq+t4iGlyT+ zQ%hwl^7E0YKQH(DiH5O_e6Ubt4q?RoK_8Ci{M%h&`Sw(~&LUxq||QJwk?^RCm& zJrMOX0_$tcHzQ6({TP)ZuOyhLPu9i4 zdz_GbfC9+}lp$1I2-=TL9|~M^L08}iUwe+sjYHTwCV$?B{EG{N^4LA(+0P;KRe2xH zUL>qv04_VWD_2rEG=R%4^brvBtNl&|{f|m43q7`70T$tQv><>Z>gFVhqvgCwSW*(S;#fp}7amm8yEOUaP;9O> z7)=psd<`Yr<5#Rm;O80kjz z&C$ossT&k{PfhS>R=Ey8`E~)nfC8m;{7Z$SkFFS%%*=BR@3@!q*}F-r^_xv*={(Z{ zezih@E_L&tKMbt9Xtsq|*cVPczVqOt6*@kom#SFGbi7^jxVfu*$K8|wbg@18)bRVDH8Q~*{THxNNO1Na6MSJ_(kH{miwl^? zYel^id#b&`h}MN9{+{*h?F)f>t2q{{Z>_SgzjE+Jq8$$6UrmmxH7iYTvnaaz6JNZS z;l4!|K~MH-o>mwuG zL!;O>1I$gW{fAy_`eUX^QXvy6&x&ZD;pHH!9>xme1V_<0O8cF!6yeG4Niz#+Wy#4s zibYow3f$+^q)KIes`94O6t_*~m1^=zBc`Oz`*z(qIVOH$70X`ec6n<6#j^me2 zDhOOaCmf0vr{S`99l{SFSNPyOhs)2fi?Hd&X4s>`v>C7(oxpH^TbnmAa}56Fl`bT; z6Qp5mF~AaEU3Tt3Z0;q6cb#&QTRLD9+5tA(U zmOgiAzhDu%?U-A=pH83z1YzxSHTJRX85$1&53sCNuWM6U^*PJduqqhQS#*N_al)U6 z1hugKt~*%jKL$vKr+~VM3U1wsqDBmWx;PI3nVM(lpE&3WH+TQw9>cdb821(P#o~!qVkO22`1*zi+g)nz#`aog;FiuIGY1MtR9OyO<9B)rxJBXD9iwqNVEn<~ z7HSv|8JruQIJ|_sb$@-6)f3krNoYXaqJOFlRUAc0(-#2fw$zaVt=dk*K6Jf25zm5ke6I7_CjwnMvE zlX#QrEB(XQ>{N3!+Pya}(N%?HqEUY>uO`ZQ=E|J}*80aVZ~^whj;lp>dV^P1V_i$9 zhC7}zg#%uf)>e8C&EPhzF`ykK@2xZT*qpjknl(pYR?W?UT zo@ikbHEm}%PkqTnq)Dn!xR78o)3XY|1*#j_cBy1a09*j07mEXM0dab))J002`%YTk ztU~ltZ@Y+%VDw^2NaH^TG=2&spz#Cg2GaP?S2|F^HGaa^np*@v>BT^_0`y{^12J%T z2Rw;Jc|{HJ^!Oj>ZeYFx+{2+$XP6lNHvG<^NJP3?%*m zx65D8yR0AIUXXro$`oN3VSNq8Fg75PFN?V*Vmd6(mL)*;F!13N${Te+D7+=^ypC^Q z#!T4ssPA^HF~J4>`*+U7f6G)4*%caGR`IWj6V))jxVq`spCVNq5#_8%>Wv_|e^0}^ z+xl+inxeHULT9ygPM;&impBWwcb;nXrQ=f{rp3ZwBbvD38|ukUe?Aldj3GRs$7a)G zqvN#ox_guBc=Pcrr9kN&7vrZe+ zzj|eGTzP*-K1ObWY$-i9Y%50N8gkCq?QRyr)F78fJO?L<*s2>4c<_w z$ke?!VZzU(%eGnTYP*>1_#M4i?6J#59SJWkD$!?P1>+(0_My4B=+|^l7}6w;EoBBz zI=Ar1FDSAvlyLKAU~IE0$GmnZW z2XP+22mggJ{I^5>pYXx^5Pb0e@Xm1wBT^tl0r=qgyT!pL@WGTH@ImU?MrhMcO$D2_ zmKpZDe5;E_5PUGsYpa^j6M_%!z~F;5-M_&Hum1x+*yqP6PE6^*amb$haJ?CV4@RHD z2PIG7gScstzR!gMm_*Q71TV9bijfcdpQp746;DF8#7C85_kADLIF83rj-9uQcebWbBdAr8O~RbO+ZC(M6F zwi!U<1#eCG|!vP3E!mS{I*MS4@TYwJ|5XV&ce=fiON)49gULbw%pF?7|8 z4j2iWoX;(XYMj+5K=qmx3kUGQkJoPZ@4yJd!hkS51PH^%>+c}S>XZh+56vVdNOjS@ z%VoVwNTl)b{Vc!CZI)Uz<2^WG_&4~V2p|kY>u8Z1fDfL=v>>>j6TW)o8~_(Vi)@h> zI6oIcjxZRws3Zcy4;93m;)mKa$+r0erstnx(9R&aKtzf-}Ita{w8v>*d zeuV#E9K`#~Vz+P}z-{f|LxOXhUqT#byt&}hL|d(>gJCTGeC5mis+3F~P#9Y0=+Y%> zB*<>9R<42WV}7z{+izNClz|}*DI>7N!1C#yodE6G4KQsU?AZ^NC94*>#>kWIx8|_+ z_a&Q@H0L-g3L6O$qK*8rXT#xx&SNI9!ch6sL;cB~eF`5Gf#8EQzrhC&VDQ0OLq_qU zNj}YM4b9ZgkNQAk=#M=c4j2Y|wvrtz(Y9z_$TkW~v~{<@@AOqvdP!{Lr~oMq>v!Ul^8XySQF{nrItWy#*!OPJRJ?gAb1U z0w4VGMnZgHv=hGY5&s{FwyeVZs6)2(rdI<4%>(Ra>`bI;CSRJ1PWJ3dl{S!QLx}n% z(N>%QwE2CGyX#~{g9L$1oVn^c0hOq$^7cq35~4ae{&Dq&AsaIfWL45^cY&U=kH5qx z1~bl~LdH3i{*sGOoQ?Z5&UVTeK7`xj*{!`lHsZ{2!}vq=|8UOLBT=`sDyQh33iE(5 z421a_W8yTm$!Fu|7&2IQQm^=6uUp7{5pC3?bY>@(+gV_*GJq?S$^7h`1sSgv15j)y)3*7Nc5&Eba2ThL+NCJ>$6c0Z zw#lYRV~VV9*$JTB4invo)D8Wr!@sS^Xq|b)q^(3ce4~e*?Y0iKBA1hW+QL^XAql~e zDJs&n_4!_@iPYTr3~aaQXG{(sZ`jMH?k#vDy~mos5}KZV`HEVUgZ`Y^nU|ARQ;&50 z>Wus6MDIemxYqp(_;mQ5uq9qheUqy{FjjS6ZM)}^tk-JRs6tw1M7>c_qtFC)MS5N)dr0aJ29}9~d z(%}%_OJzE*^6c7-G(sbWI}g*RUbRavEcaIrsWUHO?xmM@B9E;lHb-6hLuOLo$p(i*qh3Qi|Wn#n2!u-D~LZv=Cje65ae}f+LeT7QDx#EUTRcuDSq6~ zli>9sc_n%>L8V%uk24i~`zqFZ{f{w-%kzDxAn!*lRf*89dRyCzLVO^Q0szkCkkweb5H~Qa- zretI;jpZ5E5Z5g=)}e}f8rG?$UC`G@YtG7UXZ)fjAVWsO|E#9AhKXurvNT2Wv+6eL zJzW_&)#L_gJLs>tyius-F_5Mto97SL2d9MW@OxRE%|dgi&tr9M-A}qCP6qui(sISnKaH{ZlpoHXf)AD-9*{auY|Mn`5rG$ zE_a6JhNdc{RF2z@jT|kn9B;Jde(jpwYHl9=inPoY>+i9?)Hk>4d$8L*de{5lzS42U zml&+*Y^tw3qWRvQzU9>;qE+KnM@y!gcXoOj=N>C-e;=%N_p0*o^4gs2%N4)0GV1F) zVp~&HUF|uje|#_Figo;xVlp4y0a?EbrkyEh;RJPSd~%9jql!rUhQ3-?+090 zSNM#MIFHaitbSM#P1A`@A&h_KB=A{nz|5D^t`^|~MXktFZ_lmUuJ5fgYMKK?EjJW2 zBSizZv*yMT_L;Q|Df1Lrq5nr-E z=X6crOApC5b*6J^ zWOqD~L%pfKtb6Fli+Uq(A{3dWi(f4=Gme~(c!INi&asr%tefNt+eczclq()euen1W zhVMoX*Go1wa66Ytp}u*?zV|TmW6=jCN=aYj!T73GEB)E}PWskxlqx@&p5v4WzS_8Vih0aa`rcu+xscrUO#fax0P^Dqt@rqXX=(Jd#3cvuXS1RY}ZN?efAo9 z(WMqJs^-vEoT!m0jgYAZAJ8FF%HRbo7Y9vv@K6n2m*haJr$LUvQT+J_dkRVWqsyrE zcX_BPD6XU4HAAbv1HM%0=U4oA4fxU`&kI49qUew-KL!~K$K%+5zg*-We@>52aPuVIsSS0{^RD)_b&?mUpD{OHa~57bmrmT^dO7=t?S`{J4~G( zB9(vhH(Q>wvd$)!Z|zN5V>BJHnDciBnPkHJDY7JC011_ zaJZkJ2TtrKi@#CtUs?z1W$XXFb>KZ%{7EPsxDI`JsHVeXs$+*WsF85@1knX{a_ zqUm4FS-UZPSF}ae)IraKFaG=f=Xve>Ir)TE!QwA^4=nx;;;}%57*iw}>os3+;)8LA z4?#5k=CLQ~=j-ENG+@#AFavlr-ZZ`4qUd#oyzCd*^Ihf(yPeeTTm9YiLZ~zAiAZ8A z;?=h>C*IGu?#z_S1bN7!Ib$rl@9q8WplsW>l|0D#R$j;i5j0;Sj#qS>UT#w`mR1xehvh>0C(6rZ3f0?!K`q@MNjL7_$+uc z<>)^af7opvxxx$Au^VuQ>9!a_-h1!&#XrgbEdG%Q!sb(qospWb_Q7I$p^v*U<5WdO zQpDRA9y#%Nw7A#Zk1slSL*Of*V|)}^%#T6olb14Ol(gHS`aI|pPsdF^g>I0VD?Lfg z3H_0pyNJXF4$AWY9~`%j{7W<*mYSokn~izsDW(omeaer29*x8rlDYjXa2L})TmW|iG z0%hYTrsNph#FT*)a&Un0#zWUPSH-9T^62jw!N9}U6V_MSBt?|Gi}U+2V_224%!c+_ zisdILVg}F}lgWzLdp3=g>1VF?LIW=y%Emi@Z2bA(vhful8=nla@vsX! z%#{}jTzUVzutToAN{zsGk`K^l!G*oz3#c8Khu045!fOX^A5U2{9u*vi=!uQsJZ1|I z?$h>={V<7x$d*_~PmXDv!?YjcArqRp?vG16e)k2ec3}OacA$%?EWqjVYs!fA2h}l- zp&N@D!fxPq7jorIp=zyp8LmOK0~h(H3PJ4vFr#Ey(_Dh5i0UI?jD;9Y-lPPT4;*nc2~L=5W8${vDVdyKxm?9ue?I7JS(zG= zHQF*t!#(8Xq)>~RypNs6g;Hn=!CFKrPa+emR@sTiT0@}&`xz5hV(vkA+$wG&01vbK zgu!z0VDbNyKs94g*S0RF)g@UVe)cTE0!oX&wp}{$-qtFb5izINQPUe(@c?AcZ-&|P z5gON^3p>o74;2sK_&#qM!^qo{*a@S8F6`Lg!oC=NwkzXE?$nA8-TpiA#{110%u{a0S~l`}HeEL>jFlFBzyP4RS8amwY&X7=`|U2*Tm~=#YXfOF)mPIK9}>^oC8;TBOzEeuiiDX z_A>zCSUHmk$hmx?^q|V55S8(rMBEFgl?<`1Gg|hmd0>~@KyV*zBsUMcyv1@3ozvw0 zxgQt%FT#YII3^AR1eL6H{b&MY3c1^&xgX0mCIJiQj>5UWDgA=~u}zTsw~Zcn>YU(h zf)m)NEmIe{lN7Ui=(yhqt}9|Ek2s2O7aQ8UyOy|cTYYyM3LyAASpG5M2rLN#`_xPKM z(hk=37Cwtq_nqzmkdh|^HhlH&JNw{XUj)C`Kf<2bBpUgGw-?dRr-63=d`^8a=6PTD zORlSjut;7c<3!`}=EasXV?OS?SA0CLyf{F}fSv14P&o6aD4bocdzt#Y+C~rxC&8^# z=F)nliU$GAhM!Tj{VEr-;XjtC#)k?0;V753DivLM-MjC(F@IqDIGP0Y3>-eawgT%J zmYSuemtB+Wu(Cx@gnrJy2>tSZ3jGsP)KJS% z6Vx))#>pOj1?T#y zs|tgMBVps@tf!7TO{MihOs`pn7^&N&=D2lP(7FC8gL=aLSB6roO}!Yh);Qp(gUoDS^;GyQC<}F2V*E`ll=O1KrDROH59El(YtA!@qrCF23GW+U(1A1WOq6 z0ENQ~uJz3G!EPVTtDtLr=$|N@^KcYS`VSON$Ps+pXZ%3dou|E$Z;X2mT$j|)=rW<}he4uX!3C%=4)NiU2AHA6|DW@rY~4B7Op2`UAQs{CNrEkf+N zR3n%Rzo*A=)ZUwgvW4A;-*9z_{l)C`+2Y3A#T*AvO#TZjCXXphJ*a|zM4|@`{71ON zMy@O*UG?Yrp3~13J=o0K70k^bOo8R(*`b{L40iSj3`ZG(2$T)apXB8Ae}UnI!C*M* zbr9#N3I@Ze!M;fjJ{AiH+Lp)Z%AIga-H#6xHt-dCcZU7~uLI|L8E~$L!|MkA0Mx{mv++*xQL2jWu0}dAGhB%=mJun z1;xr<$u;)CYAjlS!7;evFJ!t=Q)|2{BsQX&_2n$8)9XN``|e%^09-c)+5`^?v7tDg zQU88kDAh9=SVkTi_{i{qU+EeZak#$|fpRS(DqWx)G!1wp-fp0A;;h{zkgcfa5P>ZC zn7>=_H7T46;Yxq{x79d0aIRkl=lW%OD&8HnQ3jdwY(fYF(vmxRWlB=5*b;@WxxI4p zu@M?5Qog59TuO+XI8+g^=Px6LI)!c`OE?hwG<y4-N7DWluRAbOo>7G2b=6t${-EX+s6S}Ct`~-+?O&5_|0j|b))D+4 zk+e3cz$*VgkhCNKNozX}A!#K5l6DXvX=?$J)^_$agt!xf5O>e)xEEkZ+V3M@95}vz z^|(8rwai!F(nt;}g0GFmD5pC(rL<+2zs{7GwUIp^X>JMM2%*{-6VRd!Xyd9xoG84msuD?$ce0Yj(X~?t@I{!yaoW0ksFNG8Bq^ zHHF#(msIW0)wErytNM^Qwmg$Se^A;5=zxFK6)9XxEpku#{)n`?MbKtDO6M$Vh~7IK z7DBlZ#OHX$$eC^lzs>d0G|(T!l9PXgk6|hlxFz)xkx3i5#_=)e52~@uXy~e}7S$^ppmf8yw`x1#BfMG)mXV`?d zcgvv{ctofFVMXeOitRevyHypxzU;IMQ`7aKuG@km?&KlF-Jel=hw;;>{VDw>E%NKa z)oEp);JOC%3?rGVT^|?xoT4DaT?Rqz@D1ay3B|k^Mm`|nW<;{vph_32#tX&UDd32^ zlHOHV)E>^H1yOs)KU`-pE59Jbq%HV+{0}6l$#~hUvUdf4kDYz6>rw#Y4rJ~BW4z8sUrCjTG6B5jODP^TYZdSY zq10)pLFoC};BZ)j&>tV!!7|31xB0c#UlgVg@to^h`~^yz^q-)#=l_7xKKlbo8v}>Z zno4F-`O*lBR!0r4uA*e89|8_=T}UT@+|dKboki}ac>y#&IOOj2(bmgp+dy0Li-z!c zU60}Qx3GBK_|`z>K8BUMuY`>dE8#6z)ZPGQm4DR}nDul4Smi-~kSFL58m*y84OHN3 zIhpGZ!3kgL^6Re=>%rBfpdxtk@9{dKU*dJ3Kk$!u-8f3gc~G5IT7f&=*PU(thXr*f z5cCHnyjacJi7j`9^#?V9{-DIWvgvmct;_Rw4h!HX{2g}h(-ZzJm{r~yobX{*c_?YW z7z8ElabZ^ZC~qQV1no*-mA?h7^7aIi255IKu|VNEo$ET|7p~Fhbc>8^nm;f^@g$cA z{XuX25M5ekj@;_k%)KhW1s?-v&IaiL?&hw(dwd-L+>M;fbvtYC{zjbVGGLL{)jCHt zKp7B#{taomF1K9yWUhaUN+*V0@NXq^wClfP_c@Du2M)Mn{|#_=V#A~I>?`q2gywoo z-RFVTA9J1YbgrZ1H;}YjGiTw*bL8gnRScS%>VQnR=}l43p=@R^(i8++>Zl|?*;6mM*> zu{+GlV2M!bZ!*u&Yj!fPHFCKxxJd~=o#?(}LcTW7_#_{1pB^-?)>q5g)DFmCWFAB; z5)^Thhjw;p_!-#S=)9u}Y9>)3+dkt-KjGZ)^Ec zE->0lSIY*6pPZeoL8)iz5ZLiPzKVMdS8FZsf282*cY^{azkh%zI(L-}V*y1+SuI2y z9Rrf+WnRrGxB+r;A@z%f{JLmDh&KNL8ttlJw2y$%UI|9K!E6Duc#XKP&L^0~{ss5y z@!rreY_yB+d@0DiJBEC5hhHW7I`Q5WG2i<44s_}DLy=5W#Z?Vv@a7$CuELY^<3FkaYcQu6wEOz_k#bmS6sis{B<@wK zoh0Woeo4*?g5>=5wGtHLl^vncxS8rpQ?^$;AFN!1d-HIAc=I|=y?GU9;odx_l`|9K zh{^<1dE@3af+;&Ndac3N)*s3FoIjKE{ZMlL3P{dB_xmhk*s$qxlANz1bA%{5C8Yux z0Y4}@n{eM)9K1jG4~oub2+EQQpe(Td+yofC_6J30FOUPmxt|o?&BMWVNpN~?#VU+m zJ1F=IMaT0wNY3vQAYw2FnUF)tdFn1CrB^}kTeS{XjQw4VAbRay&S`QUA4<+6y%X(M zODlvW=Oej5a-O%{K_8Z!&w~E{i=HS7C^`ebbQi)$JDd;nkDm-Q1DB~E;={-_r4S!T z2rvO^t^g)LH(a6z6rGnqqW={)?=cZBlO!lV3sU^=#QT96F@lRWhy6a+4GwnL&aNfe ztPCso<@mQ?67V?=s=Z zq=8F^wJc!7Pe~`NFST72SsDJnaPtd07b9TZfYEM7imz~XsAYQ+&XfhnEwG-D?N<1! ziHd>6J~>epB|kg9lQ(|^jdpJ|E(}^Go6u#=?BR36LVPuC5Wn_$c6IXc zzRp;b(cztnu|6Y!w!<(z=rJ|fj-$YJ9t`%wpj%sXJy%r2u-{V-0q5b-`A_MA%eIQj zaDXjmZVeQJE8u=kw9VE*{wY*_aRPJ$LTtOw7g#3u-cG=}0oh>PfW5G8Kxue4ApE_8 zbp!rB+yDGjhU@L{AmBXM*(?79&YxK9Pj>cGip~je-UU!}BrI!MZK=V|?%V+F?Dqqq zoxL?9eBST#KX!Id4y=U-?d+l_JNrNo1eynt`Le_|O772wp;M7e=Il=rOV9JjM`W;_ zjoW(`Kvdf-1vLZ0LGzo`@Mge=%h)GOyOmMu6VN;W*S0{Q`5o@-iNIb@REvnlPaKl1 zA+VT$AaB{}P5*FQ>QEQglf9@PWt2JOVfE5rcd$cNJA}0Be%rJKA?-{cq#aSJ-}2>* z$^|o}NZnDc9@6`W575uPkDQ1U3JN3?mc4P?Ay`CvCCf~}D37e|@z4Vx*Yk1*xD~f? zhbWn0&N#%i>nGNNFkGNq6+-jdHoVVzw%94;c{aoG2KSU6C=lrm`lm-;<3Yi)VMj!=*m?KmM!}VUQRZ99boICTY(9(6)3)H$HFJ%m zu;Z!X5`EP_pnce*vCb|0#Ysf~n}W=@5&-d#Gn;8e3u*}1nz9-anz|Q)o4DNTh~k-R z4`tQ^#JhuB>e4y=3L*ic_N@=X&SlkYEz10eQjA+7XM1*l{Se|~>c=lF> z%98G!M?>4kKz-+|n$Z2rDChrABzi7h&fgR5DZ`N?6&FHQH}O6EpX-X?=@3gi%tM&B z>PMO}EhgelzKtSFcRw|}$|o$=?P1d$a>WkAD9>Kg@Wb3T<>sf?mR1x{$eSq_c$SH? zkQ0~o`C0b-3cJHuCkX8ivMP;(6<*X6P=|Cz-k#g3t+_j}GI@*nae2@K_R*salahli z&oWXEyO8#*f(5F2 zyxzQDAHI-M#m5v^Ol%~kQAmWh|6YuC!AF;qSdel3+LW&Z!*PrbLtfc)&&GazwD4iy z7BhiI6|*{y(zW-#^YkH2D_qJY#_C``chE1qZZvAY_93p;i+J2-aZHD{uU%+!)K|>t z`=B@|ka7L;xzm2IV%=6G?*)GDhZVD(WxEP@-H8~zN}TqyS~R4spR^Bq%yw2R_|q&e zIY$j-O-y$dimRfp9hbL8jT%v?E>SUk`I;WOJ}+Fsb{_}Pmz%aGcOD_1m3WM(IH-N@ z8|zilM*cowF+_|?*QeSa?XDwhGtZQ{R+75v;q{9wu}Tj)^7jafoKdLUanSBrJ%3>p zxqQbyq0AE5B+;n1%>chR`35i!s*OFpUyoUD{HTuASm=U0M_AMwBtK7#JdL1|I|*-> zI95oWzUYn)$sCuIkhNHIOMmIdLf|j#)@B+Y%Ou43eqS{@j|(EwOF$Je7!+cg=<%zd zLdJlI*zw!ZL#MF$K04t*Jf?edyR4d|)BJcMVyFt8u2b4QTdcdOlkU8Sd6$eI)9;;) zd%gSqEH+@DZg}r%x_Be`WV;z+iz{%HSx1hmWpVm&*G~r)z4D^>;WZc!7$-@i?A#@Z zlZA-%xVOu+D(t)qtctN067RRN2;(2^GP*dnMyv$2jE|uE?-NMs$sngoWhQmY(Z34n z+teDlW95%U88X!CyPE@u^kxu|J{l0|OL0Uz3gTGC3Cx$?)=-#ttylHawA#;Ny>*Gy zRJ$EMuD`Z+37=&=)JSuHf5J6verrvtCClpX-=B746xDQk6o&12v+-or^SxW%?l?!ezmFa`SOi5;l@p?T{LK0w~R27 z$YS+zs&5Pg5o<~xO@nd2amF-C#r5E8PodOYIepjT=qX2S5NuCideGgOG~pnW5WgzI zZvFPoy$PGyDiQE^^#n9EXZrW=5@-xf@e_%FPMyx3N$oxtS6`}_oju{^t-#HIh9_?i znLGKrFeaaO+PmJQqG)~VmZydv!+I?!tK)5;)P+`FhO!QVGkABwb2H5x8UyX8VC>| zxCDX(3-0dj8rMer?rGs!?1*k&m4X;ugW8-;Dyu7WO5|GD5+OT zGlyXg<1f0=PdRotr;J|yy_;(rXR9L8QM+=n#07IRGC7BRoBPsg0JPZ-;A#~BTVHv(nKj0_z;da|E7zUss2;LSqwmuT{@n))aj;>05 z;%v)&ukf$8)~x>uZRAnT(T6Nr;!I8BRE6+RV6&a&7b?@zSRK&^`NySGj7e>0hR4Tr zH%0U;czxzu&b)(ok{@$92n{aVVXxL|cjE0YZ^L+DVQ&Yrpdc7a-6XY|F$FBb#Cusw z;?(>~V2#7LAq<5DadUiX;~fceT;m-x?~GeNy=OFRAl2*-W$2@)I%S4wX<_VUh?$W2 zT*Ue6Ja$LvT{g1UyYEZ#CsTPdot{}2vN}N(0uV+))@GCl4TqSU0eOTkVU{26#hZkl z+&gi^KbL3qeVBM7jb)4{)GxD*QwM&6^77XDOGO7G1cho)gWS)@?TyjIIsWk<#17UR z0n3Bm?%n8nfQy|pi3i`i>sJER&p8u9sn%)43I7U=30>PJ z6U{BX_^W3OL7B*&;7#V#7;R*nH#!1Ti3S1xhjwK|Y8R<)EFEyw&4CuFTs(f&?c5w) zGO6COCv%Uhs9aJFG-u+|E@Z^UW$3j7SHcycwLu23w@zUCT~&(}YIc2W?fvaqV=437 zx82!{cGXAX-dG3rQFip13pi5mgAov&8HR$pGcC0Hw)osR%Mp>RmMCx?(|s7Az$8!o?4h_8lPK* z9AqqA%hsy*&HMwWLiBYJa^AjEju_Qw~DMFWiZ`i(Nzn~0WBuN=xTB0VY zo5zhdScD;M#D{RO*!X6Ups8|`%4r6*(JqW zq9!3n7q6i6aM1=h>B0RQ(C87xV_>&Z-|E` z-xDFUV#u;bL08C!0R8pCeB;x1;0O7?_+)~_8=w|wsB-uk7E_d!&`u<;+VOKl*SxI~ zn;jb%3^Xg~QZIN%*3oR1EM0Ln+T#x|RE$rp$6yDo_JLSY@r1oZ~r zpLVM%iY)C&O}|DtX-oaEQADa>XY@BUmNH0fJ?GG@*epm&7ZL&!P)9DGU6`GZ)T(W) z@x1PQ0&@sWoA}SVkc;KNau=|%@cv6GFx-bq8*t~@EI zHwY*NBcB~b@4j_{HL>{7iz6l>O%CaJ^Kxq0d#enrlYiVvvI2sb_4lVWpM!8i^64L3O>WkW7>BrM7Sn||;Yi_VT{^zT40}i5pH98(h|iw^t4I~;gyT*< z3;M{NJ;A#{&e!=Mfkt*;mCJpa+l?Rk1eJ3wua{Rble&$T-+;|U@I-KHLw3?vnJ=o@ z)y5wQvGGBdjm04q8S!!{v#Tw&)m{i#!OW0PlsRHCAYe}!;(qct^fJ5pIpjUc-n8G8 zfuh~>fW+8OTJ5^xaZ8BO8zPujO&FuO`Z{+!$!m2KWjL*FB+G<^14XO!cXjs0%HT&Xl&yAujms+MP|IZ^&Ug?{nWA z=7vl!Hg5VCoMOu&8o@%RK@tJcj4>dZk8qFZjqi^rDy->PjnjtQ-Lj z(06yrPzJ?tnmdBwa8f-55fi1>l>Jg?*$(xRCP1HO8~&TBcE>5G&*R`rDj`H{$0e+7 z@r}Jc$FE4PO-ON2HB08YeFc3)13(LMSJn=>d3pMs$S-;X{~+ z&g(YW=%lhoY!EncQB!+e3@w?S$(f)(U*>8OSn&24;`S_g!EQF4pE+Ijo6*a_n)KCH0nD z2pfoI@BkzQNz*TQhGc;a=8T3n#We4*LD3APQ>8S5&H+M)Uj+2|fBXK3?KF$`&ckbz z3sz)4wqocFs!o(soKv1JfV;BZvTpK}XRH@iPvx&@eyqhnPb|;VQT&PUvkvZb2s4Y; zpqeIqy?h`v>nj8{RxMGe27*Pz$=n%3rK7{Pop1l5&^#Mb9(rtS2}&0XZH(` zZriQdEJZ!uhOTR^s6>s3@)A_*CoI@^bYiUYdT-Q8VxPJ_C`ON zz2h$A?9t2auK$e-UfzIwC3lsQD#617+!q>2H z)%*Olh*zu7xMyj0JUx8M7GY*Tq27@cWPQ5vZwa>xKDVPIY{t+42#F0H2e6419$Lpt z@LDnW03i_qAS7lh))r|iQdLhG{^J(V2X28nAd87~s&~$=7FxM?HHogVH(_1IvH%A+ zI6GcWa}H|rteVeVO^n80W&K-CI4f8yxZV^5)P%D*-rhvUpqg-l;Wkx~OA6J}LMTv^ zpkB{ipf=rZM2;Hp3XWk2!9r`OIT94|yic|a6JJf9mbCaz*O9V5{JMtZN}MK}bGk8f z%tK*6`fk(%_p4d)R*(%P^OWBKON@|FZcAC1I$3^$g4kEnoCJ^Jy;y~m73JfDruy@u zi%qZ0{qR;qQf)ByP8`XU0L?l`-Zc{-h{p!tGS9-0Buu2SN zRKL+5hf~9`otDUACl9PvvKiDf(x&Tq(9Ox~=@q3N;febpC$HE=<2=!tcA+j_5*m@N zZy52m5}V`R;)~P=J~_0R+^JhFtKN2R&rpnZ#HM8O5l4g!LEL;sOBC=Z_q-u6#-60H z>kd7%eK$JD#GJ$C&b-zIxG;W7OWXDsB3%CwhuF$jEDOTUJWAhI-i7CV<_jGm5}S2A zw~0LqIiKkF&{DF~Drc2!Clg$`pwZoSjh2EQWq0@#zLR%F*_+gbW4|o;?X~QP<3Zn% z6qh zX*??GHlglT{Mn+mipfBIPguWzmhgdCu@|fkCue`Z<*?RF?laHM%7)FX>?L2irAUJh zBTHyr4;wN}STqZ^jVQ`-*sOzg28TzdY9A3;h+kTQ5}6Qmgkb@BxXPQV*7J5)cahxc zdcXOlNXZ>-o7VRjZ6V7oBVX6Ynp7I`+kW!fczK&m_t#-`k$8+cq%_ zYRR5?kuEd1YR5*oib?PRZ;!{y!(tKQfHC-;bIX0-;C4CTk@q$6H3>TY-_#xK|COKt zs5^N7I$HW?-EsZzbqC46)g9>1bw~AZ4}B<=@%DxX!H9`r94HQo@{c&EYgZ!o^)1IU z_yL$LK{(k4`~iN@^cIXsT+~UZx_*0eW7yZkjgyqs7C*%UVgKbvkIsyfAG3zwoqG5; zBn^c_W7N{zPxeAP@)V>Lq)_r8HKOc&H1)GI3FV(^L~h*y{*70Bolg>IY>#$T?5DYu zFGHW6)rff@HDbtw2f|TQ+l42jiVNo41Q`?FGGUJ|5+e)VOa2HL@jEN|^`p=Gi?Uly z+&giUlM5)gJ)fw~rn9ns5U0N4J1ajMI&8Gs5skL>7L~SxCAaPmj&k7{`N{rvL6MRI z`7^X9F7)H|YwecH$2SnZ0@e0`D7`2v?9et>Cu@v1H()ADS9micqYpPb2(ML@r9#^p z5_K?LKhL1!36=wD#Nuz(1)te&m@c;5b&am1_OQA@)+Fe&y-uc{KNJm8d#6^p%nM-l zO|vIu6o*g%zG=?fg*(=Saw{2xZ{lzi=gIP@P+rz6>PGyo7uQ7&G@?GRgk{;oyzqt> zm<}*|pgikb^DqPui_&{;LOnsrBf3w~#XeG;zDJ9Otcv|(AbwK~g}Nybz;A+M1cD>V zA1?=_)d2DXW*~_Cumc1~`ob-pu(^TY$S(J+Qi>Nw;Ei1JUuuW&@jrqiV@gS0?*ixL z-m0}mdWq#QXRlE84URttM<%VyfU}ees5)5c{#ma)PnQfF{+KSg`~s#+HpsuHOLONJ zg;Nj&?m-xVLbrg-82)1sIoURiLxAfT2IbmuC8js;TivBJTMh*4R%ReLV(YO+6E^__ zM}{!B%WC4cN^)h?e}c40ebSb81oX};WjKBE9--^Gp8z{o&*h zOGJhPjs_`dty@_vBYx74H+;8PfvrAXX(Z3nCGo-E)1`SnUB&hLUswn_fE&>X#BZ7f zIT|px%WE38=mAH=PicVP1YAfvaF%!#`4ixfo3Jka=P3nsz5waUdrR7z;}(`R_O};V ze*G_Hhw^`vKstB^=iHg=Z2}H0vW$vs{jj>+=iBQK!)kK^_gp-`XYX<`|qAUH%@;?_qMk*zB zL5WbL_WTtf5o+=*N4(vKeqI1+rSxK=k_wqsl$@-4o-R>>rb{`B63td_^m@|PMwqPr z6VW>Eyb#S-JV(|Nby@db`OW%&;W9tCE<&cYLd67P19rr-;z@mfeL{SI%WNnHHwkc= zpF9|j9&lFhGo3F`06U`Z++(fUoM*l&9G|Ah7y{MmE;F>D=ez1cVgRz(0rOVZVaq)} zH~wn35{!S9;YAo5P*dL({83Zig^9F1@J3sLD(-HnPpWNMiT`%Yd1Vg9=t50{&v%0wE-NpFK=6~?EVWLNedR#AH3H9X}(PKT!f=#6#!Qihj)l=2mbxViv>|fc)?~HzG;W z7I6KI;!^u3Kz=BP6*(^!6{7A*ApO?PdoFZ_{u~GGS_EPv*cm>KF=JZiyzEMJg`aIa zMuw!j>xmg0rjA``I&pUf>Q89HUT#MIaE=okG~ujLge@&aqn+`4pUyaKDjiJQp%LFu zF$fSK%9&5V>$h<1DFRHhIjKt`^oNDlZLMowWp`i4LhGn8=xL39?qZwDs&nCR=I^&D zG(bY;sUqJQ`|;kk73NUG1VzH=%6;1=eu8?wG4FXgWri1{&6n~dNZWAElKfUTCrcg$ zljS1}%~vvh9=_4udtXwiRq3^Gck%R;T#23SwqFOD5*jk(@$SCliatC?6AyesJTOM1 zJ(*4R^?ru_g|@CRy~7!oZPGq)#dlg{z0}%%j!V$p^R0%+`USBPrk8fU?<#2Eu1>6a z4cA08iJ%v?3tFv@8&{5@R8G^oQ93=jr+1HQC4Y6cb}2`z_d*f86zMP_W#IR@ae|9i zwY*rtz_wQaz!OF-34K-Hbu0J!*MV3Iy)FxMRx}M#nXXse#y}HJbNNLdbCrF$bBTb1 zmCEBK>n-yA3T*|-HUEf>Q%j*pcJFFQqx$VvUX7GO<|4Hh)IeZ0T?UE=syC?HOkoZc z{|XdpnbKy~J2mq&@4Y*E1p8%4?D(IR2M5PrDv$ra*a;qPu74>@)Q7_txKUfK%Eu~O z`ch+zD1_DeB)E~{ISlM+7L^fr&1EWfqZ z3Jb)P`XWrR@eN9)*BFKON&!(n$SY1a(ra?HCZhERR2JoVmlr~80EC?Afv*^+oGBRL z!LG2Bzp%V;DGmq4TUnnIg3q+Ux`la7y1oSiyqra-18W*`LEpP`zWHLuPVvsK#Dw(f9dRMdpdXh;1&k3uLU~iBOJqXfk1tM!WH+a) zM9BpF_op8F^7Gl^TPj%ro+`<1NrmgufjoO%lkNE!b-vSH-yEiN7(^L*|A}12N%-9# zy9sgS{iaYa)uSJv3nYnbp{6O=sgZbMBl;n$Z1K}!K53dll|aJ4BOc4z!Sud`r2W!) zH=y+5DyFdlW&qha8V=a>PjR#PFQri!3mo%_ZiA*1O# zjyD)kh3;HxzX{U}(XFW-kE;d4pHJTcj*LDIT$qgM=uL2aRDMkSYPx2J(xhdU^^lNr zIr=^wSq9fgHFLdT{Yw+2L!|j4TIa~zG3waK?;KEr719UrSKy~;j)-5y7e(9+aF1S4 z4v+c0iuTQ`m!vR`Jf*``eOb;+%5CFfl5?Cx04_>*+G}gRHt?O7Z<~&Q16#Vf9jn?W zhrBVQ#H>Iy1h(;|mW@h+`Y*1si4jFzlg>~wl@3772UQ1y~{bvqNTP| zxrDj8;cu7p$%&9zA$Dtdj$TxX@jj9kxce}klFhHto*evix$!9sp|S2I)IE&B>Gp<> zUtq2?87&tqTgkcG-5#G_KyiPo7ccq)Gt*R%ZS&@C-`Tx=J*GUD|Mg%D=UU$fftAI3 zTSxmBoY_E>+bzuFir|g{WwCvM{ItI$@>j&2w7zlKOxF@IN)-W#bd-lxNy5)&zatVY zJy|b-w|D#om3=#1gk-r(Zv0{i3*_5)80Mpd2DGdf?=Ul7k*PYgAL@a9guK|a)CZvZGCF?bgOLnQ6}oUl~mH3w!+1YlU24{<{uGxHhh77HgYqg z2P5-zKbfZUF{6dp_ScHs-CLDfa}oLYr9~X>v^t#qUt4?Kac9#d7dyZ9=6g$YW}>Wx zh?cwr_`AW(nJTwEhr9PlXPoZQug%WD`RDu-F-xw&s(a10;++ez7b$=Fm|*Y29geu$ zLiwHXwn7*vt}YzTeTau33o9i?o_ICmp&@WEcEz3Y{y;(Q_JtnnPMllR<S5_$Von zxi!o*@kf=P0j873R!lGg&8ByfqCYBxr#txxqkhm)d%TnT$P)M+6Z+jtncokd_&?e_ zd0s)$`!`mz)DzDJ#``jrB088FDipFLcj&_V(;^o9^8rr|%UJmawSRLx+gN^ru-5yR zQ{CRIec=cYS{g5>3cCzy^# zy2P*XdKAiaEeqjvy(;^Uzy0%{fgadY=^&iW<{(&{0DrD`WHT@zdf0ya`}dT>LZcJR zV)Exl`u7KIckgbKfam|)XG!i@%?kLg!=j||HyS4{uD_hy|M#8=8!OAd@FM=#G5BA{ z;C~&1zwK!JuVe7Pj=}#r2D9@2>lpk?$H3co)~>c&S+oI%2OlcrOm4Z?&);76(&Au= zKe$Ab%LPyLwauaTLS=&-1Xa=DRVqQbE8L9Z0)g>eBJZbWDWd%OK`5)v393b;X2PXF zgmKT8Htv;ot-d&dmZ-}8_KYluS4+x;oeNYoD*_Z$@k4w}tL>=hJp>=;!O$x=(mqU< znAJWm^ypC`yyjdi{ej-V_maW&m3n$Xn6n|O_$dZ@{&&uiBftoC<#$y>bR*_;cwv8TS08hYI&>8>a;Qw+ARklvM*hO|~@Jz4qVbr~Qd>QSxp}tQ*uXE@gO6 zf7grQKZg}0j;`F_2c6nAj~tunO|Sey>U`(_UxpP)UDzxcA+KI`j{>P#A;`=<5jF3D zdk3B@^LFa*-BcgFwP*KbR(D4x7K(H`r&{2q`#Fn2W;;HKIuuy zAc8ZGzWJ_Gy|j#OBrF5R+hIkzNo(-rqkx8O`d!rtP>`Slm=goEs*=o2Y6YMH51;%i z0C@UO)v0r!0pE3McMif-@13XR0TBd9mK8YrVIYF=c~|;pUEr20u8=W2t`^mXu`;hd zM`lxW37;l}(@57H1HY5!4ef<)%uy-8-o1l| z%ZN~TU1GOxyze6xdN!-d-~mSK_2Z;FZ-^k@EKtVSG$4^gUY)Q8B$CR{63GWwf5mn-TICfCAsh_Kt~1z)^H(5#g&Q2euP6fe6+5!! zVh6j^pU8{~I5wlSM|79nHLvRO0E=Xs(sJb*D?q9q21wOQ#g9BzezGh6iGf5|KLCrQ z>B6dJZx2d?xVmD;d9CWC5b>by{;wKbH!empO7k-^!}JuFc(gI=LdA^F7jaC$kl+`<9k!l?(bF@h{&K>})>ZtA&;$RhJj?W$SVL87SUH21zFS`EcGR((N zU>TROfbBi|E;-8b4w(F=VlZc=(;26%&c74IA4qoJ|7{EyE+$0OJyn*we^{^ccVSji2 zbI!xriP89j3@0$G_y!tQYAJP#|DTkKsD2BA^(VPQue4(Bu?p+Kca9>J&^Px=7uq>gxBMh3AHEa9+R)#Od zQM27QNAhJ-fFaCv!G^T<)~vU&`cN=fQBYcq4%r5bf8e*mIADLLEV<)hH9*;nMd`SS zP&M<#>U_3DW*i|{^Tt+=ee-Eu)p*nDlaZf(`^rNQJFkE`xG%Kz%-5GzU&jYhKMG$! z)+a}HZt2mrQ}S>zyf5eodf5y!#}8I`=_Z_@nx$zDib;?O@zMTg;la)J--;;zeFOJT z5hX+C8n^F%YOc6nogX>BO^F9IS23gs6#Zoksp-E(lvVxgfQa%R&@2O&j>Nj_GgDhg z0dS(MenRB>aPoldDR{B^wYB>*Ujm@;pf8Dv&+GuAZ)s9A$Q#*f7Y zjfKo@YlRU89uWOh;%yIi?o*!W8VGBpWKU>9n<;7oHTokMHbG!$%4+10Yja4+r{O1H zIGs)+< z=U4O!|Hw%sxW>=m;XW_nE=||H*aa=&-eRd;Ytgg>fdm;V3fkU3hCzairMzYI&*g_k zF4G7V=Kwd0(X|{1Xa0qoCHC*!tTYNxICJg~ZdOvey)5j$dR`W-Tm;s2euCf{Iyb{$ zB{Kjc^0gh_tgZ5W}3ep?LDpbI%(N;RegHRm_-yKTi4xjNdJoB zrwu$9j?8MD996{>=7VHjUg!Ar8@NwL{57B5ZTfre3kV`@GqHq>6WqS@qVdc1+<#wI zX%Kz1Gb3zfr}6Z^BBj-pB!qYA+kjsivS$d|yFGxJMb!l`v+{vu9ifI1Btv8j{&Ok4AEcg*AIm%~ zJlCBgs0&(JnI9iHhI4aCv3k@IIrGRgl=PQ)0!0o3wxe7KKG`7nV$b3 zWER4u4Rt@R(?=iwLC9nSIViIrPd|hRnd==vy>}gJ(Sw~YiFr_ZsT#xpzBBdoS-KRY ztVTEk6qFS|Axpypi1J1yW3o4iocz`4&d^_8`F8|1ei=5=f-Mb2gY4G5h7;XkrLt2K zW5c;DX!#cTF?5e9eXGg;6byo6 z!GB>NH72S^(Q*rEC!DMGJb{sw;KfXfjs5;0q(Es~!{ziR;ArN#xb^u2U1@)RL8v;i z120iJQW^bT?VWU>5V{V)zgpNt_O8&nkgx6w!2hwekP)p3ApS$;(AxOVg7MiEB&S66hR$p^i+l#*5SAdWS@AX0Fc#i@u7%l$w2 zSG$>&Ta1q$sf1urKD{_q!2Se}h>6@+g#dh_5h3FKPyx-F=OANm^p!QUoRBwT2`jjL z2`I>T83YP40tr)p?D#v_=M!50QRLY}8TbszAU+lOH&yfjw9HNawNKpIQw|)iH}5>Z z>o|IPmv=1NeO`qk-wuPTxOr<};YQY%sBHKs@DFl*;X%&9wz{GSpP+l>Hhjn1?m(*O zj5~!^Z+EXsie}S379-5(1Nvd=mo3}VD+#ArXMSS8h+ux2dD2hK_kdx>!&TpsQ=_)quAMP5+^)SS5TJUzfatD>#T zwp0O-b_~KrAwSg+&qHqW$_$&ng zV9|X!dLY2p3u)Q$EDkZ!V5hlq(#(H4w<&OFZYsnNs&l?NkPrJbGgjw+YmNLI9aO+Zm3|7#fJKq&#u*!e| z8LYlKu$X+{`lrDPbZdhQR(Dwt^Fe^%OdVvfx|;k$1@`Ct@v!-9u)6!bI{`992NJqb zRvtvR0;XtScjCCI2V+os1=yXy%PlgY31kiXI9e2vIHflGhbg-Ew<((QPg8VO5b7vc zxEAYMf)c(!#`^H%GDz;k& zvw_+gWnlcE@At}BAgROF2$|5GkAO^K{3Gm~b^t?qDAWOvOO$g85t|Q-Yo({u4)(#9 zt8dyiU_-L4p-M*@2^syk^t{b(JIbNQQHsk zsM~b%!fO`ElXyinu;m2&P=#%}<>l8Q6@)4-T^0aerAyb2D&WXa7SiFC z@ta=d(wNydc)DJ*(Fv#}$4F}<|MOtxVf(L|_N-k08W_+@lC~yjz!JZ@#cD|>fz|Yg z^C8WCi;cld#g4H6R~4UMMNVP`XX(1;owa@wFG&H$Ws}-$y(~SGc3IZOzao^eeDCI3 z@7X4lA-Ixt#B^5|e3Z2CaBli!=iSP7>EP^rcP?}9eRr{avL}0Yvwc#|t#buLS03*d zdQrTeHiRzEtXHf@o|>O-9xqRilO7)BiG>g`HFpVmwm!@b2mZR4Yh~cl z5tUUYnIx?fnGyCvbB#e0i@~6b0pv?b*mWU|ePKawvHchbjB+RdAfp%bO$xlQpajMv z{=$zvW&elD?m;;)J}x8qPT0w{^ZEqaJ{^mJ3%8Nz&Vo|mt=zIrC;>=dpzu_oKL zhK4N1ahfBgz!~!Q5kAUF?VnFrBQ(6N33;!GkweLefJ5&M+N?&fLVRC|^kCsLY; zNH)zq#{C;Zd8`gLS7e@n0#;0_p5($?x$01!kifhhiJobZ@p~GIVgp5-1Z2yF&zwUn z9aZR4sa!=l-%@v_Sy)42X~K(PM~k(x4c@#D$eNavPE0h(mTEL78WV5a*T@zYHqS7G zcM8p=$*nOPjHb<1d2`?xmo8f7`W0(NqZ_AgRa)oGfMe3EoVK$(l_n`hO9+=DrBfS+ zB1X*8a$f+qIHs6O3!}l9If=!4JGh2nNn`PynM$04YU4!5+BYGc;f*FUqc8V}&>gv{ z$dmZ&#BXFaC+9@U&eXEQMqC%OsrD2^%Ud`p$=%(j+QI6i?3XQ4bdQ&kd#=nt_ zClysO`xKq$#fj6WU!JHk^+sz->yy`z4-Ps`0KI>jN2jb5D~9TU0KI>iM<##1jT~@6OtFM{Tix)w9FLPsBQu_Q$b5av* zol(&^{nH~P5R|mpLL+b_f z)nf3`_Iq=DlGRyRz76%oE>K96=_`~;bZcu?aR01)`OAg1T}R%aX~^^Cqc&aA(d-ia}=*WY0|(Cl~D=xdrzmreav zt3G3)_f_occwucYuA*H+h+Bp|*G+e*Ur5G>EMq39Oed#2^LN?i8JQZiv6OWNn|e{G z&KhBhrib-C*{n4@@5Wx4LCF!4^(8@n_@7J3}^ac$M)mF1EXv%f9ax#aJIc&=a z)*WW&*2tQdYzA%Oc@dR+zO6**ZY^WKY(~^8Z`P=qPcI6Yn=jIFni?gR<)poH-EP^6 zh-SBjJnBdT(!8nHExtCh0OAFSe&-Dh|7+*SnFZwUxF&>oy&x z-XvO`A&;|>(aF2B$2*COjn0ku^%d_Idc!uFe|HZ3cj%>mU3B{nhVNg4G9h5dYmz_zR~|#?Z>x!Gx8Bm6wZ^hlBb5PRgq((SZ!ML6FGl(thP(wm#rJ_abP)v-A9S1C*XWRtxtJPLO0VN5!s2W7 zq=oaVr=8{xs~0TA7KV|vM%Ya2ejU83`(@L(n9qoi_HA!msh(d=zjJ^F+Ta8J(n?=8=}2JW3L*8$xqN76%O< zyw|4e%M<#DHDdBnolYu_!qb<;+kWK(LQ-}HyN&UBEkv*r8agQhQ&p!h&dGS6{!ikX z{jsFwTYkUnE4H2ENx0Zw;3EgYU$xgChIqGoyHtqXn8(FDQc18^dOoPO`j`1!Kb>KG zee%fQ!I9b;?m7GrLLG_|!i*M$-bT_2=54%+;@v8J{{s8o6*p24qwE3pktncji#W?A zfd{|LGxHk0dSlJ7H&dq;aG$$eLUg{c zG8wNEd{yiFV<)swk^V#g{8cV==uTf}mjuoIluU-+sejj#qz4SAzf2azAvFIj-|3Lpj|?yTpWAC_O89%}JBTddToq&8U%Zp+SEVHz73%ob8n z&wQ1Q{7OV9SsI3Nro~#;VkstV|Bj=BjYEt~@7G8dlkBmoxnK()>EQmc)B4K;o?46G zZG;N*+3B5YKkQ5@P0s>I<4lj)6r~55-P4p13@(hc*{@hmRFF@-{OBUsgo4=}x75xQ z$Z(J49T)f=j&6?imEc_Kw)G-&{rmio#HJl`-m@_0-}q|?ZQ4{dQtPN|vrM$>5?%5e zpx%Gb9hRs1q^fYrhglZgpE27if*18JbL%Qc&x==2bO5jN>FV=Du(~3T2-GX5l3b9isB^$Lu|6eqAxXndtEmRi!waZdRl>4x^C@9*+hc z$4%%9OoJG4HD{S=)5ozrhF-Hy#Nf&sbl!G5$oB>xchoHD})Eq)_BH@g`5ws#WuSixmO!0_vHHgcEeE-LJ`g2*ddSb97g6InPS9F(k| zaSJHLvn%QKkL@2-EKrq%e5@s+4n1Zq(f3|IaAn(hIdISwZN6}XmD|(}u0VK?zQEO4 zM~oZM(E--k*`lUWXNj%M@tPq6$>7>NAcNY8W2AFIbt(S)UbU8XBYrsdn&85g?{$vL z!#68NxZuDZ|Ftk0qvB?V5IiXP7k6*#W$O{nVte_Ri$XC%Md7rLDaE=iI}hL*7Inq@ z&VovjwQFiVskc*+AqOXMv9LdAZ9ojB>>nZ5FvDeCctCCD~D1s{id(+MNBp#k!HBy$hF1v;>SGPznoc zMwJQGTP|tX7%gZ^lH9e^qgPoAmbMOn(Nv%muaKcNXe~JXOhDr)Xoc^SfWL}$VO|d9 zhHUmda=@^7(|HD?odDYbA2qQSX>(V`K-S?op6?k_PcJ=lWh;I6c1~jUN^(u`9*p*c z@A&2YmE0On;%G3+u5pd1T5l-PD(pQuF=ZLVAw`)xRE$N*N;*&Fu(hN`=iScnW5cZ% z_ED6N(d%>Vx=T^xhKx|}o!P*gWJrcygJcGhF4(RO7Y0EDgfB`1e&umS!$ws&h8awq z4IvKL-64aiK554(yK2q+MAGf^$h2+-#qW>JT=}H%ID1>-3&lLV-_V4!sRx+bR390V z+X&+0lCOeKpL1vl)0r0xLrofdvUL#oMXlb7SPm*wpy@CW2BOHFO^}}(R1oy2tRn1$MB9Q?} z?m$=yn0feq{>=6HBvZ!~QTk%HSoDchNR4mv;m}_j-e3*|T5xQt2yJ5td`7@DLtZRqY;F^nL%;{EugP*hAlO1xn8i! zX-B{oC6}wC@xAuJ{GB24Wo=8Ra%clD2e0>9R>4dmAGfB&NP&7)lX=L2tc(J8#KEg? zPy3?+{Ec_Z89EEzMn|v>kK<1_;aS63Cl1{LGlbaMC5#o5K1 zON2cpMllf=KSk>m*TN(}JHCdNv4;_YhCj3~+XU4+qC|w^nPOCDU{e&FlIGU8oaFn3 z!|*W$mX=bdc|(b063aiC znR$76d74$%MReFDi(S>$MaUN1jntwbpTF^5;y=ql5hAm?`56}_$9)dnB5dV<5K7jV zPZj%pJirADEe>bZX;J>QVZp`{cMiN8ImRB-NlLf(n^ANeVU&V=u#$z{%f>Hi+-6>a z5}2@d5S9KsasqG0AfsKFCKxb=b{0f`^z7_-2g0R6VadoN`NG%6gsNa{8aKX|MLd@; z+uPINoEKuLEZ#rg+jVhw_i(%Tc}^GkffH%;037Ou@+XlPqVRD)(|aE!_|iDx3Ue#A zpo#UV&&k?ZW+HHJ9;@Epa^V_}Xq6Ujp~4?&dZa~)a4k!ILMzEX%$e-MvqIYAW8}!& z?(+W?(+ZO!sCU>wV09Mgdf2Aj?k1y$!sFYwi$pj}n*Gv|MVE8;%f9X?Wc0H5#Q1rN z^{Yo;Yr%R}&)bAvqD$h&+8N&JU#<97JT>+%E<0cFt?I28P;XGmA-9e)1a4k+wVlGR zk7fzj3etG*-%J>nuiPyL;$$+vs&hWFryQEK2Fnow_v2kP*W7#ktLSTl%c^5_NMA4N z&zHfF6r`zQ^gq=7VB+prQw6|tTca~S<@=VOyg|fw#-EPtQAoXyiK2n;zJ&>D%$gkA z7=1Syx#D^-RvhW&mA&B~m3^X+i1$)7@McsOCXJF5?bRz5mVt;|l|nR^`eYx}u(I{{ z0&^Ios;?k}*quL`9f~ySle54H#obMNFuZaFt8aytCAT<9reAF?%S+tE2a}gk!A5l0 zyhT}TcA8%NIw>JkcV=)J=`K{Ea(DklcJfSKllVT?V~g_qr*D+H{K0~Qi(LK3vrck* z3CgQF)w|0xzU$D~j#>L>Icuy`Mr$98P%qDe(t;32?claTRb& zbH03PYu|+;@=$sdr3u6~P7eEPP~;>Ui4RO5NDG+*EQ`K@G^if`4**R-vcGC_`~r6& zwh_{ih6C#!LUsLIJvKdrmSjGTrmu+qazm-}6E{D!`<3k0kN$6G?>~RbZU1@xj*s28 zX8O)g9(wAj1CQOZc4XTf;(dR#_m0)`4?Mc-)E_+{(%K$V-Pp?Z{Q0w*_mH$|-Pb0j zl6y~W-*Iei=!N9olUp|2v~g(r%%j6IYxtRCPl5jS5(GWR{1wDZp4cy~ZMqd3DfvLG zwIw1@Am@IrA3e-}oG1CC3}TvC{vpILWGupxSW$3u(-)?uu-xY7VPifGp9@oy^VnY} za1fnF=~y}*Do_Ia2BPQQ^lS6v3$MKyJVMb7YKnCC^|u5kFuFnVm#Dv6NTK86Bkw=C zs%!oF39jbVW%MM-=(nK5*8r9L>i*NrT5c^G8yQLJ33Mod5{XJXYR3ZWh_=Y>gAWo! z_t--tZ1;m)b3-&h-39C`(jb^L(1eWXj|ulsPt2b3?s?z2$F?_j4t0IK zcZ6Rty8iFu5Xf6_)r(pT&QHwP_qC^#&i z>7KshQ$KvFb7FElmQcqJKYe`rHCZ(4iN&o|#CkHxp$ zwQc+9{o|v19w5)$Q+WO55AGzH2=n>Y*75zPo_tOjnOoPt>3x5E@B7X@zGJ`lufeNp zZhri>U8nb7GkLw1+WyqN+e5h>2K{0|ZY(kW3QJ)B8iVE|Cdx$-$&e3Gb&qplDvSwJ z&_wKP;}AFF-3axO=~^50_1c>Z_myWa{=9+l1eoX* z3FB*QvV$0e|Jb*B4m>UC;yN@e@URP66j+DdW1lb z3~VFNMxcQHvteeEAs>fu&TtILG7Rx&6$BCRG|);+hA|FkIfL!0@kwJntb-E-%Sq}b zObK=Hv!4x4KL7lC+RlV+XA#TL2vNjo_HmX>!6r-o$8Ar)tL>dlxbf&DS*i*6vFOui z8#?6$!zTlkK&T2b!+F*i5P>tBPB4-XNP<##0Gb4Q=s=MuqCm4_ut`V8C<$O7(zAg| z3Mo0GrT|=)1u0{hZoxoFGpH;Q60bM~KN(aj3aJ{Zg?MDSjv+c3Hz*bKjFW-W0O2A6 z@_jC!U#KdIZL3P?$L?R;%RT}2eH)<@r=>ZyR~sAdMURi6-mzV~#(Js!>jmK0z0$pC zle8c0U)y?nN2KHU%Jz=oj@LWD_*bGx$I6bC(#*}2v~v$JnLa;vz5|ELBlAb*x$}Sp z&WGXUJovmb=VQHa1T*VAcRq}#bm+Dru;Ab6hN1LQZD=Lxz6w&&^~?nCnC-^!Yh*Qs zUo#`=DY~Zv;mq_pat?)#lw_ai9NoC@*tP5SY>2aT$IR|S(>FYP)A**-U%YeO;hT2$ z_9E21YP@%1*Cc^ zq5H%wv-_v|>9&|;`UmDUu#hg|qtXb=>>|;wE<|=wd!lF$Krcw%+9-%K5oAT2 zNFhRnsGnz>