scala構造器

object ConstructorTest {
  def main(args:Array[String]){
    var p = new Person //由於Person沒有本身寫的主構造器,那麼當初始化時,只是執行類中的語句而已
    var p2 = new Person()
    var p3= new Person("zs")
    var p4 = new Person("ls",20)
  }
}
object Person{
  private var i = 1
}
class Person{
  private var name = ""
  private var age =0
 
  println("模擬主構造器中的執行語句"+Person.i)
  Person.i += 1
  def this(name:String){
    this()
    this.name = name
    println(s"name=$name")
  }
  def this(name:String,age:Int){
    this(name)
    this.age = age
    println(s"name=$name,age=$age")
  }
}this

打印結果:對象

模擬主構造器中的執行語句1
模擬主構造器中的執行語句2
模擬主構造器中的執行語句3
name=zs
模擬主構造器中的執行語句4
name=ls
name=ls,age=20get

另外主構造器中參數能夠有var/val和不帶var/val區別,val則編譯器產生getter,var則產生getter和setter ,若是沒var/val則產生的字段就會有private[this]限制,即對象私有的。在主構造器的參數列表中還能夠直接用private來限制,如private var age,則編譯器產生私有age即getter和setter都是私有的。編譯器

//class ThisClass(name:String,age:Int){ //name age在類中至少要被一個方法使用,那麼name age就會成爲不可變字段,而且有private[this]權限即對象私有
//  def pt() = println(s"name=$name age=$age")
//  def comp(other:ThisClass):Boolean = age < other.age //出現錯誤
//}
class ThisClass(name:String,var age:Int){ //name age在類中至少要被一個方法使用,那麼name age就會成爲不可變字段,而且有private[this]權限即對象私有
  def pt() = println(s"name=$name age=$age")
  def comp(other:ThisClass):Boolean = age < other.age //主構造中var age則age字段就不會有private[this]權限,因此此處正確
}編譯

主構造器中的參數name age若是在類內部沒有被訪問到,則不會產生相應的字段,name和age只能在主構造器中的代碼訪問而已。class

object ConstructorTest {
  def main(args:Array[String]){
    var argsNoUse = new ArgsNoUse()
  }
}
class ArgsNoUse(name:String="a",age:Int=3)
{
  println(s"ArgsNoUse primary constructor :$name --$age")
  def hello(){println("hello")}
}object

打印結果:權限

ArgsNoUse primary constructor :a --3方法

若是var argsNoUse = new ArgsNoUse("abc",40)im

則打印:ArgsNoUse primary constructor :abc --40

實驗發現,當主構造器爲私有以後,只能經過輔助構造器建立對象,代碼以下:

var noPrimaryConstructor = new NoPrimaryConstructor("name",30)

println(noPrimaryConstructor.name)

class NoPrimaryConstructor private(var name:String) //此處var必需要有,不然noPrimaryConstructor對象就不會有name屬性,由於name成爲了private[this]權限,即對象私有
{
  var age = 0
  def this(name:String,age:Int){
    this(name)
    this.name = name
    println("NoPrimaryConstructor this constructor is excute")
  }
}

若是

相關文章
相關標籤/搜索