重载方法和字段
统一访问原则只是Scala在对待字段和方法方面比Java更统一的一个方面。另 一个差异是Scala里,字段和方法属于相同的命名空间。这使得字段重载无参数方法成为可能。比如说, 你可以改变类ArrayElement中contents的实现,从一个方法变为一个字段,而无需修改类Element中 contents的抽象方法定义,如展示在代码10.4中的那样:
class ArrayElement(conts: Array[String]) extends Element { val contents: Array[String] = conts }
代码 10.4 用字段重载无参数方法
这个ArrayElement的版本里,字段contents(用 val定义)完美地实现了类Element里的无参数方法contents(用def定义)。
另一方面,Scala里 禁止在同一个类里用同样的名称定义字段和方法,而在Java里这样做被允许。例如,下面的Java类能够 很好地编译:
// 在Java里的代码 class CompilesFine { private int f = 0; public int f() { return 1; } }
但是相应的Scala类将不能编译:
class WontCompile { private var f = 0 // 编译不过,因为字段和方法重名 def f = 1 }
通常情况下,Scala仅为定义准备了两个命名空间,而Java有四个。Java的四个命名空间是字 段,方法,类型和包。与之相对,Scala的两个命名空间是:
值(字段,方法,包还 有单例对象)
类型(类和特质名)
Scala把字段和方法放进同一个命名空间的 理由很清楚,因为这样你就可以使用val重载无参数的方法,这种你在Java里做不到的事情。Scala里包 共享了与字段和方法相同的命名空间的原因是为了让你能除了仅仅引用类型名以及单例对象的字段和方 法之外,还能直接引用包。这同样是你在Java中无法做到的。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 参数
, 方法
, scala
, java重载
, 字段
, contents
参数字段
,以便于您获取更多的相关知识。