scala的访问权限

34 阅读4分钟

Scala的访问权限概述

Scala中的属性、方法可以通过访问控制符来设置不同的访问权限。不同的访问控制符可以决定是否可以被外部类访问。

有四种访问控制权限,分别为:

(1)默认访问权限。Scala中的默认访问权限相当于Java中的public,Scala中如果一个变量没有任何修饰符,就代表默认访问权限。作用域:全部

(2)protected访问权限。作用域:本类,子类

(3)private访问权限。作用域:类内部(伴生对象:定义方法传入类的对象)

(4)private[this]访问权限。

默认权限基本代码:

package level02


/*
*  访问权限控制
*
* 1. 默认访问权限
* 2. 使用protected(被保护的)修饰符
*     (1)在类的外部不能直接通过对象
*     (2)
*
 */


object class27 {

  // name 属性具有默认的访问权限
  class Student(var name:String,protected var gender:String) {

  }

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

private 访问权限

private : 私有的。它的特点有如下三个。

       (1) 在类的内部可以访问。

       (2) 在类的外部不能访问。

使用private 和protected的基本代码:

package level02

/*
*  访问权限控制
*
* 1. 默认访问权限
* 2. 使用protected(被保护的)修饰符
*     (1)在类的外部不能直接通过对象
*     (2)在子类中可以访问protected修饰的成员
* 3. private(私有的)
* (1)在子类中,无法访问
*
*/


object class28 {

 // name 属性具有默认的访问权限
 class Fater() {
   var name:String="小花"

   protected var gender:String="女"
   protected  def test():Unit={
     println("test")
   }
   private val age:String="18"
   private def test1():Unit={
     println("test1")
   }

 }
 // 在子类中,我们通过super 来访问父类
 class Son extends Fater{
   // protected 修饰的成员,可以在子类中访问
   super.test()
   println(gender)
//    private  修饰的成员在子类中不可以访问
//    super.test1()
//    println(age)
 }

 def main(args: Array[String]): Unit = {
  var son1=new Son()
}
}

(3) 在伴生对象中可以访问。

protected 访问权限

protected : 受保护的。它的特点有如下4个:

(1) 在类的内部可以访问。

(2) 在类的外部不能访问。

(3) 在伴生对象中可以访问。

(4) 在子类中可以访问,与之对应的是:private修饰的,在子类中无法访问

在伴生对象中使用protected的基本代码:

package level02

/*
*  访问权限控制
*
* 1. 默认访问权限
* 2. 使用protected(被保护的)修饰符
*     (1)在类的外部不能直接通过对象
*     (2)在子类中可以访问protected修饰的成员
* 3. private(私有的)
* (1)在子类中,无法访问
*(2) 在伴生对象,伴生类可以访问
 */


object class29 {

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

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

private[this] 控制方法作用域

private [this] : 更加严格的私有权限。这个属性(方法)只能在调用它的同一个实例内使用。

特点如下:

       (1) 在类的内部可以访问。

       (2) 在类的外部不能访问 private[this]。

       (3) 在伴生对象不能访问 private[this]。

       (4) 在子类中不能访问 private[this]。

有关private [this]控制方法作用域的代码:

/*
*  访问权限控制
*
* 1. 默认访问权限
* 2. 使用protected(被保护的)修饰符
*     (1)在类的外部不能直接通过对象
*     (2)在子类中可以访问protected修饰的成员
* 3. private(私有的)
* (1)在子类中,无法访问
*(2) 在伴生对象,伴生类可以访问
* 4. private[this]私有,只能在当前的类中访问。
* 子类无法访问,伴生对象,伴生类中不可以访问
 */


object class30 {


  class Student() {
    private var age:Int=10
    private[this] var secret: String = "xx日,xx事"

    def test ():Unit={
      // if () {}
      println(secret)
    }
    }
  object Student {
    def test(student: Student):Unit={
      // 在伴生对象中,可以通过对象,属性的方法来访问
      println(student.age)
//      private  [this],只能在当前的类中被访问
//      println(stu.secret)

    }
  }



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

更加严格的私有权限,表示该字段或方法只能在调用它的同一个实例内部可见。这意味着即使在同一类的其他实例中,也无法访问该字段或方法。不能在伴生对象中访问,不能在函数参数中访问。