1. 程式人生 > >Scala中object、class與trait的區別

Scala中object、class與trait的區別

今天在學習Scala時,突然想用Idea來建立一個學習類(cmd擼程式碼太痛苦),直接建立了一個class:

class Test {
  def main(args: Array[String]) {
     print("Hello World!")
  }
}

當我要執行這個main函式時,缺無法執行,當時就鬱悶了,再次檢視新建時,才知道,Scala class的分類:



那這三中型別:class,Object,Trait有什麼區別嘛?

class

在scala中,類名可以和物件名為同一個名字,該物件稱為該類的伴生物件,類和伴生物件可以相互訪問他們的私有屬性,但是他們必須在同一個原始檔內

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

object

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

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

trait

在java中可以通過interface實現多重繼承,在Scala中可以通過特徵(trait)實現多重繼承,不過與java不同的是,它可以定義自己的屬性和實現方法體,在沒有自己的實現方法體時可以認為它時java interface是等價的,在Scala中也是一般只能繼承一個父類,可以通過多個with進行多重繼承

trait TraitA{}
trait TraitB{}
trait TraitC{}
object Test1 extends TraitA with TraitB with TraitC{}