Scala 構(gòu)造函數(shù)

2022-05-13 15:15 更新

類由類成員(如字段和方法)組成。

字段保存對象的狀態(tài),并使用 val var 定義。

方法完成對象的計算任務(wù),并使用定義關(guān)鍵字 def

在Scala中,類的整個主體是構(gòu)造函數(shù)。

如果構(gòu)造函數(shù)采用零參數(shù),則可以省略參數(shù)列表。

Scala區(qū)分用val字段,var字段,private val或private var聲明的構(gòu)造函數(shù)和沒有varor val的字段。

參數(shù)聲明為val

如果構(gòu)造函數(shù)參數(shù)聲明為val,Scala只為它生成一個getter方法。

讓我們聲明一個字段為val,如下所示:

class Book( val title:String)

因為構(gòu)造函數(shù)字段被定義為一個val,所以該字段的值是不可變的。因此,Scala只生成getter方法,沒有setter方法。

object Main {
  def main(args: Array[String]) {
    class Book( val title:String)
    val book = new Book("Scala")

    println(book);
    println(book.title )
    //book.title = "new title"  //Error
  }
}

在Scala中,如果構(gòu)造函數(shù)或方法采用零參數(shù),則可以省略參數(shù)列表。

參數(shù)聲明為var

如果構(gòu)造函數(shù)參數(shù)聲明為var,Scala將生成訪問器和mutator方法。

class Book( var title:String)

所以當(dāng)你設(shè)置字段時,像這樣

book.title("new title")

我們可以改變Book對象的字段,因為它是用關(guān)鍵字var聲明的。

object Main {
  def main(args: Array[String]) {
    class Book( var title:String)
    val book = new Book("Beginning Scala")
    book.title = "new title"
    println(book.title )
  }
}

參數(shù)聲明為私有val或var

您可以將 private 關(guān)鍵字添加到 val var 字段,以防止getter和setter方法生成。

在這種情況下,字段只能從類的成員內(nèi)訪問:

class Book(private var title: String) {
    def printTitle {
       println(title)
    }
}

val book = new Book("Beginning Scala")
println(book.printTitle )

參數(shù)聲明沒有val或var

當(dāng)在構(gòu)造函數(shù)參數(shù)上未指定val和var時,Scala不生成getter或setter。

正如你在這里可以看到的,你不能訪問書的字段標(biāo)題。

class Book(title: String)
val book = new Book("Beginning Scala")
//book.title //Error

例子

這里是Book類,一個名為title的構(gòu)造函數(shù)參數(shù),默認(rèn)值為“Scala”。

因為參數(shù)使用默認(rèn)值定義,您可以調(diào)用構(gòu)造函數(shù)而不指定標(biāo)題值:

class Book (val title: String = "Scala")
val book = new Book
book.title

您還可以在創(chuàng)建新圖書時指定所選的標(biāo)題值:

val book = new Book("new title")
book.title

您還可以選擇提供命名參數(shù),如以下代碼所示:

val book = new Book(title="Beginning Scala")
book.title

輔助構(gòu)造函數(shù)

我們可以為類定義一個或多個輔助構(gòu)造函數(shù),以提供創(chuàng)建對象的不同方法。

輔助構(gòu)造函數(shù)通過創(chuàng)建名為this的方法來定義。

我們可以定義多個輔助構(gòu)造函數(shù),但它們必須有不同的簽名。

每個輔助構(gòu)造函數(shù)必須以對先前定義的構(gòu)造函數(shù)的調(diào)用開始。

以下代碼說明了一個主構(gòu)造函數(shù)和兩個輔助構(gòu)造函數(shù)。

class Book (var title :String, var ISBN: Int) {
    def this(title: String) {
        this(title, 2222)
    }
    def this() {
        this("CSS")
        this.ISBN = 1111
    }
    override def toString = s"$title ISBN- $ISBN"
}

給定這些構(gòu)造函數(shù),可以通過以下方式創(chuàng)建同一本書:

val book1 = new Book
val book2 = new Book("Clojure")
val book3 = new Book("Scala", 3333)

輔助構(gòu)造函數(shù)只需要調(diào)用先前定義的構(gòu)造函數(shù)之一。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號