val与var
常量与变量的申明
1:var: 申明的是变量, val申明的是常量,所以值不可变
object VarAndVal {
var a: String = "1"
val b: String = "2"
def main(args: Array[String]): Unit = {
println(s"a的值:$a")
println(s"b的值:$b")
}
}
常量与变量的初始化与占位符
占位符
Scala为了让函数字面量更加精简,还可以使用下划线作为占位符,用来表示一个或多个参数。
object Placeholder {
//情况一 对变量进行默认初始化 注意占位符与var一同使用时必须指定数据类型
var a: String = _
def main(args: Array[String]): Unit = {
//情况二 占位符,表示某一个参数
val arr1 = Array("张三", "李四", "王五")
arr1.foreach(println(_)) //张三 李四 王五
val arr2 = Array(1, 2, 3, 4, 5, 6, 7, 8)
arr2.filter(_ > 3).foreach(println(_)) //4 5 6 7 8 9
//情况三 访问tuple(元组)的某个元素时通过索引_n来取得第n个元素
val t = ("张三", 1, 10.1)
println(t._1) //张三
}
}
常量与变量的初始化
在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来。
object VarAndVal {
var a = "1"
val b = "2"
def main(args: Array[String]): Unit = {
println(s"a的值:$a")
println(s"b的值:$b")
}
}
注意:
1.常量必须初始化,所以scala一定可以推断出数据类型,那么我们即可以指定数据类型,也可以不指定数据类型。
object VarAndVal {
val a: String = "1"
val b = "2"
//val b: String = _ 报错 因为val的值必须初始化并且不能与占位符使用
def main(args: Array[String]): Unit = {
println(s"a的值:$a")
println(s"b的值:$b")
}
}
2.全局申明变量可以使用占位符号(_)初始化, 但是这种情况必须指定数据类型。因为如果既不初始化也不指定数据类型,scala无法推断出数据类型
object VarAndVal {
def main(args: Array[String]): Unit = {
var c = _ //报错 因为变量在局部中必须初始化
}
}
3…局部申明变量必须初始化
object VarAndVal {
private var a: String = _
// private val b: String = _ 这里这样写会报错 因为val的值必须初始化并且不能与占位符使用
def main(args: Array[String]): Unit = {
a = "1"
println(s"a的值:$a")
}
}
lazy
懒加载: 使用lazy关键字修饰后,只有在使用时,才会调用或计算。
注意:
1.不可以与var使用
object Lazy {
def main(args: Array[String]): Unit = {
// lazy var a: String = "a" 这么写报错 lazy只能与val使用
lazy val a: String = "a"
println(a);
}
}
- var声明的时变量,val声明的是常量 ------------ 对,局部变量必须初始化
- 申明变量时一定可以不初始化 ------------错,局部变量必须初始化
- .申明变量时一定可以不指定数据类型 ------------错,当不初始化时必须指定数据类型
- 申明常量时一定可以不指定数据类型 ------------对,因为必须会初始化
- 申明常量时一定必须会初始化 ------------对
- lazy可以和var与val使用 ------------错,只可以与val使用
- 占位符只可以与var使用 ------------对,和val使用的话val值不可变,没有意义所以会报错