![Scala编程(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/353/38381353/b_38381353.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
10.5 重写方法和字段
统一访问原则只是Scala比Java在处理字段和方法上更加统一的一个方面。另一个区别是Scala中字段和方法属于同一个命名空间。这使得用字段重写无参方法变为可能。举例来说,可以将ArrayElement类中的contents实现从方法改成字段,这并不需要修改Element类中的contents定义,如示例10.4所示:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-220-1.jpg?sign=1739283148-0AcIdgj8aiMRFdMsdekM9RPsRcTl7hLY-0-6fad23890d3e3cc03359aab8c9324cea)
示例10.4 用字段重写无参方法
这个版本的ArrayElement中的contents字段(用val定义)是Element类的contents方法(用def定义)的一个没有问题的好实现。另一方面,Scala也禁止在同一个类中使用相同的名称命名字段和方法,在Java中这是允许的。
例如,下面这个Java类可以正常编译:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-220-2.jpg?sign=1739283148-TVD8aLo9uPy519cPZszTiLhc2xv3s7Om-0-1f85a0d3d09af2b47a8732577fa188db)
相应的Scala类则不能:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-220-3.jpg?sign=1739283148-t8Ab5PDklxgAcH2WETysjeo33jJ1jQER-0-99076420a7b368cbd99ea6542d69bd39)
一般来说,Scala只有两个命名空间用于定义,不同于Java的四个。Java的四个命名空间分别是:字段、方法、类型和包,而Scala的两个命名空间分别是:
• 值(字段、方法、包和单例对象)
• 类型(类和特质名)
Scala将字段和方法放在同一个命名空间的原因正是为了让你可以用val来重写一个无参方法,这在Java中是不允许的。[4]