7、Scala基礎(chǔ)之面向?qū)ο缶幊讨畬ο?/h2>

object

object,相當于class的單個實例,通常在里面放一些靜態(tài)的field或者method
第一次調(diào)用object的方法時,就會執(zhí)行object的constructor,也就是object內(nèi)部不在method中的代碼;但是object不能定義接受參數(shù)的constructor
注意,object的constructor只會在其第一次被調(diào)用時執(zhí)行一次,以后再次調(diào)用就不會再次執(zhí)行constructor了
object通常用于作為單例模式的實現(xiàn),或者放class的靜態(tài)成員,比如工具方法

object People{
  private var eyeNum:Int = 2
  println("i'm a people")
  def getEyeNumber = eyeNum
}
    println(People.getEyeNumber)
    println(People.getEyeNumber)
    println(People.getEyeNumber)

伴生對象

如果有一個class,還有一個與class同名的object,那么就稱這個object是class的伴生對象,class是object的伴生類
伴生類和伴生對象必須存放在一個.scala文件之中
伴生類和伴生對象,最大的特點就在于,互相可以訪問private field

class People{
  private var name = "ZhaoJun"
  def getName = "Hello, my name is " + name + " ,i have " + People.eyeNum + " eyes."
}
object People{
  private var eyeNum:Int = 2
  println("i'm a people")
  def getEyeNumber = eyeNum
}
    var people = new People
    println(people.getName)

讓object繼承抽象類

object的功能其實和class類似,除了不能定義接受參數(shù)的constructor之外
object也可以繼承抽象類,并覆蓋抽象類中的方法

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

apply方法

object中非常重要的一個特殊方法,就是apply方法
通常在伴生對象中實現(xiàn)apply方法,并在其中實現(xiàn)構(gòu)造伴生類的對象的功能
而創(chuàng)建伴生類的對象時,通常不會使用new Class的方式,而是使用Class()的方式,隱式地調(diào)用伴生對象得apply方法,這樣會讓對象創(chuàng)建更加簡潔
比如,Array類的伴生對象的apply方法就實現(xiàn)了接收可變數(shù)量的參數(shù),并創(chuàng)建一個Array對象的功能

  def apply(x: Int, xs: Int*): Array[Int] = {
    val array = new Array[Int](xs.length + 1)
    array(0) = x
    var i = 1
    for (x <- xs.iterator) { array(i) = x; i += 1 }
    array
  }

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

class People{
  private var name = "ZhaoJun"
  def getName = "Hello, my name is " + name + " ,i have " + People.eyeNum + " eyes."
}

object People{
  private var eyeNum:Int = 2
  println("i'm a people")
  def getEyeNumber = eyeNum
  def apply(): People = new People()
}
    var people = People()
    println(people.getName)

main方法

就如同java中,如果要運行一個程序,必須編寫一個包含main方法類一樣;在scala中,如果要運行一個應用程序,那么必須有一個main方法,作為入口
scala中的main方法定義為def main(args: Array[String]),而且必須定義在object中

object HelloMain {
  def main(args: Array[String]): Unit = {
    println("Hello Main")
  }
}

除了自己實現(xiàn)main方法之外,還可以繼承App Trait,然后將需要在main方法中運行的代碼,直接作為object的constructor代碼;而且用args可以接受傳入的參數(shù)
App Trait的工作原理為:App Trait繼承自DelayedInit Trait,scalac命令進行編譯時,會把繼承App Trait的object的constructor代碼都放到DelayedInit Trait的delayedInit方法中執(zhí)行

object HelloAppMain extends App {
  println("Hello Main")
}

如果要運行上述代碼,需要將其放入.scala文件,然后先使用scalac編譯,再用scala執(zhí)行
scalac HelloAppMain.scala
scala HelloAppMain
或者
scalac HelloApp.scala
scala HelloApp

用object來實現(xiàn)枚舉功能

Scala沒有直接提供類似于Java中的Enum這樣的枚舉特性,如果要實現(xiàn)枚舉,則需要用object繼承Enumeration類,并且調(diào)用Value方法來初始化枚舉值

object Season extends Enumeration {
  val SPRING, SUMMER, AUTUMN, WINTER = Value
}
    println(Season.SPRING)
    println(Season.SUMMER)
    println(Season.AUTUMN)
    println(Season.WINTER)

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

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

    for(ele <- Season.values) {
      println(ele)
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容