scala-面向對象編程之對象

object

object相當於class的單個實例,通常在裏面放一些靜態的field或者method。第一次調用object的方法時就會執行object的constructor,也就是object內部不在method裏的代碼。但是object不能定義接受參數的constructor。

注意,object的constructor只會在第一次被調用時執行一次,以後再次調用就不會再執行constructor了。

object通常用於作爲單例模式的實現,或者放class的靜態成員,比如工具方法。

object Person {
private var eyeNum = 2
println("this Person Object!")
def getEyeNum = eyeNum
}

scala> Person.getEyeNum
this Person Object!
res0: Int = 2

伴生對象

如果有一個class,還有一個與class同名的object,那麼就稱這個object是class的伴生對象,class是object的伴生類

伴生類和伴生對象必須放在同一個.scala文件中

伴生類和伴生對象最大的特點在於,可以相互訪問private field

class Person(val name:String, val age:Int) {
def sayHello = println("Hi," + name + ",I guess you are " + age + "years old!" + "and you must have " + Person.eyeNum + "eyes")
}
object Person {

private val eyeNum = 2
def getEyeNum = eyeNum
}


scala> var p = new Person("wei", 30)
p: Person = Person@75f8d9b0

scala> p.sayHello
Hi,wei,I guess you are 30years old!and you must have 2eyes

讓object繼承抽象類

object的功能其實與class類似,除了不能定義接受參數的constructor之外

object也可以繼承抽象類,覆蓋抽象類中的方法

abstract class Hello(var message:String){
def sayHello(name:String):Unit
}
object HelloImpl extends Hello("Hello"){
override def sayHello(name:String)={
println(message + "," + name)
}
}

scala> HelloImpl.sayHello("wei")
Hello,wei

apply方法

object中非常重要的一個特殊方法,就是apply方法

通常在伴生對象中實現apply方法,並在其中實現構造伴生類的對象的功能。

而創建伴生類的對象時,通常不會使用new Class的方式,而使用Class()的方式,隱式的調用伴生對象的apply方法,這樣會讓對象創建更加簡潔。

比如Array類的伴生對象的apply方法就實現了接受可變數量的參數,並創建一個Array對象的功能。

val a = Array(1,2,3)

比如定義自己的伴生類和伴生對象

class Person(val name:String)
object Person {
def apply(name:String) = new Person(name)
}

scala> var p = Person("wei")
p: Person = Person@39a03ccc

main方法

就如同java中,如果要運行一個程序,必須編寫一個包含main方法類一樣;在scala中,如果要運行一個應用程序,那麼必須有一個main方法,作爲入口。

scala中main方法定義爲def main(args:Array[String]),而且必須定義在object中

object HelloWorld {
def main(args:Array[String]){
println("Hello world!!")
}
}

除了自己實現main方法外,還可以繼承 App Trait,然後再將需要在main函數中運行的代碼,直接作爲object的constructor代碼,而且用args可以接受傳入的參數。

object HelloWorld extends App{
if (args.length>0) println("hello" + args(0))
else println("Hello world!")
}

用object來實現枚舉功能

scala沒直接提供類似於java中的Enum這樣的枚舉特性,如果要實現枚舉,則需要用object繼承Enumeration類,並且調用Value方法來初始化枚舉值

object Season extends Enumeration{
val SPRING, SUMMER, AUTUMN, WINTER=Value
}

scala> Season.SPRING
res0: Season.Value = SPRING

還可以通過Value傳入枚舉值的id和name,通過id和toString可以獲取;還可以通過id和name來查找枚舉值

object Season extends Enumeration {
val SPRING = Value(0,"spring")
val SUMMER = Value(1, "summer")
val AUTUMN = Value(2, "autumn")
val WINTER = Value(3, "winter")
}

scala> Season.SPRING.id
res3: Int = 0

scala> Season.SPRING.toString
res4: String = spring

scala> Season(0)
res1: Season.Value = spring

scala> Season.withName("spring")
res2: Season.Value = spring

使用枚舉object.values可以遍歷枚舉值


scala> for (ele <- Season.values) println(ele)
spring
summer
autumn
winter
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章