Kotlin的构造方法探究

Kotlin的构造方法探究

前言:
我在学习kotlin的构造方法时,对书上网上的一些说法产生了疑问。
在此,我给出我的见解。

1.有且仅有一个主构造方法

首先明确两点

    1. 在哪里写算作主构造方法——在类的首部(class header)而不是在类体中(class body)。
    1. 如果在定义类时省略主构造方法,或者说没有显式提供主构造方法,则编译器会在编译时自动给类添加一个不带任何属性的默认主构造方法。

比如这种情况:

//没有主构造方法,只有一个副构造方法???
class Human1{
    //在类体中写的副构造方法
    constructor(name: String)
}

这段代码idea只是警告,说是建议写成主构造方法的格式,但是可以编译通过。这是不是算作kotlin可以允许没有主构造方法呢?
其实并不是这样,这里的Human类没有显式的主构造方法(没有在Human后面加小括号),这里的主构造方法是默认创建的。

2.副构造方法必须调用主构造方法

比如:

class Human2 {
    constructor(name: String) {
        println(name)
    }

    constructor(age: Int) {
        println(age)
    }

}

由第一个例子我们知道,主构造方法被自动创建。
不是说副构造方法必须调用主构造方法吗,为什么这里的两个副构造方法没有调用这个默认创建的主构造方法呢?
我认为是这样的:如果没有显式主构造方法。那么副构造方法也不需要显式调用主构造方法。

下面再看一个例子:

class Human3(){
    constructor(name: String) : this() {
        println(name)
    }

    constructor(age: Int) : this() {
        println(age)
    }
}

可以看到,在Human3这个类上添加了一个空的显式主构造方法(就是简单的加了一对括号),就导致在这个类的副构造方法必须显式地调用这个空的主构造方法。

posted @ 2020-03-29 00:10  SoClear  阅读(557)  评论(0编辑  收藏  举报