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
相关产品推荐
相关产品推荐

