中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

Scala 訪問(wèn)修飾符

Scala 訪問(wèn)修飾符基本和Java的一樣,分別有:private,protected,public。

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

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


私有(Private)成員

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

class Outer{
    class Inner{
    private def f(){println("f")}
    class InnerMost{
        f() // 正確
        }
    }
    (new Inner).f() //錯(cuò)誤
}

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

但在 InnerMost 里訪問(wèn) f 就沒(méi)有問(wèn)題的,因?yàn)檫@個(gè)訪問(wèn)包含在 Inner 類(lèi)之內(nèi)。

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


保護(hù)(Protected)成員

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

package p{
class Super{
    protected def f() {println("f")}
    }
????class Sub extends Super{
????    f()
????}
????class Other{
????????(new Super).f() //錯(cuò)誤
????}
}

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


公共(Public)成員

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

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // 正確
      }
   }
   (new Inner).f() // 正確因?yàn)?f() 是 public
}

作用域保護(hù)

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

private[x] 

或 

protected[x]

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

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

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
        }
    }
}

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

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