本章將介紹Scala訪問(wèn)修飾符。包,類或?qū)ο蟮某蓡T可以使用私有(private
)和受保護(hù)(protected
)的訪問(wèn)修飾符進(jìn)行標(biāo)注,如果不使用這兩個(gè)關(guān)鍵字的其中一個(gè),那么訪問(wèn)將被視為公開(kāi)(public
)的。這些修飾符限制了對(duì)某些代碼區(qū)域的成員訪問(wèn)。要使用訪問(wèn)修飾符,請(qǐng)將其關(guān)鍵字包含在包,類或?qū)ο蟮某蓡T的定義中,我們將在下一節(jié)中看到。
私有(private
)成員只能在包含成員定義的類或?qū)ο髢?nèi)部可見(jiàn)。
以下是示例代碼段解釋私有(private
)成員 -
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // Error: f is not accessible
}
在Scala,訪問(wèn)(new Inner). f()
是非法的,因?yàn)?code>f在Inner
類中聲明為private
,并且訪問(wèn)不在Inner
類內(nèi)。 相比之下,第一次在“InnerMost”
類中訪問(wèn)f()
是可以的,因?yàn)樵撛L問(wèn)包含在Inner
類的主體中。在Java中也允許這樣的兩個(gè)訪問(wèn),因?yàn)樗试S外部類訪問(wèn)其內(nèi)部類的私有成員。
受保護(hù)(protected
)成員只能從定義成員的類的子類訪問(wèn)。以下是說(shuō)明受保護(hù)(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
類中訪問(wèn)f
是可行的,因?yàn)?code>f被聲明為在Super
類中被保護(hù),Sub
類是Super
的子類。 相反,不允許訪問(wèn)Other
類中的f()
方法,因?yàn)?code>Other類不會(huì)從Super
類繼承。在Java中,后者的訪問(wèn)將仍然允許,因?yàn)?code>Other類與Sub
類在同一個(gè)包中。
不同于私有和受保護(hù)的成員,不需要為公有成員使用Public
關(guān)鍵字指定。沒(méi)有明確使用修飾符則自動(dòng)歸為公共成員。 這些成員可以從任何地方訪問(wèn)。
以下是解釋公共成員的示例代碼片段 -
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
Scala中的訪問(wèn)修飾符可以通過(guò)限定符進(jìn)行擴(kuò)充。形式為private [X]
或protected [X]
的修飾符表示為訪問(wèn)是私有或受保護(hù)的“最多”到X,其中X指定一些封閉的包,類或單例對(duì)象。
考慮以下示例 -
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
}
}
}
}
注意 - 以下幾點(diǎn)來(lái)自上面的例子總結(jié) -
workDetails
在封閉包professional
中的任何類中可訪問(wèn)。friends
的任何類都可以被society
包中任何類訪問(wèn)。secrets
只能在實(shí)例方法的隱式對(duì)象(this
)中訪問(wèn)。