Kotlin中init方法调用时机笔记

前提概念:kotlin中主级函数、次级函数概念理解
调用顺序:主级函数>init>次级函数

详细文章传送门:https://blog.csdn.net/u011288271/article/details/106546490

内容看不了可以直接看下面,我搬过来了,内容如下↓

遇到了Kotlin: Primary constructor call expected的报错

如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用 this 关键字即可
这句话就是说如果一个类有主构造函数,只要他除了主构造函数还有其他次构造函数,那么这些次构造函数就必须调用主构造函数,方式可以不同

方式1:每个次构造函数都调用主构造函数 : 即直接委托

class Parent(name: String) {
 
    var age = 0;
    var sex = "man"
 
    constructor(name: String, age: Int) : this("Main name 1") {
        this.age = age;
        println("constructor 1 $name , $age , $sex")
    }
 
    constructor(nickName: String, sex: String) : this("Main name 2") {
 
        this.sex = sex;
        println("constructor 2 $nickName , $age , $sex")
    }
 
    open fun learn() {
        println(" learn ")
    }
}
 
fun main() {
    Parent("lucy", "woman").learn()
}

如上代码,每个constructor后面都显示调用主构造函数 this("name ")

方式2:次构造函数2 ————> 次构造函数1 ,而 次构造函数1 ————> 主构造函数 :即间接委托
最终: 次构造函数2 ——间接——> 主构造函数
所以无论你这种 次级构造函数 -> 次级构造函数 -> 次级构造函数 调用了多少个,最终必须有一个次构造函数调用主构造函数,否则就会报错

如下代码: constructor(nickName: String, sex: String) ——> constructor(name: String, age: Int) ——>主构造函数 this("Main name 1")

class Parent(name: String) {
 
    var age = 0;
    var sex = "man"
    
    //次级构造函数1
    constructor(name: String, age: Int) : this("Main name 1") {
        this.age = age;
        println("constructor 1 $name , $age , $sex")
    }
 
    //次级构造函数2
    constructor(nickName: String, sex: String) : this("nickName jj", 12) {
 
        this.sex = sex;
        println("constructor 2 $nickName , $age , $sex")
    }
 
    open fun learn() {
        println(" learn ")
    }
}
 
fun main() {
    Parent("lucy", "woman").learn()
}
 

如果一个类没有主构造函数,次级构造函数就不必显示调用主构造函数

class Parent {
 
    init {
         // 初始化代码块本质就是主构造函数的方法体
         // 因为主构造函数在类名头部声明不能带有方法体
          
        println("Main constructor")
    }
 
    constructor(sex: String) {
        println("constructor  , $sex")
    }
 
    open fun learn() {
        println(" learn ")
    }
}
 
fun main() {
    Parent("woman").learn()
}

打印日志

image.png

你虽然没有声明主构造函数,但它会生成一个生成的不带参数的主构造函数。在你调用次级构造函数时隐式调用,
就是你不用在代码中写,但它会在你调用次级构造函数之前调用了。
在日志中
主函数方法体中的 Main constructor 首先打印,接着才是次级构造函数中的 constructor , woman
虽然你在main()方法中通过次级构造函数初始化Person类对象,但是他在次级构造函数之前隐式调用了默认的无参主构造函数
————————————————
版权声明:本文为CSDN博主「本人很懒zzz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011288271/article/details/106546490

你可能感兴趣的:(Kotlin中init方法调用时机笔记)