Kotlin 主构造函数与次构造函数的理解

遇到了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()
}

打印日志
 《Kotlin 主构造函数与次构造函数的理解》

你虽然没有声明主构造函数,但它会生成一个生成的不带参数的主构造函数。在你调用次级构造函数时隐式调用,

就是你不用在代码中写,但它会在你调用次级构造函数之前调用了。

在日志中 

主函数方法体中的 Main constructor 首先打印,接着才是次级构造函数中的 constructor  , woman

虽然你在main()方法中通过次级构造函数初始化Person类对象,但是他在次级构造函数之前隐式调用了默认的无参主构造函数

 

 

 

 

 

 

 

    原文作者:本人很懒zzz
    原文地址: https://blog.csdn.net/u011288271/article/details/106546490
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞