在Scala中object相當于class的單個實例,通常在里面放一些靜態的field或者method,第一次調用object的方法時執行object的constructor,也就是object內部不在method中的代碼;但是object不能定義接受參數的constructor。
object的constructor只會在其第一次被調用時執行一次,以后再次調用就不會再次執行constructor了。object通常用于作為單例模式的實現,或者放class的靜態成員,比如工具方法。
object
/**
* Human對象
*/
object Human{
...
}
伴生對象
與class同名的object,那么object是class的伴生對象,class是object的伴生類。伴生類和伴生對象必須存放在一個.scala文件之中。伴生類和伴生對象最大的特點就在互相可以訪問private field。
object Human{
...
}
class Human(val skin:String,val lang:String){
}
object 繼承抽象類
object的功能其實和class類似,除了不能定義接受參數的constructor之外object也可以繼承抽象類,并覆蓋抽象類中的方法。
abstract class Human(val skin:String,val lang:String){
def work():Unit
}
object YellowRace extends Human("黃色","漢語"){
override def work() = {
...
}
}
apply方法
object中非常重要的一個特殊方法,就是apply方法,通常在伴生對象中實現apply方法,并在其中實現構造伴生類的對象的功能。在創建伴生類的對象時,通常不會使用new Class的方式,而是使用Class()的方式,隱式地調用伴生對象得apply方法,這樣會讓對象創建更加簡潔。
object YellowRace extends Human("黃色","漢語"){
override def work() = {
...
}
def apply() = new YellowRace("黃色","漢語")
}
用object實現枚舉功能
Scala沒有直接提供類似于Java中的Enum這樣的枚舉特性,如果要實現枚舉,則需要用object繼承Enumeration類,并且調用Value方法來初始化枚舉值。
定義枚舉類
object Skin extends Enumeration{
val YELLOW,WHITE,BLACK,BROWN = Value
}
枚舉類的使用
使用枚舉類.枚舉值的方式進行使用。
Skin.YELLOW
main方法
如同在java中一樣,運行一個程序必須編寫一個包含main方法。在scala中如果要運行一個應用程序必須有一個main方法作為入口。scala中的main方法定義為def main(args: Array[String]),而且必須定義在object中。
object YellowRace extends Human("黃色","漢語"){
override def work() = {
...
}
def apply() = new YellowRace("黃色","漢語")
def main(args : Array[String]) : Unit = {
val p = YellowRace()
p.intro("馬來西亞")
p.foreign("英語", "法語")
}
}