scala學習手記10 - 訪問修飾符

来源:http://www.cnblogs.com/amunote/archive/2016/06/13/5582303.html
-Advertisement-
Play Games

scala的訪問修飾符有如下幾個特性: 如果不指定訪問修飾符,scala預設為public; 較之Java,scala對protected的定義更加嚴格; scala可以對可見性進行細粒度的控制。 scala的預設訪問修飾符 如果沒有修飾符,scala會預設把類、欄位、方法的訪問修飾符當做publi... ...


scala的訪問修飾符有如下幾個特性:

  • 如果不指定訪問修飾符,scala預設為public;
  • 較之Java,scala對protected的定義更加嚴格;
  • scala可以對可見性進行細粒度的控制。

scala的預設訪問修飾符

如果沒有修飾符,scala會預設把類、欄位、方法的訪問修飾符當做public。如果要將之調整為private或protected,只需在前面添加對應的修飾符關鍵字即可。就如下麵的程式:

class Microwave{
  def start() = println("started")
  def stop() = println("stopped")
  private def turnTable() = println("turning table")
}
val microwave = new Microwave
microwave.start()
microwave.turnTable()//這裡錯了

在上面的代碼里start和stop兩個方法被定義為public類型,可以通過任意Microwave實例訪問;turnTable被顯示定義為private,這樣就不能在Microwave類外部訪問它。執行這段代碼,就會如註釋處聲明的一樣,會在該處報錯:

image

protected修飾符

在scala里,用protected修飾的成員只對本類和派生類可見,同一個包內的其他的類不可見。而且派生類只可以訪問本類實例的protected成員。可以通過一個例子看一下:

package com.zhyea.scala.autos

/**
  * Created by robin on 2016/6/12.
  */
class Vehicle {
  protected def checkEngine() = println("checked engine")
}


class Car extends Vehicle {

  def start() {checkEngine()}

  def tow(car : Car) {
    car.checkEngine()
  }

  def tow(vehicle: Vehicle){
    vehicle.checkEngine()//會報錯
  }
}


class GasStation{
  def fillGas(vehicle : Vehicle){
    vehicle.checkEngine()//會報錯
  }

}

編譯這段代碼會報錯:

image

在這段代碼里,Vehicle的checkEngine()方法是protected型的。scala允許我們通過Vehicle的派生類Car的實例方法(start())訪問這個方法,也允許我們在Car的實例方法里通過Car的實例來訪問這個方法,但是不允許在Car的實例方法里用Vehicle的實例訪問checkEngine()方法,同一包內的其他類也不行。(好繞,不過真是保護到了極致:只輸出方案不輸出資源,狗腿子軍師)

細粒度訪問控制

一方面scala對待protected比Java更加嚴格,另一方面它提供了更多的靈活性和更細粒度的訪問規則。

private和protected可以指定額外的參數。這樣,現在可以使用private[AccessQualifier],AccessQualifier可以是this,也可以是其它的類名或包名。這樣就可以這麼理解:這個成員對所有類都是private,除了自己和AccessQualifier所表示範圍內的類。這個概念也是可以遞推的,也就是說,如果AccessQualifier是一個類,那麼private成員對於AccessQualifier的AccessQualifier也是可見的。

看一個細粒度訪問控制的例子:

/**
  * Created by robin on 2016/6/13.
  */
package society {

  package professional {

    class Executive {
      private[professional] var workDetails = null
      private[society] var friends = null
      private[this] var secret = null

      def help(another: Executive) {
        println(another.workDetails)
        println(this.secret)
        println(another.secret) //會報錯
      }
    }

  }

  package social {

    class Acquaintance {
      def socialize(person: professional.Executive) {
        println(person.friends)
        println(person.workDetails) //會報錯
      }
    }

  }
}

這段代碼裡面有一個嵌套包的使用:可以看到,在society包里又聲明瞭professional和social兩個包。而且使用包的方式也和之前不一樣,之前使用的是點號分隔,文件頭聲明的方式。

在類Executive的定義中,三個私有成員變數有著不同的作用範圍。workDetails對包professional內的類可見,friends對society包內的類可見,而secret只對當前實例可見。

所以編譯這段代碼,在標記報錯的地方會報錯:

image

secret只對當前實例this可見,對Executive的其他實例不可見。workDetails對包professional內的類可見,對society包內的類不可見。因此會報錯。

##########


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 為什麼需要鎖(併發控制)? 在多用戶環境中,在同一時間可能會有多個用戶更新相同的記錄,這會產生衝突。這就是著名的併發性問題。 典型的衝突有: 丟失更新:一個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如:用戶A把值從6改為2,用戶B把值從2改為6,則用戶A丟失了他的更新。 臟讀: ...
  • 每次用到mysql_connect連接資料庫的時候都會提示: 作為一個高要求高完美的男人,實在受不了這提示。躲著他也不行——解決他心裡的小石頭才能碎掉 那麼就先學習下使用Mysqli操作資料庫: 1. 與Mysql資料庫交互時,首先要建立連接,最後要斷開連接,這包括與伺服器連接並選擇一個資料庫,以及 ...
  • 好久沒翻譯simple java了,睡前來一發。譯文鏈接:http://www.programcreek.com/2014/01/java-serialization/ 什麼是對象序列化 在Java中,對象序列化指的是將對象用位元組序列的形式表示,這些位元組序列包含了對象的數據和信息,一個序列化後的對象 ...
  • 如果你伺服器環境允許yum,安裝MySQL-python模塊就很簡單了。 如果直接安裝不行,先 安裝MySQL-devel後正常運行 yum install mysql-devel yum install MySQL-python -y 1 yum install MySQL-python -y 當 ...
  • 這裡首先有一個問題要考慮的是,這類方法是否要被測試? 理論上,這類方法都會被其它public類型的方法調用,只要對那些public的方法做充分的測試,就可以保證這些方法的可靠性,就沒有必要再測了。好像是有道理的。 我們先看看好的單元測試的原則:(ATRIP) 自動化(Automatic) 徹底(Th ...
  • 使用repalceAll 方法出現java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0異常 代碼如下: 以junit測試方式運行後報瞭如下錯誤: java.util.regex.Pattern ...
  • PHP 的真正威力源自於它的函數。 在 PHP 中,提供了超過 1000 個內建的函數。 在本章中,我們將為您講解如何創建自己的函數。 如要在頁面載入時執行腳本,您可以把它放到函數里。 函數是通過調用函數來執行的。 你可以在頁面的任何位置調用函數。 創建 PHP 函數 函數是通過調用函數來執行的。 ...
  • python3登錄極路由並讀取寬頻帳號帳號密碼,fiddler抓包分析過程略... 步驟:1、登錄路由,提取stok。 2、用stok拼成url,post請求 3、解析json數據 代碼: qpython3中包含了requests庫,所以也可以在手機上運行。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...