
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.5 添加字段
现在主构造器已经正确地保证了它的前提条件,接下来我们将注意力转向如何支持加法。我们可以给Rational类定义一个add方法,接收另一个Rational对象作为参数。为了保持Rational对象不可变,这个add方法不能将传入的有理数加到自己身上,它必须创建并返回一个新的持有这两个有理数的和的Rational对象。你可能会认为这样写add方法是可行的:


不过,就这段代码而言,编译器会报错:

虽然类参数n和d在你的add方法中处于作用域内,但是只能访问执行add方法调用的那个对象上的n和d的值。因此,当你在add实现中用到n或d时,编译器会提供这些类参数对应的值,但它并不允许使用that.n或that.d,因为that并非指向你执行add方法调用的那个对象。[2]要访问that的分子和分母,需要将它们做成字段。示例6.1展示了如何将这些字段添加到Rational类中。[3]
在示例6.1的这个Rational类版本中,我们添加了两个字段,即numer和denom,分别用类参数n和d的值初始化。[4]我们还修改了toString和add方法的实现,并使用这两个字段,而不是类参数。这个版本能够编译通过。你可以对有理数做加法来测试它:


示例6.1 带有字段的Rational类
还有另一个之前不能做现在可以做的事,那就是从对象外部访问分子和分母的值。只需要访问公共的numer和denom字段即可,就像这样:
