Scala访问控制权限详解与应用实践 #Scala #scala
Scala访问控制权限
-
默认访问权限:
- 描述:Scala中的默认访问权限相当于Java中的public。如果一个变量或方法没有任何修饰符,就代表默认访问权限。
- 作用域:全局,可以在任何地方访问。
-
protected访问权限:
- 描述:protected修饰符表示该属性或方法只能在当前类及其子类中访问。
- 作用域:当前类及其子类。
-
private访问权限:
- 描述:private修饰符表示该属性或方法只能在当前类内部访问。
- 作用域:当前类内部。
-
private[this]访问权限:
- 描述:private[this]修饰符表示该属性或方法只能在当前类内部访问,但不能通过子类访问。
- 作用域:当前类内部,不能通过子类访问。
示例代码
scala
class MyClass {
// 默认访问权限
var defaultVar: Int = 10
// protected访问权限
protected var protectedVar: Int = 20
// private访问权限
private var privateVar: Int = 30
// private[this]访问权限
private[this] var privateThisVar: Int = 40
}
class SubClass extends MyClass {
// 可以访问protectedVar
println(protectedVar)
// 不能访问privateVar
// println(privateVar) // 错误
// 不能访问privateThisVar
// println(privateThisVar) // 错误
}
扩展示例代码
scala
class Student123 {
// 1. 默认权限方法类似于Java中的public
val name: String = "小花"
// 2. 私有属性。 类的内部。 不能继承
private val score: Int = 59
// 3. 受保护的。可以继承
protected val car: String = "baxputluk halidam"
def say(): Unit = {
println(s"Name: $name, Score: $score, Car: $car")
}
}
object Student123 {
def run(obj: Student123): Unit = {
// 由于是伴生对象,可以直接访问类中的所有成员,包括私有成员
println(s"Name: ${obj.name}, Score: ${obj.score}, Car: ${obj.car}")
}
}
// 子类
class SubStudent extends Student123 {
def test(): Unit = {
// 可以访问受保护的属性car
println(s"Name: ${this.name}, Car: ${this.car}")
// 尝试访问私有属性score将导致编译错误
// println(this.score) // 错误
}
}
object Test22_01 {
def main(args: Array[String]): Unit = {
val s = new Student123()
val s1 = new SubStudent()
s.say()
Student123.run(s)
s1.test()
}
}
总结
Scala的访问控制权限提供了灵活的访问控制机制,可以根据需要选择合适的访问权限,以保护类的内部状态和实现细节。通过合理使用这些访问权限,可以有效地控制代码的访问权限,提高代码的安全性和可维护性。在实际开发中,根据成员变量和方法的使用场景,选择适当的访问权限是非常重要的