更新時(shí)間:2021-07-16 來(lái)源:黑馬程序員 瀏覽量:
在Scala中,沒(méi)有靜態(tài)方法或靜態(tài)字段,所以不能用類名直接訪問(wèn)類中的方法和字段,而是創(chuàng)建類的實(shí)例對(duì)象去訪問(wèn)類中的方法和字段。但是,Scala中提供了object這個(gè)關(guān)鍵字用來(lái)實(shí)現(xiàn)單例模式,使用關(guān)鍵字object創(chuàng)建的對(duì)象為單例對(duì)象。
創(chuàng)建單例對(duì)象的語(yǔ)法格式如下:
object objectName
上述語(yǔ)法格式中,關(guān)鍵字object主要用于創(chuàng)建單例對(duì)象;objectName為單例對(duì)象的名稱。
下面,創(chuàng)建一個(gè)單例對(duì)象SingletonObject,代碼如文件1所示。
文件1 Singleton.scala
//單例對(duì)象 object SingletonObject { def hello() { println("Hello, This is Singleton Object") } } object Singleton { def main(args: Array[String]) { SingletonObject.hello() } }上述代碼中,第2-4行代碼是創(chuàng)建了一個(gè)單例對(duì)象SingletonObject,并在該對(duì)象中定義了一個(gè)方法hello();第8-9行代碼是主方法main(),并在主方法中使用單例對(duì)象訪問(wèn)自己的方法hello()。
運(yùn)行上述文件1中的代碼,效果如圖1所示。
圖1 單例對(duì)象的運(yùn)行結(jié)果
在Scala中,在一個(gè)源文件中有一個(gè)類和一個(gè)單例對(duì)象,若單例對(duì)象名與類名相同,則把這個(gè)單例對(duì)象稱作伴生對(duì)象(companion object);這個(gè)類則被稱為是單例對(duì)象的伴生類(companion class)。類和伴生對(duì)象之間可以相互訪問(wèn)私有的方法和字段。
下面,定義一個(gè)伴生對(duì)象Dog,演示操作類中的私有方法和字段。具體代碼如文件2所示。
文件2 Dog.scala
class Dog { val id = 666 private var name = "二哈" def printName(): Unit ={ //在Dog類中可以訪問(wèn)伴生對(duì)象Dog的私有字段 println(Dog.CONSTANT + name) } } //伴生對(duì)象 object Dog{ //伴生對(duì)象中的私有字段 private var CONSTANT = "汪汪汪。。。" //主方法 def main(args: Array[String]): Unit = { val dog = new Dog //訪問(wèn)私有的字段name dog.name = "二哈666" dog.printName() } }
上述代碼中,第1-6行代碼是創(chuàng)建了一個(gè)類Dog,并在該類中定義了兩個(gè)字段id、name以及一個(gè)方法printName();第10-18行代碼是創(chuàng)建一個(gè)伴生對(duì)象Dog,并在該對(duì)象中定義一個(gè)字段CONSTANT,在主方法main中,創(chuàng)建Dog類的實(shí)例對(duì)象,再使用實(shí)例對(duì)象訪問(wèn)類中的字段和方法。
運(yùn)行上述文件2中的代碼,效果如圖2所示。
圖2 伴生對(duì)象訪問(wèn)類中方法和字段的運(yùn)行結(jié)果
Scala的控制結(jié)構(gòu)語(yǔ)句有哪幾種?
Shell如何實(shí)現(xiàn)定時(shí)采集數(shù)據(jù)到HDFS?
2021-07-16try-except語(yǔ)句與else子句聯(lián)合使用處理可能出現(xiàn)的程序異常
2021-07-16Python開(kāi)發(fā)環(huán)境下如何處理程序異常?
2021-07-16如何使用類方法??jī)煞N類的操作方法介紹
2021-07-14什么是匿名函數(shù)?它與普通函數(shù)有哪些不同?
2021-07-14怎樣在Mac OS平臺(tái)安裝Python開(kāi)發(fā)環(huán)境?【python安裝】
2021-07-13