Kotlin var 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 提供了两个关键字用于变量声明:val 和 var。var 关键字声明可变变量,这些变量可以被重新赋值。本教程将通过实际例子深入探讨 var 关键字。
基本定义
Kotlin 中的 var 关键字声明一个可变变量。与 val 不同,使用 var 声明的变量可以在初始化后重新赋值。Kotlin 支持 var 声明的类型推断。
基本 var 声明
var 声明的最简单形式包括关键字、变量名、可选类型和初始值。类型可以从初始化器推断出来。
package com.zetcode
fun main() {
var count = 10
println(count) // Output: 10
count = 20
println(count) // Output: 20
}
这里,我们声明一个可变变量 count,并将其初始化为 10。Kotlin 将类型推断为 Int。然后,我们将其重新赋值为 20,这展示了可变性。类型在声明后保持不变。
显式类型声明
虽然 Kotlin 可以推断类型,但您可以显式声明变量类型。当您想明确指定类型或稍后初始化时,这很有用。
package com.zetcode
fun main() {
var message: String
message = "Hello, Kotlin"
println(message) // Output: Hello, Kotlin
message = "New message"
println(message) // Output: New message
}
我们声明 message 并显式指定 String 类型,稍后进行初始化。只要新值是 String,就可以重新赋值该变量。这展示了声明和初始化的分离。
使用 lateinit 进行延迟初始化
对于无法在构造函数中初始化的非空属性,Kotlin 提供了 lateinit。此修饰符允许延迟初始化 var 属性。
package com.zetcode
class User {
lateinit var name: String
fun initializeName() {
name = "John Doe"
}
}
fun main() {
val user = User()
user.initializeName()
println(user.name) // Output: John Doe
}
name 属性使用 lateinit 声明并在稍后初始化。在初始化之前尝试访问它将抛出异常。这对于依赖注入场景很有用。
变量作用域
使用 var 声明的变量遵循标准的范围规则。它们在其声明块内可见,并且可以隐藏外部范围内的变量。
package com.zetcode
fun main() {
var x = 10
println("Outer x: $x") // Output: Outer x: 10
if (true) {
var x = 20
println("Inner x: $x") // Output: Inner x: 20
}
println("Outer x: $x") // Output: Outer x: 10
}
此示例演示了变量隐藏。内部 x 在 if 块内隐藏了外部的 x。对内部变量的更改不会影响外部变量。每个变量存在于其自己的作用域中。
类型更改限制
虽然 var 允许重新赋值,但变量的类型在声明时就已固定。您不能在声明后分配不同类型的值。
package com.zetcode
fun main() {
var value: Number = 10
println(value) // Output: 10
value = 20.5
println(value) // Output: 20.5
// value = "Hello" // Compile error
}
value 变量声明为 Number,因此它可以保存任何数值类型。但是,分配一个 String 将导致编译错误。类型系统即使使用可变变量也能确保类型安全。
类中的属性
在类中,var 声明可变属性。这些属性可以具有自定义的 getter 和 setter,同时保持属性的可变性。
package com.zetcode
class Person {
var name: String = ""
set(value) {
field = value.trim()
}
var age: Int = 0
set(value) {
field = if (value >= 0) value else 0
}
}
fun main() {
val person = Person()
person.name = " John "
person.age = -5
println(person.name) // Output: John
println(person.age) // Output: 0
}
Person 类有两个具有自定义 setter 的可变属性。名称 setter 移除空格,而年龄 setter 确保非负值。这展示了 var 属性如何封装逻辑。
顶级变量
var 可用于声明可变的顶级变量。这些变量在整个文件中都可访问,并且可以导入到其他文件中。
package com.zetcode
var counter = 0
fun incrementCounter() {
counter++
}
fun main() {
println(counter) // Output: 0
incrementCounter()
println(counter) // Output: 1
}
counter 变量在顶层声明,并且可以被文件中的任何函数修改。这展示了全局可变状态,应谨慎使用,以避免可维护性问题。
使用 var 的最佳实践
- 优先使用 val 而不是 var: 默认情况下使用
val,仅当需要可变性时才使用var。 - 限制作用域: 将可变变量保持在尽可能小的作用域中,以减少副作用。
- 考虑线程安全: 并发代码中的可变变量需要适当的同步。
- 使用有意义的名称: 清楚地命名可变变量以表明其目的和可变性。
- 记录更改: 注释复杂的更改以解释其目的和不变量。
来源
本教程深入探讨了 Kotlin 的 var 关键字,展示了如何声明和使用可变变量。我们探讨了各种场景,包括属性、作用域和类型安全。正确使用可变变量有助于平衡 Kotlin 代码中的灵活性和可维护性。
作者
列出 所有 Kotlin 教程。