概念

封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。java封装操作如下,
(1)将属性进行私有化
(2)提供一个公共的set方法,用于对属性赋值
(3)提供一个公共的get方法,用于获取属性的值
scala中的public属性,底层实际为private,并通过get方法(obj.field())和set方法(obj.field_=(value))对其进行操作。所以scala并不推荐将属性设为private,再为其设置public的get和set方法的做法。但由于很多java框架都利用反射调用getXXX和setXXX方法,有时候为了和这些框架兼容,也会为scala的属性设置getXXX和setXXX方法(通过@BeanProperty注解实现)。

访问权限

  • java:
    public
    protected 同包和子类中使用
    [default] friendly 同包
    private 本类
  • scala:
    [default] 默认都是public,但是Scala没有public关键字
    protected 只能在子类中使用(同包内不行)
    private

private为私有权限,只在类的内部和伴生对象中可用。

protected为受保护权限,Scala中受保护权限比Java中更严格,同类、子类可以访问,同包无法访问。

private[包名]增加包访问权限,包名下的其他类也可以使用

案例

权限修饰符案例

  1. package com.scala.test
  2. class Person {
  3. private var name: String = "bobo"
  4. protected var age: Int = 18
  5. private[test] var sex: String = "男"
  6. def say(): Unit = {
  7. println(name)
  8. }
  9. }
  10. object Person {
  11. def main(args: Array[String]): Unit = {
  12. val person = new Person
  13. person.say()
  14. println(person.name)
  15. println(person.age)
  16. }
  17. }
  18. class Teacher extends Person {
  19. def test(): Unit = {
  20. this.age
  21. this.sex
  22. }
  23. }
  24. class Animal {
  25. def test: Unit = {
  26. new Person().sex
  27. }
  28. }