这节课以 BlueJ 的一个电子表为例:
新建一个ClockDisplay 的对象后, 点击它, 里面有一个实例变量:
String displayString.
现在显示的是 “00:00”, 也代表在现实中电子表会显示的字符串
在 Java 中, 我们要想跟 object 互动 就需要 使用 method:
里面只有三个 methods, 是个很简单的 interface.
getTime() 和 setTime(int hour, int minute) 就是我上文讲到的 accessor 和 mutator.
timeTick() 以某种方式被物理计时器调用. 在现实的时钟里会产生有规律的时间信号. 在这个例子当中, 我们每 call 一次这个方法, 电子表的显示就会增加一分钟.
现在我们来研究在 Java 中怎样用代码来实现这些.
Modularisation & Abstraction
如果说这是我们要做的东西:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bdZtdqJ-1635579379516)(C:\Users\Lee\AppData\Roaming\Typora\typora-user-images\image-20211029213958124.png)]
我们现在想一下怎么样来实现这样一个东西.
modularisation (模块化) 和 abstraction (抽象化) 的思想告诉我们要先把大个事物细分成小的部分.
就这个例子, 我们可以把这个四维数显示的电子表显示器看成 两个 两位数 的显示, 然后一个一个的去实现它们, 这样就容易多了.
时间的单位都是从"0"开始计时, 到某一个临界值就会归零.
public class NumberDispaly
{
private int limit;
private int value;
// Constructor and methods omitted.
}
按照这个想法, 我们只需要先把分钟做出来, 再照着模子把时钟做出来就行了
现在, 我们管整个四位数显示 “00:00” 叫 ClockDisplay, 管两个分别代表时, 分的两位显示叫 NumberDisplay.
在 NumberDisplay 中:
minute, 从"0" 走到 “59”, hour, 从"0" 走到 “23”
最低值永远是零, 但是最高值是不固定的, 所以在最高值这里不得不有一个 variable
在上面的代码中, 我们用 limit 来存储这个变量, 而 value 用来存储现在的时间. 假如说现在 ClockDisplay 显示的是 “22:03”, 在时针里, value 存储的就是 “22”, “03” 则被存储到分针中.
Class & Object
在深入 Constructor 和 method 之前, 我们继续探讨一下这个表的结构.
两个两位显示分别代表 hour 和 minute, 换句话说, hour 和 minute 都是 NumberDisplay 的 对象,
public class ClockDisplay
{
private NumberDisplay hours;
private NumberDisplay minutes;
// Constructor and methods omitted.构造器和方法略
}
有了两个 NumberDisplay, 就可以合成一个 ClockDisplay, 也就是我们最终要做的电子表.
在 ClockDisplay类 里存储两个变量分别代表 minute 和 hour 就是上面的代码.
在这里我们要注意到一个细节, “NumberDisplay” 在 field declaration (字段声明) 中出现了.
这里就体现了Java的强大之处: 在 Java 中 类 名是可以当作 数据类型 来使用的, 也就是说我们可以在 Java 中通过新建类的方式来创造数据类型.
现在我们有了两个类型为 NumberDisplay 的变量, 那就意味着这两个变量可以存储 NumberDisplay 的 对象. 所以, ClockDispaly类 的 对象 会在 实例变量 “hours” 和 “minutes” 中分别存储一个 NumberDisplay 的 对象.
这里有一个非常重要的细节需要提一下, 当一个 Java 对象存储另一个 Java对象时 (比如说这种情况), 它 并不是直接存储这个对象, 而是存储了