11.11 练习
本章的示例代码位于仓库 ThinkJavaCode 的目录 ch11 中,有关如何下载这个仓库,请参阅前言中的“使用示例代码”一节。做以下的练习前,建议你先编译并运行本章的示例。
至此,你已经具备了足够的知识,应该能够看懂介绍简单 2D 图形和动画的附录 B。阅读接下来的几章时,你应抽空阅读这个附录并完成各章的练习。
练习11-1
阅读 java.awt.Rectangle 的文档,看看哪些方法是纯方法?哪些是非纯方法?
如果阅读 java.lang.String 的文档,你将发现它没有非纯方法,因为字符串是不可修改的。
练习11-2
本章中的 increment 方法的实现效率不太高,你能重写这个方法,使其不使用任何循环吗?提示:别忘了求模运算符。
练习11-3
在图版游戏 Scrabble 中,每个卡片都包含一个字母和一个分数,其中前者用于在行列上拼出单词,后者用于计算单词的价值。
(1) 请为表示卡片的 Tile 类编写定义。这个类应包含 char 实例变量 letter 和 int 实例变量 value。
(2) 编写一个构造函数,让它包含形参 letter 和 value,并初始化前述实例变量。
(3) 编写一个名为 printTile 的方法,它将一个 Tile 对象作为参数,并以方便阅读的格式显示该对象的实例变量。
(4) 编写一个名为 testTile 的方法,让它创建一个属性 letter 和 value 分别为 Z 和 10 的 Tile 对象,再用 printTile 来显示这个对象的状态。
(5) 为 Tile 类实现方法 toString 和 equals。
(6) 为每个属性创建获取方法和设置方法。
这个练习旨在让你熟悉创建类定义以及编写测试类的代码。
练习11-4
对象类型 Date 包含三个 int 实例变量:year、month 和 day,请为它编写类定义。这个类应提供两个构造函数,其中一个没有任何形参,并将实例变量初始化为默认值;另一个包含形参 year、month 和 day,并用它们来初始化实例变量。
编写一个 main 方法,让它创建一个表示你生日的 Date 对象——birthday。可用前述任何一个构造函数创建这个对象。
练习11-5
有理数是可表示为分数的数字。例如,2/3 就是一个有理数,数字 7 也是有理数,因为可将其视为 7/1。
(1) 定义一个名为 Rational 的类,让它包含两个 int 实例变量,分别用于存储分子和分母。
(2) 编写一个构造函数,让它不接受任何参数,并将分子和分母分别设置为 0 和 1。
(3) 编写一个名为 printRational 的实例方法,并以合理的格式显示 Rational 对象。
(4) 编写一个 main 方法,让它创建一个 Rational 对象、设置该对象的实例变量并显示该对象。
(5) 至此,你编写了一个最基本的程序,请对其进行测试,必要时进行调试。
(6) 为 Rational 类编写方法 toString,并用 println 对其进行测试。
(7) 再编写一个构造函数,让它包含两个形参,并用它们来初始化实例变量。
(8) 编写一个名为 negate 的实例方法,让它对有理数求负。这是一个非纯方法,因此也是 void 方法。在 main 中添加对这个方法进行测试的代码。
(9) 编写一个名为 invert 的实例方法,让它通过将分子和分母互换来计算倒数。这是一个非纯方法。在 main 中添加对这个方法进行测试的代码。
(10) 编写一个名为 toDouble 的实例方法,让它将有理数转换为 double 值(浮点数),并返回结果。这是一个纯方法,不修改对象。与前面一样,请对这个方法进行测试。
(11) 编写一个名为 reduce 的实例方法,让它将有理数化简为最简分数:找出分子和分母的最大公约数,并将分子和分母都除以这个公约数。这是一个纯方法,不修改当前对象的实例变量。
提示:找出最大公约数只需要几行代码。要了解这方面的更详细信息,请在网上搜索 Euclidean algorithm。
(12) 编写一个名为 add 的实例方法,让它将一个 Rational 对象作为参数,将其与 this 相加,并返回一个新的 Rational 对象。
将分数相加的方法有很多种。你可根据自己的喜好选择,但务必对结果进行化简,让分子和分母没有除 1 之外的其他公约数。
这个练习旨在让你编写包含各种方法的类定义:构造函数、静态方法、实例方法、非纯方法和纯方法。
