11.8 时间相加
假设你要去看电影,影片开始放映的时间为 18:50(6:50PM),时长为 2 小时 16 分钟,请问影片将在什么时候结束?
我们用 Time 对象来执行这种计算。可采取下面两种方式将 Time 对象“相加”:
编写一个将两个
Time对象作为参数的静态方法;编写一个通过
Time对象进行调用,并将一个 Time 对象作为参数的实例方法。
为说明差别,我们将演示这两种方式。静态方法的代码类似于下面这样:
public static Time add(Time t1, Time t2) {Time sum = new Time();sum.hour = t1.hour + t2.hour;sum.minute = t1.minute + t2.minute;sum.second = t1.second + t2.second;return sum;}
下面的代码演示了如何调用这个静态方法:
Time startTime = new Time(18, 50, 0.0);Time runningTime = new Time(2, 16, 0.0);Time endTime = Time.add(startTime, runningTime);
另一方面,实例方法的代码类似于下面这样:
public Time add(Time t2) {Time sum = new Time();sum.hour = this.hour + t2.hour;sum.minute = this.minute + t2.minute;sum.second = this.second + t2.second;return sum;}
所做的修改如下。
删除了关键词
static。删除了第一个形参。
将
t1替换成了this。
还可以将 t2 替换为 that。不同于 this,that 并非关键词,而只是一个比 t2 更合适的变量名。
下面的代码演示了如何调用这个实例方法:
Time endTime = startTime.add(runningTime);
这就是将时间相加的静态方法和实例方法。静态方法和实例方法的功能相同,要想在它们之间转换,只需要修改几个地方。
然而,还有一个问题,那就是执行加法的代码不正确。就这个示例而言,返回的结果为 20:66,这并非有效的时间。如果 second 超过了 59,那么就必须进位到 minute,而如果 minute 超过了 59,就必须进位到 hour。
下面是一个更佳的 add 版本:
public Time add(Time t2) {Time sum = new Time();sum.hour = this.hour + t2.hour;sum.minute = this.minute + t2.minute;sum.second = this.second + t2.second;if (sum.second >= 60.0) {sum.second -= 60.0;sum.minute += 1;}if (sum.minute >= 60) {sum.minute -= 60;sum.hour += 1;}return sum;}
然而,hour 也可能超过 23,但 Time 类没有属性 days,因此无法进位。在 hour 超过 23 时,可用 sum.hour -= 24 来获得正确的结果。
