You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:37:53