8.3 封装

封装(encapsulation)就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。

我们前面使用@BeanProperty已经很进行了相应的封装


8.3.1 默认访问修饰符

Scala 的访问修饰符(access modifier)和 Java 有如下不同点。

  1. 如果不指定任何访问修饰符,那么 Java 会默认为包内部可见,而 Scala 则默认为公开(public)

  2. Java 主张全有或全无,也就是说,对当前包的所有类可见或者对所有都不可见。而 Scala 对可见性的控制是细粒度的。

  3. Java 的 protected 是宽泛的,其作用域包括在任意包中的派生类和当前包中的任意类,而 Scala 的 protected 与 C++和 C#的类似,只有派生类能够访问。然而,在 Scala 中 protected 还有相当自由和灵活的用法。

  4. 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()  // 编译错误. 
    }
}
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-04-12 12:19:22

results matching ""

    No results matching ""