溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Scala訪問修飾符有哪些

發(fā)布時(shí)間:2021-12-08 15:25:05 來源:億速云 閱讀:150 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Scala訪問修飾符有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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

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

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


私有(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)部類的私有成員。


保護(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 在同一包里。


公共(Public)成員

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

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

作用域保護(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 bobsrocckets{
   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。

“Scala訪問修飾符有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI