为什么80%的码农都做不了架构师?>>>
接上篇blog,scala里的字段和方法属于相同的命名空间,这让字段可以重写无参数方法。例如,你可以通过改变ArrayElement类中contents的实现将其从一个方法变为一个字段,而无需修改类Element中contents的的抽象方法定义,如例:
abstract class Elements {def contents: Array[String]
}
class ArrayElement(conts: Array[String]) extends Elements {val contents: Array[String] = conts
}object ArrayElement {def main(args: Array[String]): Unit = {val array = new ArrayElement(Array("dddaaa", "dddww"))println(array.contents.length)}
}
这个版本的ArrayElement中的contents字段(用val定义)为Element类中的无参数方法contents(用def定义)提供了非常好的实现。
另一方法,scala里禁止在同一个类里用同样的名称定义字段和方法。尽管Java允许这样做。示例,这在scala类将不能通过编译:
class T2 {private var f = 0def f = 1 //不能编译通过,因为字段和方法重名
}
与Java为定义准备了四个命名空间(分别是字段,方法,类型和包)相对,一般来说,scala仅有两个命名空间:
值(字段,方法,包还有单例对象)
类型(类和特质名)
scala把字段和方法放进同一个命名空间的理由很明确,因为这样你就可以实现使用val重写无参数方法这种你在Java里做不到的事情。