
- Scala 教程
- Scala - 首頁
- Scala - 概述
- Scala - 特性
- Scala - 環境搭建
- Scala - 構建工具 (SBT)
- Scala - 基本語法
- 資料型別和變數
- Scala - 資料型別
- Scala - 變數
- Scala - 字串
- Scala - 陣列
- Scala 運算子
- Scala - 運算子
- Scala - 算術運算子
- Scala - 關係運算符
- Scala - 邏輯運算子
- Scala - 位運算子
- Scala - 賦值運算子
- Scala 條件語句
- Scala - IF ELSE
- Scala 迴圈語句
- Scala - 迴圈語句
- Scala - while 迴圈
- Scala - do-while 迴圈
- Scala - for 迴圈
- Scala - break 語句
- Scala 類與物件
- Scala - 類與物件
- Scala - 訪問修飾符
- Scala 方法與函式
- Scala - 函式
- Scala - 按名稱呼叫函式
- Scala - 帶命名引數的函式
- Scala - 帶可變引數的函式
- Scala - 遞迴函式
- Scala - 預設引數值
- Scala - 高階函式
- Scala - 巢狀函式
- Scala - 匿名函式
- 部分應用函式
- Scala - 柯里化函式
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 對映
- Scala - 元組
- Scala - 迭代器
- Scala - 選項
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 異常處理
- Scala - 提取器
- Scala - 正則表示式
- Scala 檔案 I/O
- Scala - 檔案 I/O
- Scala 高階概念
- Scala - 閉包
- Scala - 特質
- Scala 有用資源
- Scala - 快速指南
- Scala - 線上編譯器
- Scala - 有用資源
- Scala - 討論
Scala - 類與物件
本章將引導您瞭解如何在 Scala 程式設計中使用類和物件。類是物件的藍圖。定義類後,可以使用關鍵字new從類藍圖建立物件。透過物件,您可以使用已定義類的所有功能。
下圖透過以 Student 類為例演示了類和物件,該類包含成員變數(姓名和學號)和成員方法(setName() 和 setRollNo())。最終,所有這些都是類的成員。類是藍圖,物件是現實。在下圖中,Student 是一個類,Harini、John 和 Maria 是 Student 類的物件,它們都具有姓名和學號。

基本類
以下是定義 Scala 中基本類的簡單語法。此類定義了兩個變數x和y以及一個方法:move,它不返回值。類變數稱為類的欄位,方法稱為類方法。
類名充當類建構函式,它可以接受多個引數。以上程式碼定義了兩個建構函式引數xc和yc;它們在類的整個主體中都可見。
語法
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } }
如本章前面所述,您可以使用關鍵字new建立物件,然後可以訪問類欄位和方法,如下面的示例所示:
示例
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } object Demo { def main(args: Array[String]) { val pt = new Point(10, 20); // Move to a new location pt.move(10, 10); } }
將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。
命令
\>scalac Demo.scala \>scala Demo
輸出
Point x location : 20 Point y location : 30
擴充套件類
您可以擴充套件基本 Scala 類,並且可以像在 Java 中一樣設計繼承類(使用extends關鍵字),但有兩個限制:方法重寫需要override關鍵字,並且只有主建構函式可以將引數傳遞給基建構函式。讓我們擴充套件我們上面的類並新增另一個類方法。
示例
讓我們以兩個類 Point 類(與上面相同的示例)和 Location 類為例,Location 類使用 extends 關鍵字繼承類。這樣的“extends”子句有兩個作用:它使 Location 類繼承 Point 類中的所有非私有成員,並且它使型別Location成為型別Point類的子型別。所以這裡 Point 類稱為超類,類Location稱為子類。擴充套件類並繼承父類的所有功能稱為繼承,但 Scala 僅允許從一個類繼承。
注意- Point 類中的 move() 方法和Location 類中的 move() 方法沒有覆蓋 move 的相應定義,因為它們是不同的定義(例如,前者接受兩個引數,而後者接受三個引數)。
嘗試以下示例程式來實現繼承。
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("Point x location : " + x); println ("Point y location : " + y); println ("Point z location : " + z); } } object Demo { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // Move to a new location loc.move(10, 10, 5); } }
將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。
命令
\>scalac Demo.scala \>scala Demo
輸出
Point x location : 20 Point y location : 30 Point z location : 20
隱式類
隱式類允許在類在範圍內時使用類的主要建構函式進行隱式轉換。隱式類是在類中使用“implicit”關鍵字標記的類。此功能是在 Scala 2.10 中引入的。
語法- 以下是隱式類的語法。這裡隱式類始終位於物件範圍內,其中允許所有方法定義,因為隱式類不能是頂級類。
語法
object <object name> { implicit class <class name>(<Variable>: Data type) { def <method>(): Unit = } }
示例
讓我們以一個名為IntTimes的隱式類為例,其中包含方法 times()。這意味著 times() 包含一個迴圈事務,該事務將執行給定語句指定的次數。假設給定語句是“4 times println (“Hello”)”,這意味著 println (“”Hello”) 語句將執行 4 次。
以下是給定示例的程式。在此示例中使用了兩個物件類(Run 和 Demo),因此我們必須將這兩個類儲存到不同的檔案中,並分別使用以下名稱命名。
Run.scala- 將以下程式儲存到 Run.scala 中。
object Run { implicit class IntTimes(x: Int) { def times [A](f: =>A): Unit = { def loop(current: Int): Unit = if(current > 0){ f loop(current - 1) } loop(x) } } }
Demo.scala- 將以下程式儲存到 Demo.scala 中。
import Run._ object Demo { def main(args: Array[String]) { 4 times println("hello") } }
以下命令用於編譯和執行這兩個程式。
命令
\>scalac Run.scala \>scalac Demo.scala \>scala Demo
輸出
Hello Hello Hello Hello
注意-
隱式類必須定義在另一個類/物件/特質中(而不是在頂級)。
隱式類在其建構函式中只能接受一個非隱式引數。
隱式類不能是範圍內與隱式類同名的任何方法、成員或物件。
單例物件
Scala 比 Java 更面向物件,因為在 Scala 中,我們不能擁有靜態成員。相反,Scala 具有單例物件。單例是一個只能有一個例項的類,即物件。您可以使用關鍵字object而不是 class 關鍵字來建立單例。由於您不能例項化單例物件,因此您不能將引數傳遞給主建構函式。您已經看到了所有使用單例物件的示例,其中您呼叫了 Scala 的 main 方法。
以下是實現單例的相同示例程式。
示例
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy } } object Demo { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("Point x location : " + point.x); println ("Point y location : " + point.y); } } }
將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。
命令
\>scalac Demo.scala \>scala Demo
輸出
Point x location : 10 Point y location : 20