Scala 基礎(4)—— 類和物件
1. 類、欄位和方法
Scala 用 class 關鍵字定義類,一旦定義好一個類,就可以使用 new 關鍵字建立物件。
Scala 使用 new 呼叫無參構造器時,可以不使用 (),推薦不使用括號:
class MyClass { // MyClass 的定義 } val a = new MyClass
在類的定義中,可以填入欄位(field)和方法(method),兩者統稱為成員(member)。
欄位保留了物件的狀態,即資料。
方法使用資料執行計算。
使用 var 或者 val 定義欄位,使用 def 定義方法。
為了控制外部對於物件的欄位和方法的訪問,可以給這些加上訪問控制符(private 和 protected),訪問控制符的用法在後面的章節細講。
Scala 的方法和 Java 的方法,有一個顯著的區別,就是方法的入參預設都是 val 型別的。
所以這樣的呼叫是非法的:
def add(b: Byte): Unit = { b = 1 // 不能編譯 }
Java 強制 java 檔案和公有類採用統一名字,Scala 沒有強制這一點,但是仍然推薦和 Java 的相同風格。
2. 單例物件
Scala 沒有 static 關鍵字,在 class 裡面定義的欄位方法都是物件持有的,也就是例項成員。
Scala 有另外辦法去實現靜態成員,就是 object 關鍵字,我們稱這種用 object 關鍵字定義的為單例物件(singleton object)。
object MyClass { // 這裡定義靜態欄位 和 靜態方法 }
當單例物件和某一個類共享同一個名字,稱這個單例物件是這個類的伴生物件(companion object)。同時類又叫這個單例物件的伴生類(companion class)。
必須在同一個檔案中定義類和類的伴生物件。
類和它的伴生物件可以互相訪問私有成員。
沒有同名伴生類的單例物件被稱為孤立物件(standalone object),常用於工具方法。
類和單例物件有一個區別,就是單例物件不接受引數。
單例物件只有在首次被程式碼訪問的時候才初始化。
3. 物件相等性
我們都知道,Java 在判斷兩個物件是否相等時有2個語義:
引用相等:== 操作符
值相等:Object 類的 equals() 方法
而 Scala 在這一方面和 Java 不同
值相等:== 操作符
引用相等:Any 類(所有 Scala 類的超類)的 eq 方法,ne 方法(與 eq 方法結果相反)
def main(args: Array[String]): Unit = { val s = "Hello World!" val s1 = "Hello" val s2 = " World!" println(s == s1 + s2) // true println(s eq s1 + s2) // false println(s ne s1 + s2) // true }
Scala 有一個優勢在於,無論是使用 == 操作符,還是 eq 或是 ne 方法,不需要擔心左側為 null 時丟擲異常。