Scala 基礎(4)—— 類和對象

1. 類、字段和方法java

Scala 用 class 關鍵字定義類,一旦定義好一個類,就能夠使用 new 關鍵字建立對象。工具

Scala 使用 new 調用無參構造器時,能夠不使用 (),推薦不使用括號:spa

class MyClass {
  // MyClass 的定義
}

val a = new MyClass

 

在類的定義中,能夠填入字段(field)和方法(method),二者統稱爲成員(member)。對象

字段保留了對象的狀態,即數據。blog

方法使用數據執行計算。it

使用 var 或者 val 定義字段,使用 def 定義方法。io

爲了控制外部對於對象的字段和方法的訪問,能夠給這些加上訪問控制符(private 和 protected),訪問控制符的用法在後面的章節細講。編譯

 

Scala 的方法和 Java 的方法,有一個顯著的區別,就是方法的入參默認都是 val 類型的。class

因此這樣的調用是非法的:object

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 時拋出異常。

相關文章
相關標籤/搜索