理解Kotlin多重构造函数

在Kotlin中,有一个主要构造函数和许多次要构造函数;主构造函数是类头的一部分,它位于类名和可选类型参数之后。

这里主要通过简单示例展示Kotlin中的主要和次要/多个构造函数

1、主构造函数

这是带有一个参数的主构造函数。

class Example constructor(private val param1: String) {
    init {
        println("init is called.")
    }
}

也可以省略构造函数constructor关键字。

class Example(private val param1: String) {
    init {
        println("init is called.")
    }
}

不能在主构造函数中初始化。相反,你需要在init{}块中初始化你的代码。

主构造函数参数可以在初始化块中使用。它们也可以用在类主体中声明的属性初始化式中:

在实例初始化过程中,初始化程序块按照它们在类主体中出现的顺序执行,并与属性初始化程序交叉执行:

class Example(param1: String) {

    val firstProperty:String = "First property: $param1".also(::println)
    
    init {
        println("init is called. $param1")
    }
}
First property: hello
init is called. hello

2、次构造函数

下面有两个次构造函数。

class Example(private val param1: String) {

    init {
        println("init is called.")
    }

    //第一个次构造函数
    constructor(
        param1: String, 
        param2: String) : this(param1) {

        println("Second constructor is called")
    }

    //第二个次构造函数
    constructor(
        param1: String, 
        param2: String, 
        param3: String) : this(param1) {

        println("Third constructor is called")
    }
}

注意事项:


1、你必须直接或者间接调用主构造函数(例如调用this(param1))。
2、你可以在次要构造函数参数中声明varval
3、可以在次要构造函数中初始化代码

请注意,主构造函数和init{}块在次构造函数初始化之前首先被调用。

如果我调用第三个构造函数,

val obj = Example(param1="1", param2="2", param3="3")

输出结果顺序是这样的:

init is called.
Third constructor is called

3、调用另一个次构造函数

除了在辅助构造函数中调用主构造函数,还可以调用另一个辅助构造函数。

在如下例中,第二个次构造函数调用第一个次构造函数。

class Example(private val param1: String) {

    init {
        println("init is called.")
    }

    //第一个次构造函数
    constructor(
        param1: String,
        param2: String) : this(param1) {

        println("Second constructor is called")
    }

    //第二个次构造函数
    constructor(
        param1: String,
        param2: String,
        param3: String) : this(param1, param2) {

        println("Third constructor is called")
    }
}

如果我调用第三个构造函数,输出如下所示:

init is called.
Second constructor is called
Third constructor is called

4、空主构造函数

这是一个空的主构造函数和次构造函数示例。

class Example() {
    init {
        println("init is called.")
    }

    constructor(param1: String): this() {
        println("Second constructor is called")
    }
}

但是,实际上并不需要在次要构造函数中调用this(),您还需要将Example()更改为Example

class Example {
    init {
        println("init is called.")
    }

    constructor(param1: String) {
        println("Second constructor is called")
    }
}

5、构造器用例

使用以下语法指定类的主构造函数的可见性:

您需要添加一个显式constructor关键字。

class Example private constructor (param1: String) {
    init {
        println("init is called.")
    }
}

这里的构造函数是私有的。默认情况下,所有构造函数都是公共的,这实际上意味着它们在类可见的任何地方都是可见的(这意味着内部类的构造函数只在同一个模块中可见)。

最后

我没有用过很多多重构造函数,你们呢?所以,我将其记录在这里,以供将来参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值