1. 程式人生 > >scala中 object 和 class的區別

scala中 object 和 class的區別

object

在scala中沒有靜態方法和靜態欄位,所以在scala中可以用object來實現這些功能,直接用物件名呼叫的方法都是採用這種實現方式,例如Array.toString。物件的構造器在第一次使用的時候會被呼叫,如果一個物件從未被使用,那麼他的構造器也不會被執行;物件本質上擁有類(scala中)的所有特性,除此之外,object還可以一擴充套件類以及一個或者多個特質:例如,

abstract class ClassName(val parameter){}

object Test extends ClassName(val parameter){}

trait TraitA{}

trait TraitB{}

trait TraitC{}

object Test1 extends TraitA with TraitB with TraitC{}

注意:object不能提供構造器引數,也就是說object必須是無參的

我們通常會定義和使用object的apply方法,有如下情形,apply方法就會被呼叫,Object(引數1 ,引數2 ,……)這樣是隱含的呼叫apply方法,當然也可以顯示的呼叫,如下Array("Mary","tong"),當然也可以這樣來寫Array.apply("Mary","tong"),一般我們提倡隱式的寫法。

所有的main方法都必須在object中被呼叫,來提供程式的主入口,十分簡單,不舉例說明,處理main方法以外,scala中還提供了擴充套件App特質,然後將程式程式碼放入都早起方法體內,如

object Hello extends App{

   println("Hello World !!!")

}

這樣的程式碼可以直接執行,輸出

如果需要命令列引數,可以直接呼叫args屬性來得到,例如

def main(args: Array[String]) {if (args.length > 0 )
    println("Hello " + args(0))
  else 
println("Hello World")
}
scala中並沒有列舉型別,但是,標準類庫中提供了一個列舉型別的介面,在object下面,可以擴展出列舉型別(Enumeration),
具體示例如下:
object EnumerationDemo extends Enumeration{
  val red, green, blue, pink = Value

  val black = Value   // 上面一條語句是簡寫
  val white = Value
  val gray = Value

  val yellow = Value(12, "huang")    //可以隨意指定id和名稱,但是避免重複
  val purple = Value("zi")          //id為13
  val orange = Value(20)
}
上面的程式碼為實現列舉型別的具體程式碼,如果不指定id和name,系統預設是id從0開始,name就是變數的名稱,可以指定其中的
任何一個或者是兩個全部指定,已經指定的就按指定的初始化,並且後面的依次遞增。

列舉的引用
可以直接objectName.red這樣來進行引用,也可以將import objectName._來進行匯入引用,還可以給列舉型別增加一個類型別名,
具體如下:
object EnumerationDemo extends Enumeration{
  type EnumerationDemo = Value
  val red, green, blue, pink = Value

  val black = Value
  val white = Value
  val gray = Value

  val yellow = Value(12, "huang")
  val purple = Value("zi")
  val orange = Value(20)
}
現在列舉型別變成了EnumerationDemo.EnumerationDemo 這種用法只有在使用import語句的時候才顯得有意義。
package enumeration

import EnumerationDemo._

/**
 * Created by tongtong on 2015/9/8.
 * 
 */
class EnumDemo {
  def transportation(color:Enumeration): Unit ={
    if (color == red)
      "Stop"
else if (color == green)
      "go"
else if (color == yellow)
      "wait"
}
}
列舉型別也可以通過for迴圈將所有元素輸出,同時可以通過Enumeration(Int)和Enumeration.withName("")來進行 定位操作

class

在scala中,類名可以和物件名為同一個名字,該物件稱為該類的伴生物件,類和伴生物件可以相互訪問他們的私有屬性,但是
他們必須在同一個原始檔內。類只會被編譯,不能直接被執行,類的申明和主構造器在一起被申明,在一個類中,主構造器只有一個,
所有必須在內部申明主構造器或者是其他申明主構造器的輔構造器,主構造器會執行類定義中的所有語句。scala對每個欄位都會提供
getter和setter方法,同時也可以顯示的申明,但是針對val型別,只提供getter方法,預設情況下,欄位為公有型別,可以在setter
方法中增加限制條件來限定變數的變化範圍,在scala中方法可以訪問改類所有物件的私有欄位