包,类或对象的成员可以标记访问修饰符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() 是非法的,因为f被声明为private内部类并且访问不是在内部类内。与此相反,到f第一接入类最内层是确定的,因为该访问包含在类内的主体。 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
- }
- }
类分给 f 访问是正常的,因为f被声明为受保护的超类和子类是超级的子类。相比之下,访问 f 在其他是不允许的,因为其他没有从超级继承。在Java中,后者访问将仍然允许的,因为其他的是在同一个包子。
公共成员:
未标示私有或受保护的每一个成员是公开的。不需要明确使用修饰符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)。