|------------------|
| 1.6 变量与类型(重点) |
| 1.6.1 变量推断 |
| 1.6.2 多变量定义 |
| 1.6.3 var和val的区别 |
| 1.6.3.1 是否可变 |
| 1.6.3.2 延迟加载 |
1.6 变量与类型**(** 重点**)**
val修饰的变量,相当于Java中final修饰的变量;
java
// 定义常量s1,使用字符串"1"赋值,自动推断为String类型,值不可变
val s1 = "1"
// 定义常量s2,手动指定类型为String,此时需要保证所赋值类型匹配
val s2: String = "2"
// 使用val定义基本数据类型时,值不可变,可以使用val重新定义
变量声明一定要初始化
1.6.1 变量推断
含义:声明变量时,可以不指定变量类型,编译器会根据赋值内容自动推断当前变量的类型。
Go
// 定义变量a1,使用1赋值,自动推断为Int类型
var i1 = 1
print(i1.isInstanceOf[Int])
//类型确定后,就不能再赋值的类型
i1 = 1.1
1.6.2 多变量定义
Scala
//Java中支持一行同时定义多个同类变量:
String a = "Hello", c = "hello";
int x = 5, y = 5;
//scala中的多个变量的初始化:
val (a, b, c) = (1, 2, "a")
// 定义变量a3,a4,同时赋值为10
var i3,i4 = 10;
1.6.3 var和val的区别
# val和var的区别
- 是否可变
- 是否可以有lazy修饰:延迟加载
1.6.3.1 是否可变
使用val声明一个常量或值:
val修饰的变量是不可变的,注意不可变的是引用,而不是内容
,val修饰的变量在编译后,等同于加上final。
使用var 声明一个变量:var修饰的变量,内容和引用都可变
(扩展一下什么是值类型,什么是引用类型,可以使用数组举例,引用不可变,变的是内容。)
Scala
/**可变和不可变?
可变和不可变,指的是变量本身存的内容,值类型变量存的是数据本身,而引用类型变量存的是数据的引用,
值类型和引用类型?
值类型与引用类型区别:
存储方式:直接存储数据本身 vs 存储的是数据的引用,数据存储在数据堆中
内存分配:分配在栈中 vs 分配在堆中
效率:效率高,不需要地址转换 vs 效率较低,需要进行地址转换
内存回收: 使用完后立即回收 vs 使用完后不立即回收,而是交给GC处理回收
*/
scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)
scala> arr = Array(1,2,3)
<console>:8: error: reassignment to val
arr = Array(1,2,3)
scala> arr(0)=10
scala> arr
res1: Array[Int] = Array(10, 2, 3, 4, 5)
1.6.3.2 延迟加载
只有val修饰的变量才能被lazy修饰
,使用lazy定义变量后,只有在调用该变量时才会实例化这个变量的值,类似方法,先声明,后调用。
java
scala> val a = 10
a: Int = 10
scala> lazy val b = 100
b: Int = <lazy>
scala> b
res2: Int = 100
scala> var c = 10
c: Int = 10
scala> lazy var d = 100
<console>:1: error: lazy not allowed here. Only vals can be lazy
lazy var d = 100
^
scala> def e = 1000
e: Int
scala> e
res3: Int = 1000
使用val 还是var?
# 官方推荐val,使用val的好处:
- 更安全
- 代码可读性更高
- 资源回收更快,方法执行完,val所定义的变量即回收
代码
Scala
package com.qianfeng.scala
/**
* 变量必须赋值或者是使用占位符初始化
* val 变量名称[:类型] = 值 : 不可变 ,相当于java的final修饰
* var 变量名称[:类型] = 值 : 可变
* lazy val 变量名称[:类型] = 值 懒加载,必须使用val
*
* 注意:
* 1、官方推荐我们使用val
* 2、类型自动推断
*/
object Demo02_Variable {
def main(args: Array[String]): Unit = {
val a = 100
val b:String = "abc"
println(a)
//修改a的值
//a = 200 //报错:不能改变值
var c = 100
println(c)
c = 200
println(c)
lazy val d = 1000
println(d)
//lazy var dd = 1000 //报错:lazy只能修饰val变量
//多变量
val (aa,cc,dd) = (1,2,"hello")
println(aa,dd)
val i1,i2 = 10
println(i1,i2)
}
}
scala下载安装地址: