Scala编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

10.5 重写方法和字段

统一访问原则只是Scala比Java在处理字段和方法上更加统一的一个方面。另一个区别是Scala中字段和方法属于同一个命名空间。这使得用字段重写无参方法变为可能。举例来说,可以将ArrayElement类中的contents实现从方法改成字段,这并不需要修改Element类中的contents定义,如示例10.4所示:

示例10.4 用字段重写无参方法

这个版本的ArrayElement中的contents字段(用val定义)是Element类的contents方法(用def定义)的一个没有问题的好实现。另一方面,Scala也禁止在同一个类中使用相同的名称命名字段和方法,在Java中这是允许的。

例如,下面这个Java类可以正常编译:

相应的Scala类则不能:

一般来说,Scala只有两个命名空间用于定义,不同于Java的四个。Java的四个命名空间分别是:字段、方法、类型和包,而Scala的两个命名空间分别是:

• 值(字段、方法、包和单例对象)

• 类型(类和特质名)

Scala将字段和方法放在同一个命名空间的原因正是为了让你可以用val来重写一个无参方法,这在Java中是不允许的。[4]