黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

Scala 訪問修飾符

scala 訪問修飾符

scala 訪問修飾符基本和java的一樣,分別有:private,protected,public。

如果沒有指定訪問修飾符,默認(rèn)情況下,scala 對(duì)象的訪問級(jí)別都是 public。

scala 中的 private 限定符,比 java 更嚴(yán)格,在嵌套類情況下,外層類甚至不能訪問被嵌套類的私有成員。

 

1. 私有(private)成員

用 private 關(guān)鍵字修飾,帶有此標(biāo)記的成員僅在包含了成員定義的類或?qū)ο髢?nèi)部可見,同樣的規(guī)則還適用內(nèi)部類。

class outer{
? ? class inner{
? ? ? ? private def f(){
? ? ? ? ? ? println("f")
? ? ? ? }
? ? ? ? class innermost{
? ? ? ? ? ? f() // 正確
? ? ? ? }
? ? }
? ? (new inner).f() //錯(cuò)誤
}

(new inner).f( ) 訪問不合法是因?yàn)?f 在 inner 中被聲明為 private,而訪問不在類 inner 之內(nèi)。

但在 innermost 里訪問 f 就沒有問題的,因?yàn)檫@個(gè)訪問包含在 inner 類之內(nèi)。

java 中允許這兩種訪問,因?yàn)樗试S外部類訪問內(nèi)部類的私有成員。

 

2. 保護(hù)(protected)成員

在 scala 中,對(duì)保護(hù)(protected)成員的訪問比 java 更嚴(yán)格一些。因?yàn)樗辉试S保護(hù)成員在定義了該成員的的類的子類中被訪問。而在java中,用protected關(guān)鍵字修飾的成員,除了定義了該成員的類的子類可以訪問,同一個(gè)包里的其他類也可以進(jìn)行訪問。

package p{
class super{
? ? protected def f() {println("f")}
? ? }
? ? ? ? class sub extends super{
? ? ? ? ? ? f()
? ? ? ? }
? ? ? ? class other{
? ? ? ? ? ? ? ? (new super).f() //錯(cuò)誤
? ? ? ? }
}

上例中,sub 類對(duì) f 的訪問沒有問題,因?yàn)?f 在 super 中被聲明為 protected,而 sub 是 super 的子類。相反,other 對(duì) f 的訪問不被允許,因?yàn)?other 沒有繼承自 super。而后者在 java 里同樣被認(rèn)可,因?yàn)?other 與 sub 在同一包里。

 

3. 公共(public)成員

scala 中,如果沒有指定任何的修飾符,則默認(rèn)為 public。這樣的成員在任何地方都可以被訪問。

class outer {
? ?class inner {
? ? ? def f() { println("f") }
? ? ? class innermost {
? ? ? ? ?f() // 正確
? ? ? }
? ?}
? ?(new inner).f() // 正確因?yàn)?f() 是 public
}

 

4. 作用域保護(hù)

scala中,訪問修飾符可以通過使用限定詞強(qiáng)調(diào)。格式為:

private[x] 

或 

protected[x]

這里的x指代某個(gè)所屬的包、類或單例對(duì)象。如果寫成private[x],讀作"這個(gè)成員除了對(duì)[…]中的類或[…]中的包中的類及它們的伴生對(duì)像可見外,對(duì)其它所有類都是private。

這種技巧在橫跨了若干包的大型項(xiàng)目中非常有用,它允許你定義一些在你項(xiàng)目的若干子包中可見但對(duì)于項(xiàng)目外部的客戶卻始終不可見的東西。

package bobsrockets{
? ? package navigation{
? ? ? ? private[bobsrockets] class navigator{
? ? ? ? ?protected[navigation] def usestarchart(){}
? ? ? ? ?class legofjourney{
? ? ? ? ? ? ?private[navigator] val distance = 100
? ? ? ? ? ? ?}
? ? ? ? ? ? private[this] var speed = 200
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? package launch{
? ? ? ? import navigation._
? ? ? ? object vehicle{
? ? ? ? private[launch] val guide = new navigator
? ? ? ? }
? ? }
}

上述例子中,類 navigator 被標(biāo)記為 private[bobsrockets] 就是說這個(gè)類對(duì)包含在 bobsrockets 包里的所有的類和對(duì)象可見。

比如說,從 vehicle 對(duì)象里對(duì) navigator 的訪問是被允許的,因?yàn)閷?duì)象 vehicle 包含在包 launch 中,而 launch 包在 bobsrockets 中,相反,所有在包 bobsrockets 之外的代碼都不能訪問類 navigator。

下一節(jié):scala 運(yùn)算符

scala 教程

相關(guān)文章