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

Kotlin:构造函数中为何需用var/val定义属性?

为什么Kotlin构造函数里要加var/val?

这个问题其实戳中了Kotlin构造函数设计的核心逻辑——构造函数参数默认只是局部变量,并非类的成员属性。咱们一步步拆解来看:

首先得明确构造函数参数的两种身份:

  • 如果你只写weightInGrams: Float,这个参数只是构造函数执行期间的临时局部变量,作用域仅限构造函数内部,类的其他方法(比如你的grow())根本访问不到它。这就是你代码报错的直接原因——grow()里找不到weightInGrams这个变量。
  • 当你给参数加上var或val时,Kotlin会自动把这个参数提升为类的成员属性,同时帮你完成属性的初始化。这是Kotlin的语法糖,省去了手动在类里定义属性、再在构造函数里赋值的冗余步骤。

分析你的报错代码

看你写的这段代码:

class Apple(weightInGrams: Float){ 
    fun grow() { 
        weightInGrams+= 2.0f 
    } 
}

这里的weightInGrams只是构造函数的临时参数,grow()作为类的成员方法,它的作用域里不存在这个参数,自然会触发报错。而且就算能访问,构造函数参数默认是只读的,你也没法修改它的值。

怎么修正?

既然你要在grow()里修改重量,给参数加上var就行,把它变成类的可变成员属性:

class Apple(var weightInGrams: Float){ 
    fun grow() { 
        weightInGrams += 2.0f 
    } 
}

如果属性初始化后不需要修改(比如某些固定的配置值),就用val,它会变成类的只读成员属性:

class Apple(val weightInGrams: Float){ 
    // 这里无法修改weightInGrams的值
}

额外补充:背后的原理

Kotlin之所以这么设计,是为了让代码更简洁。如果没有这个语法糖,你得手动写重复代码:

class Apple(weightInGrams: Float){ 
    var weightInGrams: Float = weightInGrams // 手动定义属性并赋值
    fun grow() { 
        weightInGrams += 2.0f 
    } 
}

加var/val不仅帮你省去了这一步,还能明确属性的可变性,让代码的可读性更强。

内容的提问来源于stack exchange,提问作者Malwinder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:53:02