7局扶、Scala基礎(chǔ)之面向?qū)ο缶幊讨畬?duì)象

object

object就谜,相當(dāng)于class的單個(gè)實(shí)例,通常在里面放一些靜態(tài)的field或者method
第一次調(diào)用object的方法時(shí)娩践,就會(huì)執(zhí)行object的constructor活翩,也就是object內(nèi)部不在method中的代碼逞带;但是object不能定義接受參數(shù)的constructor
注意,object的constructor只會(huì)在其第一次被調(diào)用時(shí)執(zhí)行一次纱新,以后再次調(diào)用就不會(huì)再次執(zhí)行constructor了
object通常用于作為單例模式的實(shí)現(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)

伴生對(duì)象

如果有一個(gè)class脸爱,還有一個(gè)與class同名的object,那么就稱這個(gè)object是class的伴生對(duì)象未妹,class是object的伴生類
伴生類和伴生對(duì)象必須存放在一個(gè).scala文件之中
伴生類和伴生對(duì)象簿废,最大的特點(diǎn)就在于,互相可以訪問(wèn)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的功能其實(shí)和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中非常重要的一個(gè)特殊方法,就是apply方法
通常在伴生對(duì)象中實(shí)現(xiàn)apply方法化戳,并在其中實(shí)現(xiàn)構(gòu)造伴生類的對(duì)象的功能
而創(chuàng)建伴生類的對(duì)象時(shí)单料,通常不會(huì)使用new Class的方式,而是使用Class()的方式点楼,隱式地調(diào)用伴生對(duì)象得apply方法扫尖,這樣會(huì)讓對(duì)象創(chuàng)建更加簡(jiǎn)潔
比如,Array類的伴生對(duì)象的apply方法就實(shí)現(xiàn)了接收可變數(shù)量的參數(shù)掠廓,并創(chuàng)建一個(gè)Array對(duì)象的功能

  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
  }

比如换怖,定義自己的伴生類和伴生對(duì)象

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中,如果要運(yùn)行一個(gè)程序蟀瞧,必須編寫一個(gè)包含main方法類一樣沉颂;在scala中,如果要運(yùn)行一個(gè)應(yīng)用程序悦污,那么必須有一個(gè)main方法铸屉,作為入口
scala中的main方法定義為def main(args: Array[String]),而且必須定義在object中

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

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

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

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

用object來(lái)實(shí)現(xiàn)枚舉功能

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

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

還可以通過(guò)Value傳入枚舉值的id和name,通過(guò)id和toString可以獲取; 還可以通過(guò)id和name來(lái)查找枚舉值

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抢呆,一起剝皮案震驚了整個(gè)濱河市煮嫌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抱虐,老刑警劉巖昌阿,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恳邀,居然都是意外死亡懦冰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谣沸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刷钢,“玉大人,你說(shuō)我怎么就攤上這事乳附∧诘兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赋除,是天一觀的道長(zhǎng)瓤鼻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贤重,這世上最難降的妖魔是什么茬祷? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮并蝗,結(jié)果婚禮上祭犯,老公的妹妹穿的比我還像新娘。我一直安慰自己滚停,他們只是感情好沃粗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著键畴,像睡著了一般最盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上起惕,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天涡贱,我揣著相機(jī)與錄音,去河邊找鬼惹想。 笑死问词,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘀粱。 我是一名探鬼主播激挪,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辰狡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了垄分?” 一聲冷哼從身側(cè)響起宛篇,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄湿,沒想到半個(gè)月后些己,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘿般,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涯冠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炉奴。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛇更,靈堂內(nèi)的尸體忽然破棺而出瞻赶,到底是詐尸還是另有隱情,我是刑警寧澤派任,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布砸逊,位于F島的核電站,受9級(jí)特大地震影響掌逛,放射性物質(zhì)發(fā)生泄漏师逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一豆混、第九天 我趴在偏房一處隱蔽的房頂上張望篓像。 院中可真熱鬧,春花似錦皿伺、人聲如沸员辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奠滑。三九已至,卻和暖如春妒穴,著一層夾襖步出監(jiān)牢的瞬間宋税,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工讼油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弃甥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓汁讼,卻偏偏與公主長(zhǎng)得像淆攻,于是被迫代替她去往敵國(guó)和親阔墩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容