Scala 访问修饰符
本章介绍了Scala的访问修饰符。包、类或对象的成员可以使用访问修饰符private和protected进行标记,如果我们没有使用这两个关键字中的任何一个,则默认访问权限为public。这些修饰符将对成员的访问限制在代码的特定区域内。要使用访问修饰符,您需要在包、类或对象的成员定义中包含其关键字,下面的部分将对此进行详细说明。
私有成员
私有成员仅对包含该成员定义的类或对象内部可见。
以下是一个示例代码片段,用于解释私有成员:
示例
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // Error: f is not accessible
}
在Scala中,访问(new Inner).f()是非法的,因为在Inner中f被声明为私有,并且访问不是来自Inner类内部。相比之下,在Innermost类中的第一个访问f是可以的,因为该访问包含在Inner类的体内。Java会允许这两种访问,因为它允许外部类访问其内部类的私有成员。
受保护成员
受保护成员只能从定义该成员的类的子类访问。
以下是用于解释受保护成员的示例代码片段:
示例
package p {
class Super {
protected def f() { println("f") }
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() // Error: f is not accessible
}
}
在class Sub中,对f的访问是允许的,因为f在’Super’类中被声明为protected,并且’Sub’类是’Super’类的子类。相比之下,在’Other’类中对f的访问是不允许的,因为’Other’类没有继承自’Super’类。在Java中,后一种访问仍然被允许,因为’Other’类与’Sub’类在同一个包中。
公共成员
与私有成员和受保护的成员不同,对于公共成员不需要指定public关键字。对公共成员没有明确的修饰符。这些成员可以从任何地方访问。
以下是用于解释公共成员的示例代码片段:
示例
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
保护范围
在Scala中,访问修饰符可以与限定符一起使用。形式为private[X]或protected[X]的修饰符表示访问是私有的或受保护的,”直到”X,其中X表示某个封闭的包、类或单例对象。
考虑以下示例−
示例
package society {
package professional {
class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secrets = null
def help(another : Executive) {
println(another.workDetails)
println(another.secrets) //ERROR
}
}
}
}
注意 − 以下是从上面的示例中的要点 −
-
变量workDetails将可以被封装包professional中的任何类访问。
-
变量friends将可以被封装包society中的任何类访问。
-
变量secrets只能在实例方法(this)中对隐式对象访问。