和java或c++一樣,scala也可以有任意多的構造器。不過,scala類有一個構造器比其它所有構造器都更為重要,它就是主構造器。除了主構造器之外,類還可以有任意多的輔助構造器。
有兩點需要注意:
-
輔助構造器的名稱為this。(在java或c++中,構造器的名稱和類名相同--當你修改類名時就不那么方便了。)
-
每一個輔助構造器都必須以一個對先前已定義的其它輔助構造器或主構造器的調用開始。
一個類如果沒有顯式定義主構造器則自動擁有一個無參的主構造器。
class Person_1 { private var name = ""
private var age = 0 def this(name: String) { //一個輔助構造器
this() //調用主構造器
this.name = name } def this(name: String, age: Int) {//另一個輔助構造器
this(name)//調用前一個輔助構造器
this.age = age } }
演示
object Person_1 { def main(args: Array[String]) { val p1 = new Person_1 //主構造器
val p2 = new Person_1("Fred") //第一個輔助構造器
val p3 = new Person_1("Fred", 42) //第二個輔助構造器
} }
主構造器的參數直接放置在類名之后。
object Person_1 { def main(args: Array[String]) { val p1 = new Person_1 //主構造器
val p2 = new Person_1("Fred") //第一個輔助構造器
val p3 = new Person_1("Fred", 42) //第二個輔助構造器
} }
主構造器的參數直接放置在類名之后。
class Person_3(val name: String, val age: Int) { //()中的內容就是主構造器的參數
}
相當於java中
public class Person_3{ private String name; private int age; public Person_3(String name, int age){ this.name=name; this.age=age; } public String name(){ return this.name;} public int age(){ return this.age;} }
主構造器會執行類定義中的所有語句。
class Person_3(val name: String, val age: Int) { //()中的內容就是主構造器的參數
println("just constructed another person") def description = name + " is " + age + " years old" }
println語句是主構造器的一部分。每當有對象被構造出來時,上述代碼就會執行。當你需要在構造過程當中配置某個字段時這個特性特別有用。
import scala.util.Properties import java.util.Properties import java.io.FileReader class MyProg { private val props = new Properties props.load(new FileReader("myprog.properties")) //上述語句是主構造器的一部分
}
如果類名之后沒有參數,則該類具備一個無參主構造器。這樣一個構造器僅僅是簡單地執行類體中的所有語句而已。
你通常可以通過在主構造器中使用默認參數來避免過多地使用輔助構造器。
class Person_4(val name: String = "", val age: Int = 0) { }
還可以這樣
class Person_4(val name: String, private var age: Int ) { }
這段代碼將聲明並初始化如下字段。
val name: String private var age: Int