如何在Kotlin构造代码块外部访问次级构造函数参数
解决Kotlin次级构造函数参数访问问题
嘿,作为Kotlin新手碰到这个问题太正常了,我来给你把逻辑理清楚!
你遇到的Unresolved reference:nbr错误,核心原因很简单:你在次级构造函数代码块里定义的nbr是局部变量,不是类的成员属性,它的作用域只限于那个构造函数的代码块内部,类的其他成员函数(比如printNameAndNumber)根本看不到它。
怎么修改才能正常访问?
我们需要把nbr变成类的成员属性,这样整个类的函数都能访问到。这里有两种常用的写法:
写法1:先声明类属性,再在次级构造函数中赋值
class Test(_name: String) { val name: String = _name var nbr: Int? = null // 先在类体内声明成员属性,初始值设为null // 次级构造函数调用主构造函数后,给类属性nbr赋值 constructor(_name: String, _nbr: Int) : this(_name) { nbr = _nbr } fun printNameAndNumber() { // 因为nbr可能为null,这里用?:处理空值情况 println("$name ${nbr ?: "未设置数字"}") } }
写法2:优化主构造函数,利用默认值(更简洁)
Kotlin推荐尽量用主构造函数来定义属性,我们可以给主构造函数的参数加默认值,这样次级构造函数甚至可以省略:
class Test(val name: String, val nbr: Int? = null) { // 如果一定要保留次级构造函数的写法,也可以这样写(其实这里有点多余,直接用主构造函数传参就行) constructor(name: String, nbr: Int) : this(name, nbr) fun printNameAndNumber() { println("$name ${nbr ?: "未设置数字"}") } }
最后再划个重点
记住:Kotlin里,只有在主构造函数参数前加val/var,或者在类体内声明的变量,才是类的成员属性。次级构造函数代码块里定义的变量,只是局部变量,出了代码块就失效啦。
内容的提问来源于stack exchange,提问作者frie
相关产品推荐
相关产品推荐

