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