# scala的访问权限

17 阅读2分钟

1.默认访问权限

Scala中的默认访问权限相当于Java中的public,Scala中如果一个变量没有任何修饰符,就代表默认访问权限。

作用域:全部

object class20 {
  // name 属性具有默认的访问权限
  class Student(var name:String) {
  }

  def main(args: Array[String]): Unit = {
    val s1 = new Student("小花")
    // 类的外部可以访问
    println(s1.name)
  }
}

2.protected访问权限

protected(被保护的)

在类的内部、伴生对象、子类中可以访问,在类的外部不能访问。

在类的外部,不能直接通过对象,属性的方式来访问

object class20 {
  class Student(var name:String,protected var gender:String) {
  }

  def main(args: Array[String]): Unit = {
    val s1 = new Student("小花","女")
    // protected属性,在类的外部无法访问
    // println(s1.gender)
  }
}

在子类中,可以访问protected修饰的成员

object class20 {
 
  class Father() {
    var name:String = "小花"
    protected var gender:String = "女" // 属性
    
    protected def test(): Unit = {    // 方法
      println("test")
    } 
  }
  
  class Son extends Father{
    super.test()    // 在子类中,我们通过 super 来访问父类方法
    println(gender)
  }
  
  def main(args: Array[String]): Unit = {
    var son1 = new Son()
  }
}

3.private访问权限

private(私有的)
在类的内部、伴生对象(定义方法传入类的对象)中可以访问。在类的外部不能访问。

private在子类中,无法访问

  class Father() {
    var name:String = "小花"
    private val age:String = "18"
    
    private def test1(): Unit = {
      println("test1")
    }
  }

  class Son extends Father{
    // private 修饰的成员,不可以在子类中访问
    // super.test1()   报错
    // println(age)    报错
  }
  def main(args: Array[String]): Unit = {
    var son1 = new Son()
  }
}

private在伴生对象,伴生类中可以访问

object class26 {
  class Student() {
    private var age:Int = 10
    }
  object Student {
    def test(stu:Student): Unit = {
      // 在伴生对象中,可以通过对象,属性的方法来访问
      println(stu.age)
    }
  }

  def main(args: Array[String]): Unit = {
    val stu = new Student()
    // private 成员,不能在类的外部,通过对象,属性的方法来访问
    // stu.age 报错
    Student.test(stu)
  }
}

4.private[this]访问权限

private[this]这个属性(方法)只能在调用它的同一个实例内使用

只能在类的内部访问,子类无法访问,伴生对象、伴生类无法访问。

object class26 {
  class Student() {
 
    private[this] var secret:String = "xx日,xxx事"

    def test(): Unit = {
      println(secret)
    }
  }
  object Student {
    def test(stu:Student): Unit = {
      
      // private(stu.secret) 报错
    }
  }
  def main(args: Array[String]): Unit = {
    Student.test(stu)
    stu.test()
  }
}