在Scala中定義主構造函數使用this關鍵字:app
scala> :paste // Entering paste mode (ctrl-D to finish) class Pizza(var crustSize: Int, var crustType: String) { def this(crustSize: Int) { this(crustSize, Pizza.DEFAULT_CRUST_TYPE) } def this(crustType: String) { this(Pizza.DEFAULT_CRUST_SIZE, crustType) } def this() { this(Pizza.DEFAULT_CRUST_SIZE, Pizza.DEFAULT_CRUST_TYPE) } override def toString = s"A $crustSize inch pizza with a $crustType crust" } object Pizza { val DEFAULT_CRUST_SIZE = 12 val DEFAULT_CRUST_TYPE = "THIN" } // Exiting paste mode, now interpreting. defined class Pizza defined object Pizza
分別使用主構造函數和輔助構造函數來建立類的實例ide
//使用主構造函數 scala> val p1 = new Pizza(Pizza.DEFAULT_CRUST_SIZE, Pizza.DEFAULT_CRUST_TYPE) p1: Pizza = A 12 inch pizza with a THIN crust //使用輔助構造函數 scala> val p2 = new Pizza(Pizza.DEFAULT_CRUST_SIZE) p2: Pizza = A 12 inch pizza with a THIN crust scala> val p3 = new Pizza(Pizza.DEFAULT_CRUST_TYPE) p3: Pizza = A 12 inch pizza with a THIN crust scala> val p4 = new Pizza() p4: Pizza = A 12 inch pizza with a THIN crust
要給case class定義一個輔助構造函數,須要在其伴生對象中增長apply方法。函數
scala> :paste // Entering paste mode (ctrl-D to finish) case class Person(var name: String, var age:Int) object Person{ def apply() = new Person("<no name>", 0) def apply(name: String) = new Person(name, 0) } // Exiting paste mode, now interpreting. defined class Person defined object Person
調用主構造函數和輔助構造函數來建立case class的實例對象this
//輔助構造函數 scala> val a = Person() a: Person = Person(<no name>,0) //輔助構造函數 scala> val a = Person("Pam") a: Person = Person(Pam,0) //主構造函數 scala> val a = Person("William Shatner", 27) a: Person = Person(William Shatner,27) //修改姓名 scala> a.name = "Leonard Nimoy" a.name: String = Leonard Nimoy //修改年齡 scala> a.age = 78 a.age: Int = 78 //打印對象 scala> println(a) Person(Leonard Nimoy,78)