Kotlin次级构造函数未调用求助:构造函数内代码无输出
问题排查:次级构造函数未被调用的原因及解决方法
你的问题核心很明确:带age参数的次级构造函数完全没执行,因为你在main函数里创建Person对象时,调用的是主构造函数,而非这个次级构造函数。
解决方法一:直接调用次级构造函数
修改main里的对象创建代码,传入次级构造函数要求的三个参数:
fun main() { var vinay = Person("Chaitra", "Vinay", 25) // 调用带age的次级构造函数 vinay.hobby = "Play tennis" vinay.stateHobby() println("vinay is ${vinay.age} years old") }
这样次级构造函数里的打印语句就会正常执行。
解决方法二:改用主构造函数可选参数(更符合Kotlin风格)
Kotlin推荐用主构造函数+默认参数替代次级构造函数,代码更简洁。调整Person类的实现:
class Person(firstName: String = "Chaitra", lastName: String = "Nadig", age: Int? = null) { var age: Int? = age var hobby: String = "Coding" init { println("Welcome $firstName $lastName") // 仅当age不为空时打印年龄相关内容 age?.let { println("Person is $firstName $lastName aged $it") } } fun stateHobby() { println("Hobby is $hobby") } }
此时创建对象可以灵活传参:
// 只传lastName,使用默认的firstName和null的age var vinay = Person(lastName = "Vinay") // 或者同时传lastName和age var vinay = Person(lastName = "Vinay", age = 25)
为什么原来的次级构造函数没被触发?
你定义的主构造函数所有参数都有默认值,当你用Person(lastName = "Vinay")创建对象时,Kotlin会自动匹配主构造函数(填充默认的firstName值),完全不会调用你写的次级构造函数,所以里面的代码自然不会执行。
内容的提问来源于stack exchange,提问作者Chaitra D
相关产品推荐
相关产品推荐

