1. 程式人生 > >Scala入門系列(六):面向對象之object

Scala入門系列(六):面向對象之object

所有 name 應用 eight lac box dfa port clas

object

object相當於class的單個實例,類似於Java中的static,通常在裏面放一些靜態的field和method。

第一次調用object中的方法時,會執行object的constructor,也就是object內部不在method或者代碼塊中的所有代碼,但是object不能定義接受參數的constructor

註意:object的構造函數只會在第一次被調用時被執行一次,這點類似Java類中static的初始化。

object Person {   private var eyeNum = 2   println("this Person object"
) def getEyeNum = eyeNum } defined module Person // 第一次調用會初始化 scala> Person.getEyeNum this Person object res14: Int = 2 // 第二次都沒有再執行初始化 scala> Person.getEyeNum res15: Int = 2

伴生對象、伴生類

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

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

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

object Person{   private val eyeNum = 2   def getEyeNum = eyeNum } class Person(val name: String, val age: Int){   def sayHello = println("Hi," + name + ", I guess you must have " + Person.eyeNum + " eyes.") // 訪問同名object私有字段 }  defined module Person defined class Person  scala> val s = new Person("sparks"
, 30) s: Person = Person@3b30eec5 scala> s.sayHello Hi,sparks, I guess you must have 2 eyes.

apply方法(重要)

object中非常重要的一個特殊方法。
通常在伴生對象中實現apply方法,並在其中實現構造伴生類對象的功能;這樣在創建伴生類對象時,可以使用Class()方式(而不僅僅是new Class方式),原理是隱式地調用了伴生對象的apply方法,讓對象創建更加簡潔。

class Person(val name: String) object Person{   def apply(name: String) = new Person(name) } defined class Person defined module Person // 可以直接使用Class()方式創建對象。 scala> val test = Person("sparks") test: Person = Person@7cdfa824 

main方法

在scala中,如果要運行一個應用程序,那麽必須有一個main方法,作為入口

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

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

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

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

如果要運行上述代碼,需要將其放入.scala文件,然後使用scalac編譯,再用scala執行。

// 編譯 scalac HelloWorld.scala // 運行(輸出運行所花費的時間) scala -Dscala.time HelloWorld 

App Trait的工作原理為: App Trait繼承自DelayedInit Trait,scalac命令進行編譯時,會把繼承App Trait的object的constructor代碼都放到DelayedInit Trait的dealyedInit方法中執行。

用object來實現枚舉功能

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

object Season extends Enumeration {   val SPRINT, SUMMER, AUTUMN, WINTER = Value }  defined module Season  scala> Season.SPRINT res17: Season.Value = SPRINT  // 還可以通過Value傳入枚舉值的id和name,通過id和toString來獲取 object Season extends Enumeration {   val SPRINT = Value(0, "spring")   val SUMMER = Value(1, "summer")   val AUTUMN = Value(2, "autumn")   val WINTER = Value(3, "winter") }  defined module Season  scala> Season.SPRINT.id res20: Int = 0  scala> Season.SPRINT.toString res21: String = spring  scala> Season(0) res22: Season.Value = spring  scala> Season(2) res23: Season.Value = autumn  scala> Season.withName("winter") res24: Season.Value = winter // 使用枚舉object.values 可以遍歷枚舉值 scala> for (ele <- Season.values ) println(ele) spring summer autumn winter

Scala入門系列(六):面向對象之object