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() 是非法的,因為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)。