private关键字

34 阅读1分钟

在 Scala 中,private 关键字用于限制成员(字段、方法、类、对象等)的访问权限,核心目标是封装—— 隐藏内部实现细节,仅允许特定范围的代码访问。Scala 的 private 权限模型比 Java 更灵活,支持细粒度的访问控制,具体行为取决于修饰的位置和是否带参数。

核心规则:默认 private(类内可见)

Scala 中未指定访问修饰符时,成员默认是 private(不同于 Java 的默认包访问权限),仅在当前类及其伴生对象中可见。

1. 类成员的默认 private

class Person {
  // 默认为 private,仅 Person 类和其伴生对象可访问
  val name: String = "Alice"
  private val age: Int = 25 // 显式声明 private,效果同上

  def introduce(): String = {
    s"My name is $name, I'm $age years old" // 类内可访问 private 成员
  }
}

// 伴生对象(与类同名,同文件)
object Person {
  def getAge(p: Person): Int = {
    p.age // 伴生对象可访问类的 private 成员
  }
}

// 测试访问权限
object Test {
  def main(args: Array[String]): Unit = {
    val p = new Person()
    println(p.name) // 编译报错!name 是 private,Test 不在允许范围内
    println(p.age)  // 编译报错!age 是 private
    println(Person.getAge(p)) // 合法:通过伴生对象访问,输出 25
    println(p.introduce())    // 合法:通过类的公有方法访问,输出 "My name is Alice, I'm 25 years old"
  }
}

2. 伴生对象的 private 成员

类也可访问其伴生对象的 private 成员:

object Person {
  private val secret: String = "I like Scala"
}

class Person {
  def getSecret(): String = {
    Person.secret // 类可访问伴生对象的 private 成员
  }
}

// 测试
val p = new Person()
println(p.getSecret()) // 合法,输出 "I like Scala"