更新時間:2021-07-16 來源:黑馬程序員 瀏覽量:
IT就到黑馬程序員.gif)
在Scala中,沒有靜態(tài)方法或靜態(tài)字段,所以不能用類名直接訪問類中的方法和字段,而是創(chuàng)建類的實例對象去訪問類中的方法和字段。但是,Scala中提供了object這個關(guān)鍵字用來實現(xiàn)單例模式,使用關(guān)鍵字object創(chuàng)建的對象為單例對象。
創(chuàng)建單例對象的語法格式如下:
object objectName
上述語法格式中,關(guān)鍵字object主要用于創(chuàng)建單例對象;objectName為單例對象的名稱。
下面,創(chuàng)建一個單例對象SingletonObject,代碼如文件1所示。
文件1 Singleton.scala
//單例對象
object SingletonObject {
def hello() {
println("Hello, This is Singleton Object")
}
}
object Singleton {
def main(args: Array[String]) {
SingletonObject.hello()
}
}上述代碼中,第2-4行代碼是創(chuàng)建了一個單例對象SingletonObject,并在該對象中定義了一個方法hello();第8-9行代碼是主方法main(),并在主方法中使用單例對象訪問自己的方法hello()。運(yùn)行上述文件1中的代碼,效果如圖1所示。

圖1 單例對象的運(yùn)行結(jié)果
在Scala中,在一個源文件中有一個類和一個單例對象,若單例對象名與類名相同,則把這個單例對象稱作伴生對象(companion object);這個類則被稱為是單例對象的伴生類(companion class)。類和伴生對象之間可以相互訪問私有的方法和字段。
下面,定義一個伴生對象Dog,演示操作類中的私有方法和字段。具體代碼如文件2所示。
文件2 Dog.scala
class Dog {
val id = 666
private var name = "二哈"
def printName(): Unit ={
//在Dog類中可以訪問伴生對象Dog的私有字段
println(Dog.CONSTANT + name)
}
}
//伴生對象
object Dog{
//伴生對象中的私有字段
private var CONSTANT = "汪汪汪。。。"
//主方法
def main(args: Array[String]): Unit = {
val dog = new Dog
//訪問私有的字段name
dog.name = "二哈666"
dog.printName()
}
}上述代碼中,第1-6行代碼是創(chuàng)建了一個類Dog,并在該類中定義了兩個字段id、name以及一個方法printName();第10-18行代碼是創(chuàng)建一個伴生對象Dog,并在該對象中定義一個字段CONSTANT,在主方法main中,創(chuàng)建Dog類的實例對象,再使用實例對象訪問類中的字段和方法。
運(yùn)行上述文件2中的代碼,效果如圖2所示。

圖2 伴生對象訪問類中方法和字段的運(yùn)行結(jié)果