1. 程式人生 > >Scala輔助構造器和主構造器

Scala輔助構造器和主構造器

      和java或c++一樣,scala也可以有任意多的構造器。不過,scala類有一個構造器比其它所有構造器都更為重要,它就是主構造器。除了主構造器之外,類還可以有任意多的輔助構造器。

有兩點需要注意:

  1. 輔助構造器的名稱為this。(在java或c++中,構造器的名稱和類名相同--當你修改類名時就不那麼方便了。)

  2. 每一個輔助構造器都必須以一個對先前已定義的其它輔助構造器或主構造器的呼叫開始。

一個類如果沒有顯式定義主構造器則自動擁有一個無參的主構造器。

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