本章将介绍Scala访问修饰符。包,类或对象的成员可以使用私有(private
)和受保护(protected
)的访问修饰符进行标注,如果不使用这两个关键字的其中一个,那么访问将被视为公开(public
)的。这些修饰符限制了对某些代码区域的成员访问。要使用访问修饰符,请将其关键字包含在包,类或对象的成员的定义中,我们将在下一节中看到。
私有(private
)成员只能在包含成员定义的类或对象内部可见。
以下是示例代码段解释私有(private
)成员 -
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
在Inner
类中声明为private
,并且访问不在Inner
类内。 相比之下,第一次在“InnerMost”
类中访问f()
是可以的,因为该访问包含在Inner
类的主体中。在Java中也允许这样的两个访问,因为它允许外部类访问其内部类的私有成员。
受保护(protected
)成员只能从定义成员的类的子类访问。以下是说明受保护(protected
)成员的示例代码片段 -
package p { class Super { protected def f() { println("f") } } class Sub extends Super { f() } class Other { (new Super).f() // Error: f is not accessible } }
在Sub
类中访问f
是可行的,因为f
被声明为在Super
类中被保护,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
)中访问。