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