1. 程式人生 > >Scala學習之物件

Scala學習之物件

1、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 }

這裡寫圖片描述

2、伴生物件

如果有一個class,還有一個與class同名的object,那麼就稱這個objectclass伴生物件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 are " + age + " years old!" + ", and usually you must have " + + Person.eyeNum + " eyes.") }

這裡寫圖片描述

3、讓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) } }

這裡寫圖片描述

4、apply方法

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

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

而建立伴生類的物件時,通常不會使用new Class的方式,而是使用Class()的方式,隱式地呼叫伴生物件得apply方法,這樣會讓物件建立更加簡潔

// 比如,Array類的伴生物件的apply方法就實現了接收可變數量的引數,並建立一個Array物件的功能
val a = Array(1, 2, 3, 4, 5)

// 比如,定義自己的伴生類和伴生物件
class Person(val name: String)
object Person {
  def apply(name: String) = new Person(name)
}

這裡寫圖片描述

5、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!!!")
}

如果要執行上述程式碼,需要將其放入.scala檔案,然後先使用scalac編譯,再用scala執行

scalac HelloWorld.scala
scala -Dscala.time HelloWorld

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

6、用object來實現列舉功能

Scala沒有直接提供類似於Java中的Enum這樣的列舉特性

如果要實現列舉,則需要用object繼承Enumeration類,並且呼叫Value方法來初始化列舉值

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

// 還可以通過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")
}
Season(0)
Season.withName("spring")

// 使用列舉object.values可以遍歷列舉值
for (ele <- Season.values) println(ele)