上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.5 添加字段
现在主构造器已经正确地保证了它的前置条件,我们将注意力转向如何支持加法。我们将给Rational类定义一个add方法,接收另一个Rational作为参数。为了保持Rational不可变,这个add方法不能将传入的有理数加到自己身上,它必须创建并返回一个新的持有这两个有理数的和的Rational对象。你可能会认为这样写add是OK的:
不过,就这段代码而言编译器会报错:
虽然类参数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和demon字段即可,就像这样: