Scala Class etc.

来源:https://www.cnblogs.com/yuanzam/archive/2019/09/29/11610109.html
-Advertisement-
Play Games

Classes 一個源文件可包含多個類,每個類預設都是 public 類欄位必須初始化,編譯後預設是 private,自動生成 public 的 getter/setter ; "Person 示例" 欄位,生成 private 的 getter/setter 欄位,只生成 getter 欄位,不生 ...


Classes

  • 一個源文件可包含多個類,每個類預設都是 public
  • 類欄位必須初始化,編譯後預設是 private,自動生成 public 的 getter/setter ;Person 示例
    • private 欄位,生成 private 的 getter/setter
    • val 欄位,只生成 getter
    • private[this] 欄位,不生成 getter/setter
    • 自定義 getter/setter,foo 和 foo_=
  • 類方法預設都是 public
  • 方法調用規約:訪問器調用可省略括弧,修改器調用加上括弧
  • 為欄位加上 @bean.BeanProperty 註解可生成符合 JavaBean 規範的 get/set 方法(加上預設的兩個方法,共四個方法)
  • 構造器:1 個主構造器,任意個輔構造器
    • 全部都叫 this,只是參數不同
    • 輔構造器必須調用主構造器或之前定義的輔構造器
    • 主構造器與類定義密不可分,參數直接定義在類名後
    • 主構造器會立即執行類定義中的所有語句
    • 主構造器中的參數被方法使用到,則對應的參數等價於 private[this] val 欄位
  • 內部類
    • 路徑依賴,不同於 Java 內部類,同一類 A 的不同實例(a1, a2)構建的內部類 Inner,其類型是不同的,a1.Inner != a2.Inner
    • 解決路徑依賴
      • 類型投射,Outer#Inner
      • 將內部類放到伴生對象 object 中
    • self => 自身類型,區分調用的內部類和外部類的欄位、方法等

Objects

  • 用於單例及工具類方法
    • object 構造器只在第一次被調用時執行
  • 可繼承一個 class 或多個 trait
    • 可用於全局預設對象
  • 不可提供構造器參數
  • 伴生對象
    • 與類名稱一致
    • 類與伴生對象可互相訪問私有資源,但區分作用域,如 Accounts.newUniqueNumber() 而不是 newUniqueNumber()
    • 類與伴生對象必須在同一個源文件中
  • 伴生對象中的 apply 方法
    • 調用方式 Object(arg1, ..., argN), 返回伴生類的實例,如 Array(1,2,3)
    • 省略 new 關鍵字,在嵌套表達式中很方便
  • 應用對象
    • extends App
    • 不需要 main 方法直接執行構造器內的代碼
  • scala 預設無枚舉類型
    • 使用 Enumeration 幫助類實現
    • 枚舉類型為 Enumeration.Value(ID, name) 內部類, ID 依次累加, 預設 0 開始;name 預設是欄位名

Traits

  • 替代 Java 中的介面
  • 可以有抽象的和具體的方法
    • trait 中未實現的方法預設是抽象的 (abstract)
  • 類可以實現多個 trait,從最後一個開始調用
    • 使用 extends 關鍵字實現
    • 覆蓋抽象方法時不需要 override 關鍵字
    • 有多個 trait 則對其他的 trait 使用 with 關鍵字
  • 所有的 Java 介面都可以被當做 trait 使用
  • 對象也可以添加多個 trait,從最後一個開始調用
  • 多個 trait 的情況下,super.someMethod 會根據從右向左的順序調用下一個 trait 的方法
    • 具體調用依賴於使用時的順序,相比傳統的繼承更靈活
    • 在多個 mix-in 的情況下,如果父trait存在抽象方法,則子trait需使用 abstract override 關鍵字,否則 super.someMethod 無法編譯
  • 有初始值的欄位/具體欄位,都會被添加到子類中
  • 無初始值的欄位/抽象欄位,在非抽象子類中,需要進行初始化
  • trait 也有構造器
    • 不可以有構造參數,且只有一個構造器
    • 由定義體中的初始化欄位和其他語句構成
    • 構造順序:父類 > 各trait從左向右,有父 trait 的先構造,共用的父 trait 只構造一次 > 子類
    • 考慮到構造順序,如果子類中使用抽象欄位,則可使用提前定義(early definition,會在構造器之前執行)的語法講改欄位初始化
      • 提前定義語句塊中只能使用欄位定義語句,不可使用其他語句
  • trait 可繼承類,混入該 trait 的類都是被繼承類的子類,子類如果有繼承其他的類也必須是被繼承類的子類
  • 與自身類型(self type)比較
    • trait 不繼承類,直接在 body 內定義 this: Type =>,則混入的類必須是該 Type 類型的/子類型的
    • 也可使用結構類型(structural type),this: { def log(msg: String) } => ,則混入的類必須包含結構類型中定義的方法
  • trait 最終會翻譯成類和介面

Packages and Imports

  • package 包名和文件路徑並不一定對應
  • java.lang, scala, Predef 始終預設會導入
  • 與 Java 不同,包路徑並不是絕對的,如 collection.mutable 實際是 scala.collection.mutable
  • package a.b.cpackage a { package b { package c {}}} 不同
    • package apackage b 中定義的資源可在帶括弧的包聲明中訪問,但 package a.b.c 無法訪問
  • 包對象
    • package 由於 JVM 的限制不能直接聲明函數或變數
    • 不同於 package, package object 可定義工具函數或常量
  • 可見性控制,通過 private[package.name] 限制資源的可見性
  • import
    • 導入包後可使用相對路徑訪問類等,如 collection.mutable
    • 導入所有資源 import collection.mutable._
    • 可在任意位置進行導入操作
    • selector
      • 選擇性的導入一部分成員,import java.awt.{Color, Font}
      • 為導入成員取別名:import java.util.{HashMap => JavaMap}
      • 隱藏成員: import java.util.{HashMap => _, _} // 避免產生混淆
    • 隱式導入,預設導入三個 java.lang, scalaPredef
      • 後面導入的可將前面的成員覆蓋,避免衝突
      • 導入 scala 相關的包可省略 scala 路徑

Inheritance

fragile base class 基類被繼承之後,修改基類可能會對子類造成無法預期的影響

  • 繼承類,與 Java 一樣使用 extends 關鍵字
    • final 類不能被繼承, final 欄位、方法不能被覆蓋
  • 覆蓋非抽象方法,必須使用 override 關鍵字
  • 抽象方法
    • 無方法體的方法,可以省略 abstract 關鍵字;子類覆蓋時也可以省略 override
  • 抽象欄位
    • 無初始值的欄位,可省略 abstract 關鍵字,子類覆蓋式也可省略 override
  • 調用父類方法,使用 super 關鍵字
  • 類型檢查和轉換, isInstanceOf, asInstanceOf;獲取類型, classOf
    • 模式匹配通常是個更好的類型檢查方式
  • protected 不同於 Java,受保護成員在包內不可見
  • 輔助構造器不可直接調用超類構造器
    • 可在定義類時直接在 extends 時調用超類構造器並傳遞參數
    • 繼承 Java 類時主構造器必須調用超類的構造器
  • 覆蓋欄位
    • def 只能覆蓋 def
    • val 只能覆蓋 無參數的 def
    • var 只能覆蓋 抽象的 var
  • 繼承層級

    file
    • Any 定義了 asInstanceOf, isInstanceOf,判斷相等,hash值等方法
    • AnyRef 是除基礎類型外所有類的父類,等價於 java.lang.Object
      • 提供方法 wait, notify/notifyAllsynchronized
    • AnyVal 不包含任何方法,只是個值類型的標記
    • 所有 Scala 類都實現了 ScalaObject 這個標記介面,該介面無任何方法
    • Null 的唯一實例 null,可分配給引用類型,但不可分配給值類型(Int 不可為 null)
    • Nothing 無實例,在泛型構造時有用,Nil 類型為 List[Nothing]
    • ??? 方法聲明返回類型為 Nothing, 無返回值,會拋出 NotImplementedError,用於預留未實現的方法
    • Unit 代表空/void,類型唯一值為 ()
    • 如果方法參數類型為 AnyAnyRef, 當傳遞多個參數時,會被替換為 tuple
  • equalshashCode 判斷對象相等
    • 可使用模式匹配實現 equals
    • equals 參數類型為 Any 而不是具體的類型
    • ##hashCode 的安全版本,遇到 null 會返回 0 而不是拋出異常
  • 值類 Value Class
    • 繼承 AnyVal
    • 主構造器只有一個參數 val,無構造體
    • 無其他構造器和欄位
    • 自動提供的 equalshashCode 比較實際值
    • 用於隱式轉換
      • 其他用途,如 class a(x: Int, y: Int) 設計為 class a(x: X, y: Y) ,定義值類 X, Y 避免混淆參數

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

-Advertisement-
Play Games
更多相關文章
  • 一、使用限定註解;二、自定義限定註解;三、自定義bean的生命周期; ...
  • 慢查詢原因分析 由於 Redis 是單線程的,它內部維護了一個命令隊列,所以當有耗時的命令出現時,比如 ,後面的命令會被阻塞,通查查出慢查詢可以對服務進一步優化。 1. 設置慢查詢閥值:預設10 毫秒,以微秒為單位 6379 config set slowlog log slower than 10 ...
  • Spring Secutity和Apache Shiro是Java領域的兩大主流開源安全框架,也是許可權系統設計的主要技術選型。本文主要介紹Spring Secutity的實現原理,並基於Spring Secutity設計基於RBAC的許可權系統。 ...
  • 新聞 "宣告F 4.7" "宣告.NET Core 3.0" ".NET Core 3.0中ASP.NET Core與Blazor的更新" ".NET Conf 2019里提到的ML.NET與模型構建器" "參與.NET基金會的成熟度模型試點" "設置HTTP header屬性使Azure認證/授權 ...
  • 為什麼為有集群 在 Redis3 版本之前,每台 Redis 機器需要存儲所有 Redis key ,這要求每台 Redis 機器有足夠大的記憶體 而且只能是主節點寫,從節點讀,對於高併發情況下會有性能瓶頸 雖然有哨兵模式來保證服務的高用,但是切換主節點還是需要時間的(實測) 分散式資料庫 分散式數據 ...
  • 下載地址及版本說明 Redis 各版本下載地址: "http://download.redis.io/releases/" 版本說明:一般來說版本號第二位,偶數是穩定版本,奇數是在開發中的版本 本文基於Redis 版本為: 理論依據文章為: "https://blog.csdn.net/sanri1 ...
  • "題目鏈接" problem 給出一棵有邊權的樹。一條鏈的權值定義為該鏈所經過的邊的邊權值和。需要選出$m$條鏈,求$m$條鏈中權值最小的鏈的權值最大是多少。 solution 首先顯然二分。 然後考慮如何判斷二分出來的一個答案$x$是否是可行的。也就是能否選出$m$條鏈,每條鏈權值都大於等於$x$ ...
  • 以前的數據分析項目(版本1.4.2),對從 讀取的原始數據流,調用 介面實現分流. 新項目決定使用 ,使用 介面進行分流的時候,發現介面被標記為 (後續可能會被移除). 搜索相關文檔,發現新版本 中推薦使用帶外數據進行分流. 預先建立 實例( 是從 讀取的日誌實例類). 對 讀取的原始數據,通過 接 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...