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修飾的變量;
// 定義常量s1,使用字符串"1"賦值,自動推斷為String類型,值不可變
val s1 = "1"
// 定義常量s2,手動指定類型為String,此時需要保證所賦值類型匹配
val s2: String = "2"
// 使用val定義基本數據類型時,值不可變,可以使用val重新定義
變量聲明一定要初始化
1.6.1 變量推斷
含義:聲明變量時,可以不指定變量類型,編譯器會根據賦值內容自動推斷當前變量的類型。
// 定義變量a1,使用1賦值,自動推斷為Int類型
var i1 = 1
print(i1.isInstanceOf[Int])
//類型確定后,就不能再賦值的類型
i1 = 1.1
1.6.2 多變量定義
//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修飾的變量,內容和引用都可變
(擴展一下什么是值類型,什么是引用類型,可以使用數組舉例,引用不可變,變的是內容。)
/**可變和不可變?
可變和不可變,指的是變量本身存的內容,值類型變量存的是數據本身,而引用類型變量存的是數據的引用,
?
值類型和引用類型?
值類型與引用類型區別:
存儲方式:直接存儲數據本身 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 valarr = 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定義變量后,只有在調用該變量時才會實例化這個變量的值,類似方法,先聲明,后調用。
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 lazylazy var d = 100^
scala> def e = 1000
e: Int
scala> e
res3: Int = 1000
使用val 還是var?
# 官方推薦val,使用val的好處: - 更安全 - 代碼可讀性更高 - 資源回收更快,方法執行完,val所定義的變量即回收
代碼
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 = 100val b:String = "abc"println(a)//修改a的值//a = 200 //報錯:不能改變值
?var c = 100println(c)c = 200println(c)
?lazy val d = 1000println(d)
?//lazy var dd = 1000 ? //報錯:lazy只能修飾val變量
?//多變量val (aa,cc,dd) = (1,2,"hello")println(aa,dd)val i1,i2 = 10println(i1,i2)}
}
?
?scala下載安裝地址:
scala安裝使用教程_一篇搞定!-CSDN博客?