结合上一篇的博客,kotlin class中的构造方法分为primary constructor 只有一个, secondary constructor可以有多个,主构造方法可以给定参数,那么这些参数的初始化会在class 的init代码块中执行,而secondary constructor 的初始化跟参数是在一起的, 且secondary必须直接或者间接调用primary constructor,这部分内容跟java有着很大的不同。constructor 如果没有修饰符,默认是public的修饰符,而java中是default修饰符,这点也有区别
来,上代码
class Person constructor(userName: String) {
private var userName: String? = null
private var age:Int
private var adderss:String
init {
println(userName)
this.userName = userName
this.age = 20
this.adderss = "beijing"
}
//直接或者间接调用primary方法
constructor(userName: String, age: Int) : this(userName){
println("$userName, $age")
this.age = age
this.adderss = "beijing"
}
//直接或者间接调用primary方法
constructor(userName: String, age: Int, address: String) : this(userName, age){
println("$userName, $age, $address")
this.adderss = adderss
}
fun printInfo() {
println("username: ${this.userName}, age: ${this.age}, ${this.adderss}")
}
}
fun main(args: Array<String>) {
var person = Person("zhangsan")
var person2 = Person("lisi", 12)
var person3 = Person("lisi", 20, "nanjing")
person.printInfo()
person2.printInfo()
person3.printInfo()
}
由执行结果可以看出调用顺序,先走primary,再走secondary
kotlin还提供了一种简约的类的定义方式
我们可以直接在构造方法入参中,直接定义成员变量,可以给定成员变量的默认值,这种方式一般在真是的成产开发中比较常见,因为谁都不愿意多写代码��,虽然java有lombok这样的框架减少了很多代码
class Student(private val userName: String, private val age: Int, private var address: String) {
fun printInfo() {
println("username: $userName, age: $age, address: $address")
}
}
/**
* constructor 有修饰符,或者注解的情况下,constructor关键字不可以省略
*
*/
class Student2 private constructor(userName: String){
}
/**
* 构造方法提供默认参数, 如果primary构造方法都有默认值,
* 在jvm上面如果所有的构造方法都有默认值,编译器会帮我们生成一个不带参数的构造方法,为了去兼容
第三方比如spring框架
*/
class Student3 (val userName: String = "zhangsan"){}
fun main(args: Array<String>) {
val student = Student("zhangsan", 20, "beijing")
student.printInfo()
}
通过代码可以看出来,方法直接可以引用到构造方法定义的值,这个可以通过模板字符串的引用可以看清楚
还有就是一点值得提 在jvm上面如果所有的构造方法都有默认值,编译器会帮我们生成一个不带参数的构造方法,目的是为了去兼容第三方比如spring框架,初始化实例的时候会调用那个不带参数的构造方法,而这个构造方法的初始值会调用所有参数的默认值�� kotlin规矩确实有点多啊,期待后面新的不同,更有深度的学习输出��也很期待,在生成环境中使用kotlin浪一把