類由類成員(如字段和方法)組成。
字段保存對象的狀態(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的字段。
如果構(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ù)列表。
如果構(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 )
}
}
您可以將 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 )
當(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ù),以提供創(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ù)之一。
更多建議: