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")
}
}
若是