我正在从官方文档中学习Kotlin,我创建了一个class,如下所示,我创建了一个constructor,其中有两个parameters.constructor号尸体在init街区.

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
}

好吧,我想再创造一个constructor,这将需要一个parameter在一个constructor.在Kotlin中怎么做

推荐答案

那么init不是构造函数的主体.它在具有主构造函数上下文的主构造函数之后调用.

As given in Official documentation:

主构造函数不能包含任何代码.初始化代码可以放在初始值设定项块中,其前缀为init关键字:

class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}

请注意,可以在初始化块中使用主构造函数的参数.它们还可以在类主体中声明的属性初始值设定项中使用:

class Customer(name: String) {
    val customerKey = name.toUpperCase()
}

事实上,为了声明属性并从主构造函数初始化它们,Kotlin有一个简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}

As per your question you can add a constructor to accept one parameter like following:

class Person(name: String, surname: String) {

    constructor(name: String) : this(name, "") {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

But it doesn't look right as we are unnecessary passing second argument empty string. So we can order constructor like following:

class Person(name: String) {

    constructor(name: String, surname: String) : this(name) {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

希望有帮助.

Kotlin相关问答推荐

外键是主键的一部分,但不是索引的一部分.房间

何时使用figureEach

映射中列表类型的Kotlin可空接收器?

Kotlin:有限的并行性并不是限制并行性

如何在 kotlin 中的数据类中为变量提供多种类型

Kotlin:调用 CoroutineScope.launch 与在协程内启动之间的区别

Eclipse:无法安装 Kotlin 插件

如何判断给定字符串是否多次包含另一个子字符串?

Kotlin:伴随对象内的函数扩展

java - 如何将函数作为参数从java传递给kotlin方法?

SpringBoot 2.5.0 对于 Jackson Kotlin 类的支持,请在类路径中添加com.fasterxml.jackson.module: jackson-module-kotlin

Kotlin 代码是如何编译成原生代码的?

下拉通知面板时是否可以暂停Android中的任何视频(媒体播放器)应用程序?

什么是开放式property?为什么我不能将其设置器设为private私有?

Kotlin解构when/if语句

main函数和常规函数有什么区别?

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

android Room 将 Null 作为非 Null 类型返回

Kotlin中的属性(properties)和参数(parameters)有什么区别?

Android room DAO 接口不适用于继承