当前位置:天才代写 > tutorial > JAVA 教程 > thinking in java

thinking in java

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:473

副标题#e#

写在前面的话

引言:

第1章 工具入门

1.1 抽象的进步

1.2 工具的接口

1.3 实现方案的埋没

1.4 方案的反复利用

1.5 担任:从头利用接口

1.5.1 改进基本类:

尽量extends要害字体现着我们要为接口“扩展”新成果,但实情并非必定如此。为区分我们的新类,第二个步伐是改变基本类一个现有函数的行为。我们将其称作“改进”谁人函数。

为改进一个函数,只需为衍生类的函数成立一个新界说即可。我们的方针是:“尽量利用的函数接口未变,但它的新版本具有差异的表示”。

1.5.2 等价和雷同干系

1.6 多形工具的交流利用

1.6.1 动态绑定

1.6.2 抽象的基本类和接口

1.7 工具的建设和存在时间

1.7.1 荟萃与担任器

1.7.2 单根布局

1.7.3 荟萃库与利便利用荟萃

1.7.4 排除时的逆境:由谁认真排除?

1.8 违例节制:办理错误

1.9 多线程

1.10 永久性

1.11 Java和因特网:

既然Java不外另一种范例的措施设计语言,各人大概会奇怪它为什么值得如此重视,为什么尚有这么多的人认为它是计较机措施设计的一个里程碑呢?假如您来自一个传统的措施设计配景,那么谜底在刚开始的时候并不是很明明。Java除了可办理传统的措施设计问题以外,还能办理World Wide Web(万维网)上的编程问题。

1.11.1 什么是Web?

1.11.2 客户端编程

1.11.3 处事器端编程

1.11.4 一个独立的规模:应用措施

1.12 阐明和设计

1.12.1 不要迷失:

在整个开拓进程中,最重要的工作就是:不要将本身迷失!但事实上这种工作很容易产生。大大都要领都设计用来办理最大范畴内的问题。虽然,也存在一些出格坚苦的项目,需要作者支付更为艰苦的尽力,可能支付更大的价钱。可是,大大都项目都是较量“通例”的,所以一般都能作出乐成的阐明与设计,并且只需用到推荐的一小部门要领。但无论何等有限,某些形式的处理惩罚老是有益的,这可使整个项目标开拓越发容易,总比直接了当开始编码好!

也就是说,如果你正在考查一种非凡的要领,个中包括了大量细节,并推荐了很多步和谐文档,那么仍然很难正确判定本身该在何时遏制。时刻提醒本身留意以下几个问题:

(1) 工具是什么?(奈何将本身的项目支解成一系列单独的组件?)

(2) 它们的接口是什么?(需要将什么动静发给每一个工具?)

在确定了工具和它们的接口后,便可着手编写一个措施。出于对多方面原因的思量,大概还需要比这更多的说明及文档,但要求把握的资料绝对不能比这还少。

整个进程可分别为四个阶段,阶段0方才开始回收某些形式的布局。

1.12.2 阶段0:拟出一个打算:

1.12.3 阶段1:要建造什么?:

1.12.4 阶段2:如何构建?

1.12.5 阶段3:正式建设

1.12.6 阶段4:校订

1.12.7 打算的回报

1.13 Java照旧C++?


#p#副标题#e#

第2章 一切都是工具

“尽量以C++为基本,但Java是一种更纯粹的面向工具措施设计语言”。

无论C++照旧Java都属于杂合语言。但在Java中,设计者以为这种杂归并不象在C++里那么重要。杂合语言答允回收多种编程气势气魄;之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容本领。由于C++是C的一个超集,所以包括的很多特性都是后者不具备的,这些特性使C++在某些处所显得过于巨大。

Java语言首先便假定了我们只但愿举办面向工具的措施设计。也就是说,正式用它设计之前,必需先将本身的思想转入一个面向工具的世界(除非早已习惯了这个世界的思维方法)。只有做好这个筹备事情,与其他OOP语言对比,才气体会到Java的易学易用。在本章,我们将探讨Java措施的根基组件,并体会为什么说Java以致Java措施内的一切都是工具。

2.1 用句柄哄骗工具

2.2 必需建设所有工具:

建设句柄时,我们但愿它同一个新工具毗连。凡是用new要害字到达这一目标。new的意思是:“把我酿成这些工具的一种新范例”。所以在上面的例子中,可以说:

String s = new String("asdf");

它不只指出“将我酿成一个新字串”,也通过提供一个初始字串,指出了“如何生成这个新字串”。

虽然,字串(String)并非独一的范例。Java配套提供了数量浩瀚的现成范例。对我们来讲,最重要的就是记着能自行建设范例。事实上,这应是Java措施设计的一项根基操纵,是继承本书后余部门进修的基本。

2.2.1 生存在什么处所

2.2.2 非凡环境:主范例

2.2.3 Java中的数组

#p#分页标题#e#

2.3 绝对不要排除工具:在大大都措施设计语言中,变量的“存在时间”(Lifetime)一直是措施员需要着重思量的问题。变量应一连多长的时间?假如想排除它,那么何时举办?在变量存在时间上胶葛不清会造成大量的措施错误。在下面的小节里,将阐示Java如何辅佐我们完成所有排除事情,从而极大了简化了这个问题。

2.3.1 浸染域

2.3.2 工具的浸染域

2.4 新建数据范例:类

2.4.1 字段和要领

2.5 要领、自变量和返回值

2.5.1 自变量列表

2.6 构建Java措施:正式构建本身的第一个Java措施前,尚有几个问题需要留意。

2.6.1 名字的可见性

2.6.2 利用其他组件

2.6.3 static要害字

2.7 我们的第一个Java措施

2.8 注释和嵌入文档

2.8.1 注释文档

2.8.2 详细语法

2.8.3 嵌入HTML

2.8.4 @see:引用其他类

2.8.5 类文档标志

2.8.6 变量文档标志:变量文档只能包罗嵌入的HTML以及@see引用。

2.8.7 要领文档标志

2.8.8 文档示例:

下面照旧我们的第一个Java措施,只不外已插手了完整的文档注释:

92页措施

第一行:

//: Property.java

回收了我本身的要领:将一个“:”作为非凡的暗号,指出这是包括了源文件名字的一个注释行。最后一行也用这样的一条注释末了,它符号着源代码清单的竣事。这样一来,可将代码从本书的正文中利便地提取出来,并用一个编译器查抄。这方面的细节在第17章报告。

2.9 编码样式

2.10 总结:

通过本章的进修,各人已打仗了足够多的Java编程常识,已知道如何自行编写一个简朴的措施。另外,对语言的总体环境以及一些根基思想也有了必然水平的认识。然而,本章所有例子的模式都是单线形式的“这样做,再那样做,然后再做另一些工作”。假如想让措施作出一项选择,又该如何设计呢?譬喻,“如果这样做的功效是赤色,就那样做;假如不是,就做另一些工作”。对付这种根基的编程要领,下一章会具体说明在Java里是如何实现的。

2.11 操练:

(1) 参照本章的第一个例子,建设一个“Hello,World”措施,在屏幕上简朴地显示这句话。留意在本身的类里只需一个要领(“main”要了解在措施启动时执行)。记着要把它设为static形式,并置入自变量列表——纵然基础不会用到这个列表。用javac编译这个措施,再用java运行它。

(2) 写一个措施,打印出从呼吁行获取的三个自变量。

(3) 找出Property.java第二个版本的代码,这是一个简朴的注释文档示例。请对文件执行javadoc,并在本身的Web欣赏器里观当作果。

(4) 以操练(1)的措施为基本,向个中插手注释文档。操作javadoc,将这个注释文档提取为一个HTML文件,并用Web欣赏器寓目。

#p#副标题#e#

第3章 节制措施流程:

“就象任何有感知的生物一样,措施必需能哄骗本身的世界,在执行进程中作出判定与选择。”

在Java里,我们操作运算符哄骗工具和数据,并用执行节制语句作出选择。Java是成立在C++基本上的,所以对C和C++措施员来说,对Java这方面的大大都语句和运算符都应长短常熟悉的。虽然,Java也举办了本身的一些改造与简化事情。

3.1 利用Java运算符

3.1.1 优先级

3.1.2 赋值

3.1.3 算术运算符

3.1.4 自动递增和递减

3.1.5 干系运算符

3.1.6 逻辑运算符

3.1.7 按位运算符

3.1.8 移位运算符

3.1.9 三元if-else运算符

3.1.10 逗号运算符:

在C和C++里,逗号不只作为函数自变量列表的脱离符利用,也作为举办后续计较的一个运算符利用。在Java里需要用到逗号的独一场合就是for轮回,本章稍后会对此详加表明。

3.1.11 字串运算符+

3.1.12 运算符通例操纵法则

3.1.13 造型运算符

3.1.14 Java没有“sizeof”

3.1.15 温习计较顺序

3.1.16 运算符总结

3.2 执行节制:

Java利用了C的全部节制语句,所以假期您以前用C或C++编程,个中大大都都应长短常熟悉的。大大都措施化的编程语言都提供了某种形式的节制语句,这在语言间凡是是共通的。在Java里,涉及的要害字包罗if-else、while、do-while、for以及一个名为switch的选择语句。然而,Java并不支持很是有害的goto(它仍是办理某些非凡问题的权宜之计)。仍然可以举办象goto那样的跳转,但比典范的goto要范围多了。

3.2.1 真和假:

#p#分页标题#e#

所有条件语句都操作条件表达式的真或假来抉择执行流程。条件表达式的一个例子是A==B。它用条件运算符“==”来判定A值是否便是B值。该表达式返回true或false。本章早些时候打仗到的所有干系运算符都可拿来结构一个条件语句。留意Java不答允我们将一个数字作为布尔值利用,纵然它在C和C++里是答允的(真长短零,而假是零)。若想在一次布尔测试中利用一个非布尔值——好比在if(a)里,那么首先必需用一个条件表达式将其转换成一个布尔值,譬喻if(a!=0)。

3.2.2 if-else

3.2.3 重复

3.2.4 do-while

3.2.5 for

3.2.6 间断和继承

3.2.7 切换

3.3 总结:

本章总结了大大都措施设计语言都具有的根基特性:计较、运算符优先顺序、范例转换以及选择和轮回等等。此刻,我们作好了相应的筹备,可继承向面向工具的措施设计规模迈进。在下一章里,我们将接头工具的初始化与排除问题,再后头则报告埋没的根基实现要领。

3.4 操练:

(1) 写一个措施,打印出1到100间的整数。

(2) 修改操练(1),在值为47时用一个break退出措施。亦可换成return试试。

(3) 建设一个switch语句,为每一种case都显示一条动静。并将switch置入一个for轮回里,令其实验每一种case。在每个case后头都安排一个break,并对其举办测试。然后,删除break,看看会有什么环境呈现。

#p#副标题#e#

第4章 初始化和排除:

“跟着计较机的进步,‘不安详’的措施设计已成为造成编程价钱奋发的祸首罪魁之一。”

“初始化”和“排除”是这些安详问题的个中两个。很多C措施的错误都是由于措施员健忘初始化一个变量造成的。对付现成的库,若用户不知道如何初始化库的一个组件,就往往会呈现这一类的错误。排除是另一个非凡的问题,因为用完一个元素后,由于不再体贴,所以很容易把它健忘。这样一来,谁人元素占用的资源会一直保存下去,极易发生资源(主要是内存)用尽的效果。

C++为我们引入了“构建器”的观念。这是一种非凡的要领,在一个工具建设之后自动挪用。Java也沿用了这个观念,但新增了本身的“垃圾收集器”,能在资源不再需要的时候自动释放它们。本章将接头初始化和排除的问题,以及Java如何提供它们的支持。

4.1 由构建器担保初始化

4.2 要领过载

4.2.1 区分过载要领

4.2.2 主范例的过载

4.2.3 返回值过载

4.2.4 默认构建器

4.2.5 this要害字

4.3 排除:收尾和垃圾收集

4.3.1 finalize()用途安在

4.3.2 必需执行排除

4.4 成员初始化

4.4.1 划定初始化

4.4.2 构建器初始化

4.5 数组初始化

4.5.1 多维数组

4.6 总结

4.7 操练:

(1) 用默认构建器建设一个类(没有自变量),用它打印一条动静。建设属于这个类的一个工具。

(2) 在操练1的基本上增加一个过载的构建器,令其回收一个String自变量,并伴同本身的动静打印出来。

(3) 以操练2建设的类为基本上,建设属于它的工具句柄的一个数组,但不要实际建设工具并分派到数组里。运行措施时,留意是否打印出来自构建器挪用的初始化动静。

(4) 建设同句柄数组接洽起来的工具,最终完成操练3。

(5) 用自变量“before”,“after”和“none”运行措施,试验Garbage.java。反复这个操纵,调查是否从输出中看出了一些牢靠的模式。改变代码,使System.runFinalization()在System.gc()之前挪用,再调查功效。

#p#副标题#e#

第5章 埋没实施进程

5.1 包:库单位

5.1.1 建设唯一无二的包名

5.1.2 自界说东西库

5.1.3 操作导入改变行为

5.1.4 包的停用:

各人应留意这样一个问题:每次建设一个包后,都在为包取名时间接地指定了一个目次布局。这个包必需存在(驻留)于由它的名字划定的目次内。并且这个目次必需能从CLASSPATH开始搜索并发明。最开始的时候,package要害字的运用大概会令人疑惑,因为除非僵持遵守按照目次路径指定包名的法则,不然就会在运行期得到大量莫名其妙的动静,指出找不到一个特定的类——纵然谁人类显着就在沟通的目次中。若获得象这样的一条动静,请试着将package语句作为注释标志出去。假如这样做行得通,就可知道问题到底出在哪儿。

5.2 Java会见指示符:

5.2.1 “友好的”

5.2.2 public:接口会见

5.2.3 private:不能打仗

5.2.4 protected:“友好的一种”

5.3 接口与实现

5.4 类会见

5.5 总结

5.6 操练

第6章 类再生

6.1 合成的语法

6.2 担任的语法

6.2.1 初始化基本类

6.3 合成与担任的团结

6.3.1 确保正确的排除

6.3.2 名字的埋没

6.4 到底选择合成照旧担任

6.5 protected

6.6 递增开拓

6.7 上溯造型

6.7.1 何谓“上溯造型”?

6.8 final要害字:

#p#分页标题#e#

由于语境(应用情况)差异,final要害字的寄义大概会稍微发生一些差别。但它最一般的意思就是声明“这个对象不能改变”。之所以要克制改变,大概是思量到两方面的因素:设计或效率。由于这两个原因颇有些区别,所以也许会造成final要害字的误用。

在接下去的小节里,我们将接头final要害字的三种应用场所:数据、要领以及类。

6.8.1 final数据

6.8.2 final要领

6.8.3 final类

6.8.4 final的留意事项

6.9 初始化和类装载

6.9.1 担任初始化

6.10 总结

6.11 操练:

(1) 用默认构建器(空自变量列表)建设两个类:A和B,令它们本身声明本身。从A担任一个名为C的新类,并在C内建设一个成员B。不要为C建设一个构建器。建设类C的一个工具,并调查功效。

(2) 修改操练1,使A和B都有含有自变量的构建器,则不是回收默认构建器。为C写一个构建器,并在C的构建器中执行所有初始化事情。

(3) 利用文件Cartoon.java,将Cartoon类的构建器代码酿成注释内容标注出去。表明会产生什么工作。

(4) 利用文件Chess.java,将Chess类的构建器代码作为注释标注出去。同样表明会产生什么。

#p#副标题#e#

第7章 多形性

7.1 上溯造型

7.1.1 为什么要上溯造型

7.2 深入领略:

对付Music.java的坚苦性,可通过运行措施加以体会。输出是Wind.play()。这虽然是我们但愿的输出,但它看起来好像并不肯按我们的但愿行事。请调查一下tune()要领:

public static void tune(Instrument i) {

// …

i.play(Note.middleC);

}

它吸收Instrument句柄。所以在这种环境下,编译器奈何才气知道Instrument句柄指向的是一个Wind,而不是一个Brass或Stringed呢?编译器无从得知。为了深入了领略这个问题,我们有须要探讨一下“绑定”这个主题。

7.2.1 要领挪用的绑定

7.2.2 发生正确的行为

7.2.3 扩展性

7.3 包围与过载

7.4 抽象类和要领

7.5 接口

7.5.1 Java的“多重担任”

7.5.2 通过担任扩展接口

7.5.3 常数分组

7.5.4 初始化接口中的字段

7.6 内部类

7.6.1 内部类和上溯造型

7.6.2 要领和浸染域中的内部类

7.6.3 链接到外部类

7.6.4 static内部类

7.6.5 引用外部类工具

7.6.6 从内部类担任

7.6.7 内部类可以包围吗?

7.6.8 内部类标识符

7.6.9 为什么要用内部类:节制框架

7.7 构建器和多形性:

同往常一样,构建器与其他种类的要领是有区此外。在涉及到多形性的问题后,这种要领依然创立。尽量构建器并不具有多形性(即便可以利用一种“虚拟构建器”——将在第11章先容),但仍然很是有须要领略构建器如安在巨大的分级布局中以及伴同多形性利用。这一领略将有助于各人制止陷入一些令人不快的纠纷。

7.7.1 构建器的挪用顺序

7.7.2 担任和finalize()

7.7.3 构建器内部的多形性要领的行为

7.8 通过担任举办设计

7.8.1 纯担任与扩展

7.8.2 下溯造型与运行期范例标识

7.9 总结

7.10 操练:

(1) 建设Rodent(啮齿动物):Mouse(老鼠),Gerbil(鼹鼠),Hamster(大颊鼠)等的一个担任分级布局。在基本类中,提供合用于所有Rodent的要领,并在衍生类中包围它们,从而按照差异范例的Rodent采纳差异的动作。建设一个Rodent数组,在个中填充差异范例的Rodent,然后挪用本身的基本类要领,看看会有什么环境产生。

(2) 修改操练1,使Rodent成为一个接口。

(3) 纠正WindError.java中的问题。

(4) 在GreenhouseControls.java中,添加Event内部类,使其能打开和封锁电扇。

#p#副标题#e#

第8章 工具的容纳

8.1 数组

8.1.1 数组和第一类工具

8.1.2 数组的返回

8.2 荟萃

8.2.1 缺点:范例未知

8.3 列举器(重复器)

8.4 荟萃的范例:

尺度Java 1.0和1.1库配套提供了很是少的一系列荟萃类。但对付本身的大大都编程要求,它们根基上都能胜任。正如各人到本章末端会看到的,Java 1.2提供的是一套从头设计过的大型荟萃库。

8.4.1 Vector

8.4.2 BitSet

8.4.3 Stack

8.4.4 Hashtable

8.4.5 再论列举器

8.5 排序

8.6 通用荟萃库

8.7 新荟萃

8.7.1 利用Collections

8.7.2 利用Lists

8.7.3 利用Sets

8.7.4 利用Maps

8.7.5 抉择实施方案

8.7.6 未支持的操纵

8.7.7 排序和搜索

8.7.8 实用东西

8.8 总结

8.9 操练

#p#副标题#e#

第9章 违例过错节制

9.1 根基违例

9.1.1 违例自变量

9.2 违例的捕捉:

#p#分页标题#e#

若某个要领发生一个违例,必需担保该违例能被捕捉,并得到正确看待。对付Java的违例节制机制,它的一个长处就是答允我们在一个处所将精神会合在要办理的问题上,然后在另一个处所看待来自谁人代码内部的错误。

为领略违例是如何捕捉的,首先必需把握“警戒区”的观念。它代表一个非凡的代码区域,有大概发生违例,并在后头跟从用于节制那些违例的代码。

9.2.1 try块

9.2.2 违例节制器

9.2.3 违例类型

9.2.4 捕捉所有违例

9.2.5 从头“掷”出违例

9.3 尺度Java违例

9.3.1 RuntimeException的非凡环境

9.4 建设本身的违例

9.5 违例的限制

9.6 用finally排除

9.6.1 用finally做什么

9.6.2 缺点:丢失的违例

9.7 构建器

9.8 违例匹配

9.8.1 违例准则

9.9 总结:

通过先进的错误更正与规复机制,我们可以有效地加强代码的结实水平。对我们编写的每个措施来说,错误规复都属于一个根基的思量方针。它在Java中显得尤为重要,因为该语言的一个方针就是建设差异的措施组件,以便其他用户(客户措施员)利用。为构建一套结实的系统,每个组件都必需很是结实。

在Java里,违例节制的目标是利用尽大概精简的代码建设大型、靠得住的应用措施,同时解除措施里那些不能节制的错误。

违例的观念很难把握。但只有很好地运用它,才可使本身的项目当即得到显著的收益。Java强迫遵守违例所有方面的问题,所以无论库设计者照旧客户措施员,都可以或许持续一致地利用它。

9.10 操练:

(1) 用main()建设一个类,令其掷出try块内的Exception类的一个工具。为Exception的构建器赋予一个字串参数。在catch从句内捕捉违例,并打印出字串参数。添加一个finally从句,并打印一条动静,证明本身真正达到哪里。

(2) 用extends要害字建设本身的违例类。为这个类写一个构建器,令其回收String参数,并伴同String句柄把它生存到工具内。写一个要领,令其打印出生存下来的String。建设一个try-catch从句,操练实际操纵新违例。

(3) 写一个类,并令一个要领掷出在操练2中建设的范例的一个违例。试着在没有违例类型的前提下编译它,调查编译器会陈诉什么。接着添加适当的违例类型。在一个try-catch从句中实验本身的类以及它的违例。

(4) 在第5章,找到挪用了Assert.java的两个措施,并修改它们,令其掷出本身的违例范例,而不是打印到System.err。该违例应是扩展了RuntimeException的一个内部类。

#p#副标题#e#

第10章 Java IO系统

10.1 输入和输出

10.1.1 InputStream的范例

10.1.2 OutputStream的范例

10.2 增添属性和有用的接口

10.2.1 通过FilterInputStream从InputStream里读入数据

10.2.2 通过FilterOutputStream向OutputStream里写入数据

10.3 自己的缺陷:RandomAccessFile

10.4 File类:

File类有一个欺骗性的名字——凡是会认为它搪塞的是一个文件,但实情并非如此。它既代表一个特定文件的名字,也代表目次内一系列文件的名字。若代表一个文件集,便可用list()要领查询这个集,返回的是一个字串数组。之所以要返回一个数组,而非某个机动的荟萃类,是因为元素的数量是牢靠的。并且若想获得一个差异的目次列表,只需建设一个差异的File工具即可。事实上,“FilePath”(文件路径)好像是一个更好的名字。本节将向各人完整地例示如何利用这个类,个中包罗相关的FilenameFilter(文件名过滤器)接口。

10.4.1 目次列表器

10.4.2 查抄与建设目次

10.5 IO流的典范应用

10.5.1 输入流

10.5.2 输出流

10.5.3 快捷文件处理惩罚

10.5.4 从尺度输入中读取数据

10.5.5 管道数据流:

本章已扼要先容了PipedInputStream(管道输入流)和PipedOutputStream(管道输出流)。尽量描写不十分具体,但并不是说它们浸染不大。然而,只有在把握了多线程处理惩罚的观念后,才可真正体会它们的代价地址。原因很简朴,因为管道化的数据流就是用于线程之间的通信。这方面的问题将在第14章用一个示例说明。

10.6 StreamTokenizer

10.6.1 StringTokenizer

10.7 Java 1.1的IO流

10.7.1 数据的提倡与吸收

10.7.2 修改数据流的行为

10.7.3 未改变的类:

显然,Java库的设计人员以为以前的一些类毫无问题,所以没有对它们作任何修改,可象以前那样继承利用它们:

没有对应Java 1.1类的Java 1.0类

DataOutputStream

File

RandomAccessFile

SequenceInputStream

出格未加窜改的是DataOutputStream,所觉得了用一种可转移的名目生存和获取数据,必需沿用InputStream和OutputStream条理布局。

10.7.4 一个例子

10.7.5 重定向尺度IO

10.8 压缩

10.8.1 用GZIP举办简朴压缩

10.8.2 用Zip举办多文件生存

10.8.3 Java归档(jar)实用措施

10.9 工具串联

10.9.1 寻找类

10.9.2 序列化的节制

10.9.3 操作“耐久性”

10.10 总结

10.11 操练

#p#副标题#e#

第11章 运行期范例判断:

运行期范例判断(RTTI)的观念初看很是简朴——手上只有基本范例的一个句柄时,操作它判定一个工具的正确范例。

然而,对RTTI的需要袒暴露了面向工具设计很多有趣(并且常常是令人狐疑的)的问题,并把措施的结构问题正式摆上了桌面。

#p#分页标题#e#

本章将接头如何操作Java在运行期间查找工具和类信息。这主要采纳两种形式:一种是“传统”RTTI,它假定我们已在编译和运行期拥有所有范例;另一种是Java1.1特有的“反射”机制,操作它可在运行期独立查找类信息。首先接头“传统”的RTTI,再接头反射问题。

11.1 对RTTI的需要

11.1.1 Class工具

11.1.2 造型前的查抄

11.2 RTTI语法

11.3 反射:运行期类信息

11.3.1 一个类要领提取器

11.4 总结

11.5 操练:

(1) 写一个要领,向它通报一个工具,轮回打印出工具条理布局中的所有类。

(2) 在ToyTest.java中,将Toy的默认构建器标志成注释信息,表明随之产生的工作。

(3) 新建一种范例的荟萃,令其利用一个Vector。捕捉置入个中的第一个工具的范例,然后从当时起只答允用户插入那种范例的工具。

(4) 写一个措施,判定一个Char数组属于根基数据范例,照旧一个真正的工具。

(5) 按照本章的说明,实现clearSpitValve()。

(6) 实现本章先容的rotate(Shape)要领,令其查抄是否已经旋转了一个圆(若已旋转,就不再执行旋转操纵)。

第12章 通报和返回工具

12.1 通报句柄

12.1.1 别名问题

12.2 建造当地副本

12.2.1 按值通报

12.2.2 克隆工具

12.2.3 使类具有克隆本领

12.2.4 乐成的克隆

12.2.5 Object.clone()的结果

12.2.6 克隆合成工具

12.2.7 用Vector举办深层复制

12.2.8 通过序列化举办深层复制

12.2.9 使克隆具有更大的深度

12.2.10 为什么有这个奇怪的设计

12.3 克隆的节制

12.3.1 副本构建器

12.4 只读类

12.4.1 建设只读类

12.4.2 “一成稳定”的漏洞

12.4.3 稳定字串

12.4.4 String和StringBuffer类

12.4.5 字串的非凡性:

此刻,各人已知道String类并非仅仅是Java提供的另一个类。String里含有大量非凡的类。通过编译器和非凡的包围或过载运算符+和+=,可将引号字符串转换成一个String。在本章中,各人已见地了剩下的一种非凡环境:用同志StringBuffer经心结构的“不行变”本领,以及编译器中呈现的一些有趣现象。

12.5 总结

12.6 操练

#p#副标题#e#

第13章 建设窗口和措施片

13.1 为何要用AWT?

13.2 根基措施片

13.2.1 措施片的测试

13.2.2 一个更图形化的例子

13.2.3 框架要领的演示

13.3 建造按钮

13.4 捕捉事件

13.5 文本字段

13.6 文本区域

13.7 标签

13.8 复选框

13.9 单选钮

13.10 下拉列表

13.11 列表框

13.11.1 handleEvent()

13.12 机关的节制

13.12.1 FlowLayout

13.12.2 BorderLayout

13.12.3 GridLayout

13.12.4 CardLayout

13.12.5 GridBagLayout

13.13 action的替用品

13.14 措施片的范围

13.14.1 措施片的利益

13.15 视窗化应用

13.15.1 菜单

13.15.2 对话框

13.16 新型AWT

13.16.1 新的事件模子

13.16.2 事件和吸收者范例

13.16.3 用Java 1.1 AWT建造窗口和措施片

13.16.4 再探早期示例

13.16.5 动态绑定事件

13.16.6 将贸易逻辑与UI逻辑区分隔

13.16.7 推荐编码要领

13.17 Java 1.1 UI API:

Java 1.1版同样增加了一些重要的新成果,包罗核心遍历,桌面色彩会见,打印“沙箱内”赶早期的剪贴板支持。

核心遍历十分的简朴,因为它显然存在于AWT库里的组件而且我们不必为使它事情而去做任何事。假如我们制造我们本身组件而且想使它们去处理惩罚核心遍历,我们过载isFocusTraversable()以使它返回真值。假如我们想在一个鼠标单击上捕获键盘核心,我们可以捕获鼠标按下事件而且挪用requestFocus()需求核心要领。

13.17.1 桌面颜色

13.17.2 打印

13.17.3 剪贴板

13.18 可视编程和Beans

13.18.1 什么是Bean

13.18.2 用Introspector提取BeanInfo

13.18.3 一个更巨大的Bean

13.18.4 Bean的封装

13.18.5 更巨大的Bean支持

13.18.6 Bean更多的常识:

#p#分页标题#e#

别的有关的争议是Bean不能被编址。无论何时我们建设一个Bean,都但愿它会在一个多线程的情况中运行。这意味着我们必需领略线程的出口,我们将在下一章中先容。我们会发明有一段称为“Java Beans的回首”的节会留意到这个问题和它的办理方案。

13.19 Swing入门

13.19.1 Swing有哪些利益

13.19.2 利便的转换

13.19.3 显示框架

13.19.4 东西提示:

险些所有我们操作来建设我们用户接口的来自于JComponent的类都包括一个称为setToolTipText(string)的要领。因此,险些任何我们所需要暗示的(对付一个工具jc来说就是一些来自JComponent的类)都可以安顿在窗体中:

jc.setToolTipText("My tip");

而且当鼠标停在JComponent上一个高出预先配置的一个时间,一个包括我们的文字的小框就会从鼠标下弹出。

13.19.5 边框

13.19.6 按钮

13.19.7 按钮组

13.19.8 图标

13.19.9 菜单

13.19.10 弹出式菜单

13.19.11 列表框和组合框

13.19.12 滑杆和进度指示条

13.19.13 树

13.19.14 表格

13.19.15 卡片式对话框

13.19.16 Swing动静框:

开窗的情况凡是包括一个尺度的信息框集,答允我们很快通报动静给用户可能从用户哪里捕获动静。在Swing里,这些信息窗被包括在JOptionPane里的。我们有一些差异的大概实现的事件(有一些十分巨大),但有一点,我们必需尽大概的操作static JOptionPane.showMessageDialog()和 JOptionPane.showConfirmDialog()要领,挪用动静对话框和确认对话框。

13.19.17 Swing更多的常识

13.20 总结

13.21 操练

#p#副标题#e#

第14章 多线程

14.1 回响敏捷的用户界面

14.1.1 从线程担任

14.1.2 针对用户界面的多线程

14.1.3 用主类归并线程

14.1.4 建造多个线程

14.1.5 Daemon线程

14.2 共享有限的资源:

可将单线程措施想象成一种孤独的实体,它能遍历我们的问题空间,并且一次只能做一件工作。由于只有一个实体,所以永远不必担忧会有两个实体同时试图利用沟通的资源,就象两小我私家同时都想停到一个车位,同时都想通过一扇门,甚至同时发话。

进入多线程情况后,它们则再也不是孤独的。大概会有两个甚至更多的线程试图同时同一个有限的资源。必需对这种潜在资源斗嘴举办防范,不然就大概产生两个线程同时会见一个银行帐号,打印到同一台计较机,以及对同一个值举办调解等等。

14.2.1 资源会见的错误要领

14.2.2 Java如何共享资源

14.2.3 回首Java Beans

14.3 堵塞

14.3.1 为何会堵塞

14.3.2 死锁

14.4 优先级

14.4.1 线程组

14.5 回首runnable

14.5.1 过多的线程

14.6 总结

14.7 操练

第15章 网络编程

15.1 呆板的标识

15.1.1 处事器和客户机

15.1.2 端口:呆板内唯一无二的场合

15.2 套接字

15.2.1 一个简朴的处事器和客户机措施

15.3 处事多个客户

15.4 数据报

15.5 一个Web应用

15.5.1 处事器应用

15.5.2 NameSender措施片

15.5.3 要留意的问题

15.6 Java与CGI的相同

15.6.1 CGI数据的编码

15.6.2 措施片

15.6.3 用C++写的CGI措施

15.6.4 POST的观念

15.7 用JDBC毗连数据库

15.7.1 得到进修示例

15.7.2 查找措施的GUI版本

15.7.3 JDBC API为何如何巨大

15.8 长途要领:

为通过网络执行其他呆板上的代码,传统的要领不只难以进修和把握,也极易堕落。思考这个问题最佳的方法是:某些工具正好位于另一台呆板,我们可向它们发送一条动静,并得到返回功效,就象那些工具位于本身的当地呆板一样。Java 1.1的“长途要领挪用”(RMI)回收的正是这种抽象。本节将引导各人经验一些须要的步调,建设本身的RMI工具。

15.8.1 长途接口观念

15.8.2 长途接口的实施

15.8.3 建设根与干

15.8.4 利用长途工具

15.8.5 RMI的替选方案

15.9 总结:

由于篇幅所限,尚有其他很多涉及连网的观念没有先容给各人。Java也为URL提供了相当全面的支持,包罗为因特网上差异范例的客户提供协议节制器等等。

#p#分页标题#e#

除此以外,一种正在慢慢风行的技能叫作Servlet Server。它是一种因特网处事器应用,通过Java节制客户请求,而非利用以前那种速度很慢、且相当贫苦的CGI(通用网关接口)协议。这意味着为了在处事器那一端提供处事,我们可以用Java编程,不必利用本身不熟悉的其他语言。由于Java具有优秀的移植本领,所以不必体贴详细容纳这个处事器是什么平台。

所有这些以及其他特性都在《Java Network Programming》一书中获得了具体报告。该书由Elliotte Rusty Harold编著,O’Reilly于1997年出书。

15.10 操练

#p#副标题#e#

第16章 设计范式

16.1 范式的观念

16.1.1 票据

16.1.2 范式分类

16.2 调查器范式

16.3 模仿垃圾接纳站

16.4 改造设计

16.4.1 “建造更多的工具”

16.4.2 用于原型建设的一个范式

16.5 抽象的应用

16.6 多重调派

16.6.1 实现双重调派

16.7 会见器范式

16.8 RTTI有害吗

16.9 总结

16.10 操练:

(1) 将SingletonPattern.java作为起点,建设一个类,用它打点本身牢靠命量的工具。

(2) 为TrashVisitor.java添加一个名为Plastic(塑料)的类。

(3) 为DynaTrash.java同样添加一个Plastic(塑料)类。

第17章 项目:

本章包括了一系列项目,它们都以本书先容的内容为基本,并对早期的章节举办了必然水平的扩充。

与以前经验过的项目对比,这儿的大大都项目都明明要巨大得多,它们充实演示了新技能以及类库的运用。

17.1 文字处理惩罚

17.1.1 提代替码列表

17.1.2 查抄巨细写样式

17.2 要领查找东西

17.3 巨大性理论

17.4 总结:

通过本章的进修,各人知道运用Java可做到一些较巨大的工作。通过这些例子亦可看出,尽量Java肯定有本身的范围,但受那些范围影响的主要是机能(好比写好文字处理惩罚措施后,会发明C++的版本要快得多——这部门是由于IO库做得不完善造成的;而在你读到本书的时候,环境也许已产生了变革。但Java的范围也仅此罢了,它在语言表达方面的本领是无以伦比的。操作Java,险些可以表达出我们想获得的任何工作。而与此同时,Java在表达的利便性和易读性上,也做足了工夫。所以在利用Java时,一般不会陷入其他语言常见的那种巨大田地。利用那些语言时,会感受它们象一个爱絮聒的老妇人,哪有Java那样清纯、简洁!并且通过Java 1.2的JFC/Swing库,AWT的表达本领和易用性甚至又获得了进一步的加强。

17.5 操练:

(1) (稍微有些难度)改写FieldOBeasts.java,使它的状态可以或许保持牢靠。加上一些按钮,答允用户生存和规复差异的状态文件,并从它们断掉的处所开始继承运行。请先参考第10章的CADState.java,再抉择详细奈何做。

(2) (大功课)以FieldOBeasts.java作为起点,结构一个自动化交通仿真系统。

(3) (大功课)以ClassScanner.java作为起点,结构一个非凡的东西,用它找出那些固然界说但从未用过的要领和字段。

(4) (大功课)操作JDBC,结构一个联结打点措施。让这个措施以一个平面文件数据库为基本,个中包括了名字、地点、电话号码、E-mail地点等接洽资料。应该能向数据库里利便地插手新名字。键入要查找的名字时,请回收在第15章的VLookup.java里先容过的那种名字自动填充技能。

#p#副标题#e#

附录A 利用非Java代码

A.1 Java固有接口

A.1.1 挪用固有要领

A.1.2 会见JNI函数:JNIEnv自变量

A.1.3 通报和利用Java工具

A.1.4 JNI和Java违例

A.1.5 JNI和线程处理惩罚

A.1.6 利用现成代码

A.2 微软的办理方案

A.3 J/Direct

A.3.1 @dll.import引导呼吁

A.3.2 com.ms.win32包

A.3.3 搜集

A.3.4 编写回调函数

A.3.5 其他J/Direct特性

A.4 本原接口(RNI)

A.4.1 RNI总结:

RNI与Microsoft JVM细麋集成这一事实既是它的利益,也是它的缺点。RNI比JNI巨大得多,但它也为我们提供了对JVM内部勾当的高度节制;个中包罗垃圾收集。另外,它显然针对速度举办了优化,采用了C措施员熟悉的一些折衷方案和技能。但除了微软的JVM之外,它并不适于其他JVM。

A.5 Java/COM集成

A.5.1 COM基本

A.5.2 MS Java/COM集成

A.5.3 用Java设计COM处事器

A.5.4 用Java设计COM客户

A.5.5 ActiveX/Beans集成

A.5.6 固有要领与措施片的留意事项

A.6 CORBA

A.6.1 CORBA基本

A.6.2 一个例子

A.6.3 Java措施片和CORBA

A.6.4 较量CORBA与RMI

A.7 总结

附录B 比拟C++和Java

附录C Java编程法则

附录D 机能

 

附录E 关于垃圾收集的一些话

附录F 推荐读物

 

    关键字:

天才代写-代写联系方式