8.3 封装
封装(encapsulation)就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。
我们前面使用@BeanProperty
已经很进行了相应的封装
8.3.1 默认访问修饰符
Scala 的访问修饰符(access modifier)和 Java 有如下不同点。
如果不指定任何访问修饰符,那么 Java 会默认为包内部可见,而 Scala 则
默认为公开( 。public
)Java 主张全有或全无,也就是说,对当前包的所有类可见或者对所有都不可见。而 Scala 对可见性的控制是细粒度的。
Java 的
protected
是宽泛的,其作用域包括在任意包中的派生类和当前包中的任意类,而 Scala 的protected
与 C++和 C#的类似,只有派生类能够访问。然而,在 Scala 中protected
还有相当自由和灵活的用法。Java 的封装是类级别的。可以在一个类的实例方法中访问该类的任何实例的所有私有 字段和方法,在 Scala 中也一样,不过,在 Scala 中也可以进行定制,让其只能在当 前的实例方法中访问,这样就和 Ruby 比较像了。
8.3.2 定制修饰符
在不使用任何访问修饰符的情况下, Scala 默认认为类、字段和方法都是公开的。
如果想将一个成员标记为 private
或者 protected
, 只要像下面这样用相应的关键字标记即可。
class Person {
def say() = println("say...")
private def eat() = println("eat...")
}
object Demo {
def main(args: Array[String]): Unit = {
var p = new Person
p.say() // ok
p.eat() // 编译错误
}
}
8.3.3 Scala 的 protected
在 Scala 中,protected
让所修饰的成员仅对自己和派生类可见。对于其他类来说,即使正好和所定义这个类处于同一个包中,也无法访问这些成员。更进一步,派生类在访问 protected
成员的时候,成员的类型也需要一致。
package bj
object Demo2{
def main(args: Array[String]): Unit = {
}
}
class Person{
protected def say() = {}
}
class Student extends Person{
def f1(): Unit ={
this.say() // ok
}
def f2(stu:Student): Unit ={
stu.say() // ok
}
def f3(per:Person): Unit ={
per.say() // 编译错误.
}
}