在 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"