
在 Kotlin 中,所有变量在使用前必须先声明。
➡️ Kotlin 是一种强类型语言,不允许像 JavaScript 那样先用后声明。
如果没有声明变量就尝试使用,会报语法错误。
➡️ 编译阶段就会报错,不能通过编译。
变量的类型声明决定了你可以在该内存位置存储的数据类型。
➡️ 比如你声明了 val age: Int,就只能存整数,不能再赋值为字符串或浮点数。
对于局部变量,变量的类型可以根据初始值自动推断出来。
➡️ Kotlin 支持 类型推断,你可以写成:
val name = "Alice"
// 自动推断为 String
var age = 25
// 自动推断为 Int不需要显式写 : String 或 : Int。
Example1:
kotlin
fun main()
{
var rollno : Int = 55
var name = "Ram"
println(rollno)
println(name)
}
Output:
kotlin
55
Ram
Example 2:
kotlin
fun main()
{
val a: Int = 1 // Explicit type declaration
val b = 1 // Type is inferred by the compiler
println(a)
println(b)
}
Output:
kotlin
1
1
上面我们有一个局部变量 rollno,它的值是 55,因为这是一个整数字面量(Int 类型),所以变量的类型是 Integer。另一个变量是 name,它的类型是 String。
在 Kotlin 中,变量可以通过两种关键字 声明:
➡️ 不可变变量:使用 val 关键字声明。一旦赋值,不可修改。
➡️ 可变变量:使用 var 关键字声明。可以被多次赋值。
不可变变量
不可变变量也称为只读变量。因此,使用 val
关键字声明的变量,其值是不能被修改的。
kotlin
val myName = "Gaurav"
myName = "Praveen" // compile time error
Output:
kotlin
'val' cannot be reassigned
🧠 小贴士:👉 "不可变变量 (val) ≠ 常量 (const)"
这意味着:
- 使用
val
声明的变量,只是不允许在赋值后再次修改; - 但它的初始值可以是在运行时计算出来的 ,而不是必须在编译时已知;
- 如果
val
声明写在一个函数或循环体内,它在每次调用或执行时可以赋予不同的值。
kotlin
var myBirthDate = "02/12/1993"
val myNewBirthDate = myBirthDate
println(myNewBirthDate)
Output:
kotlin
02/12/1993
可变的变量:
在可变变量中,我们可以改变变量的值.
kotlin
var myAge = 25
myAge = 26 // compiles successfully
println("My new Age is ${myAge}")
Output:
kotlin
My new Age is 26
Kotlin中var和val的区别
特性 | var |
val |
---|---|---|
可修改性 | 变量的值可以修改 | 变量的值不可修改 |
声明方式 | var 用于声明可变变量 |
val 用于声明只读变量 |
适用场景 | 当变量需要修改值时使用 | 当变量不需要修改值时使用 |
类型 | 适用于任意类型 | 适用于任意类型 |
引用类型变量 | 引用类型的引用可以修改 | 引用类型的引用不可修改,但对象内部数据可以修改 |
示例 | var x = 10 x = 20 |
val y = 10 y = 20 会报错 |
额外说明:
对于引用类型,val
确保的是引用不变,而不是对象的内容。例如,val
声明的列表可以修改它的元素(如果该列表是可变的),但不能将其指向一个新的列表。
kotlin
val list = mutableListOf(1, 2, 3)
list.add(4) // 这是合法的,修改列表内容
// list = mutableListOf(5, 6) // 错误,不能改变 list 的引用
Example1:
kotlin
fun main()
{
var marks = 10
println("Previous marks is " + marks)
marks = 30
println("New marks " + marks)
}
Output:
kotlin
Previous marks is 10
New marks 30
Example 2:
kotlin
fun main()
{
val marks = 10
println("Previous marks is " + marks)
marks = 30
println("new marks " + marks)
}
Output:
kotlin
Val cannot be reassigned
Example 3:
kotlin
// Changing values of val object
fun main()
{
val book = Book("Java", 1000)
println(book)
book.name = "Kotlin"
println(book)
}
data class Book(var name : String = "",
var price : Int = 0)
Output:
kotlin
Book(name=Java, price=1000)
Book(name=Kotlin, price=1000)
变量的作用域(scope)
变量的作用域是有限的,它只在声明它的代码块内有效({... ...})。例如,在循环内部声明的变量,只能在该循环内访问,外部无法访问。
-
作用域范围:变量存在于它被声明的代码块(例如循环或函数)内,超出该范围就无法访问。
-
嵌套作用域:在嵌套的循环或代码块中,即使使用相同的变量名,它们是独立的,互不影响。
-
函数参数与局部变量:如果一个函数有参数 x,而在函数内部的循环中重新声明一个 x,那么函数内部的 x 会覆盖参数 x,即它们是不同的变量。
总结:变量的作用域限制在它声明的代码块内,同名的变量在不同作用域中是独立
命名规则:
每个变量都应该使用lowerCamelCas(小驼峰)来命名
Example:
kotlin
val myBirthDate = "02/12/1994"