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")
}
}
打印结果:
模拟主构造器中的执行语句1
模拟主构造器中的执行语句2
模拟主构造器中的执行语句3
name=zs
模拟主构造器中的执行语句4
name=ls
name=ls,age=20
另外主构造器中参数可以有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只能在主构造器中的代码访问而已。
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")}
}
打印结果:
ArgsNoUse primary constructor :a --3
如果var argsNoUse = new ArgsNoUse("abc",40)
则打印: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")
}
}
如果