Scala對象

1.單例對象

相比Java,Scala沒有靜態方法,靜態字段(static修飾),scala中的object有相同功能,定義了某個類的單個實例。下邊是一個object的例子。

Accounts.scala

package com.vip.scala.objects

object Accounts {
  private var lastNumber = 0
  def newUniqueNumber() = {
    lastNumber+=1
    lastNumber
  }
}

調用語句:

println("測試返回的uniqueNumber:"+ Accounts.newUniqueNumber()   )

對象的構造器在該對象第一次被使用時調用。上邊例子中,執行Accounts.newUniqueNumber()時調用了Accounts對象的構造器。對象擁有類的所有特性,但是有一點有區別,對象不可以提供構造器參數但是類可以。


2.伴生對象

在Java中,有的類既包含靜態方法又包含實例方法。在Scala中必須使用與類同名的伴生對象才能實現。類和伴生對象可以互相訪問私有特性,它們必須在同一個文件中。

Person.scala

class Person{
  private var name = ""
  private var age = 1
  private var id = Person.newIdnumber()
  def ageAdd(ages:Int) = {
    age += ages
    age
  }
}

object Person {
  private var IdNumber =0
  def newIdnumber() = {
    IdNumber +=1
    IdNumber
  }
}


3.擴展類或特質的對象

一個object可以擴展類 以及一個或多個特質,可以得到“擴展了指定類以及特質”的類的對象。我認爲是object 可以extends 一個類,這樣可以擴展類的特性。下面是一個簡單的object繼承class的實例:

Extendsclass.scala

abstract class Donothing {
  def redo() : Unit
  def undo() : Unit
}

object Extendsclass extends Donothing {
  override def undo(){}
  override def redo(){}
  
  def main(args:Array[String]):Unit ={
    val testMap = Map("jis" -> Extendsclass,"hond" -> Extendsclass)
  }  
}

Extendsclass對象可以被所有需要這個缺省行爲的地方公用。


4.apply方法

我們有時需要定義和使用對象的apply方法。當遇到如下表達式,apply方法會被調用:

Object(參數1, ... , 參數N)

apply方法返回伴生類對象。例如:Array對象就定了apply方法,例如Array("toyota","honda","nissan")。這樣不使用構造器而是使用apply方法,可以省去new關鍵字。

Array(100) 和 new Array(100)的區別是:前者使用apply方法(apply(100)),後者使用構造器(this(100))需要注意。


5.應用程序對象

一般地,Scala需要一個main作爲啓動入口。在object中定義main函數。

除了這種方法外,還可以使用下面的方法,擴展App特質,然後將程序放入構造器方法體內。可以使用args來獲得參數內容。App特質擴展自另一個特質DelayedInit,編譯器對該特質有特殊處理。

App.scala

package com.vip.scala.objects

object App extends App{
  if(args.length > 0) println("Hello" + args(0))
  else println("擴展App特質!")
}


6.枚舉






2016-10-25

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章