前言
最近开始学Kotlin,买了本《Kotlin极简教程》,以后绝对不要在京东阅读上买计算机的电子书,坑爹,我又去买了本实体版。最近看到面向对象这章,本文探讨了下构造函数的一些问题
问题
构造函数简单而言就是在创建类的实例时调用的函数。Kotlin中如果没有可见修饰符或者注解(annotation),就可以忽略不写constructor,反之则要写。修饰符和注解都要写在constructor前面。
Kotlin支持类有一个主构造函数和一到多个次构造函数。使用次构造函数可以根据参数的不同创建不同的实例。比如下面的例子:
1 2 3 4 5 6 7 8 9 10 11
| class Person constructor(val sex: String, val age: Int, val name: String){ var weight:Double = 0.0 init { println("The sex is $sex") println("The age is $age") } constructor(sex: String, age: Int, name: String, weight: Double):this(sex,age,name){ this.weight = weight } }
|
我们可以这样调用:
1 2 3 4 5 6
| fun main(args: Array<String>){ val p1 = Person("male",23,"jack") //调用的主构造函数 println("All property of p1 is: sex->${p1.sex},age->${p1.age},name->${p1.name}") val p2 = Person("female",16,"Michelle",45.7) //调用次构造函数 println("The weight of P2 is ${p2.weight}") }
|
返回的结果是:
1 2 3 4 5 6
| The sex is male The age is 23 All property of p1 is: sex->male,age->23,name->jack The sex is female The age is 16 The weight of P2 is 45.7
|
次构造函数的函数签名不能有val或者var,而且必须通过this委托给主构造函数。
注意!
1.只能在主构造函数里用init{}
2.这样的代码是错的:
1 2 3 4 5 6 7 8 9 10
| class Person constructor(val sex: String, val age: Int, val name: String){ init { println("The sex is $sex") println("The age is $age") } constructor(sex: String, age: Int, name: String, weight: Double):this(sex,age,name){ val weight: Double = weight } }
|
如果想正确地访问weight变量,只能在主构造函数里创建变量并赋值(不然IDE会提示要不非抽象属性或者要初始化),然后通过this在次构造函数里赋合适的值。无法在次构造函数里创建val或者var