變量是保存存儲值的內存位置的名稱。這意味着當創建變量時,可以在內存中保留一些空間。
根據變量的數據類型,編譯器分配內存並決定可以存儲在預留內存中的內容。因此,通過為變量分配不同的數據類型,可以在這些變量中存儲整數,小數或字符。
變量聲明
Scala具有用於聲明變量的不同語法。它們可以被定義為值,即常數或變量。 這里,myVar
使用關鍵字var
聲明。 它是一個可以改變值的變量,這稱為可變變量。 以下是使用var
關鍵字定義變量的語法 -
語法
var myVar : String = "Foo"
下面示例中,myVal
使用關鍵字val
聲明。它是一個不能被改變的變量,這被稱為不可變變量。 以下是使用val
關鍵字定義變量的語法 -
val myVal : String = "Foo"
可變數據類型
變量的類型在變量名稱和等號之前指定。可以通過其數據類型來定義任何類型的Scala變量,如下所示:
val or val VariableName : DataType = [Initial Value]
如果您沒有為變量分配任何初始值,則有效的語法如下:
var myVar :Int; val myVal :String;
可變類型推斷
當為變量分配初始值時,Scala編譯器可以根據分配給它的值來推斷變量的類型。這被稱為變量類型推斷。 因此,可以編寫這樣的變量聲明 -
var myVar = 10; val myVal = "Hello, Scala!";
默認情況下,myVar
將會被計算推斷為Int
類型,myVal
將計算推斷為String
類型變量。
多個賦值
Scala支持多個賦值。如果代碼塊或方法返回一個元組(Tuple - 保持不同類型的對象的集合),則可以將元組分配給一個val
變量。
注:我們將在隨后的章節學習元組。
val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
類型推斷得到正確的類型 -
val (myVar1, myVar2) = Pair(40, "Foo")
示例程序
以下是一個示例程序,用於說明Scala中變量聲明的過程。該程序聲明了四個變量 - 兩個變量用變量聲明定義,其余兩個變量沒有變量聲明。
例子
object Demo { def main(args: Array[String]) { var myVar :Int = 10; val myVal :String = "Hello Scala with datatype declaration."; var myVar1 = 20; val myVal1 = "Hello Scala new without datatype declaration."; println(myVar); println(myVal); println(myVar1); println(myVal1); } }
將上述程序保存在源文件:Demo.scala中,使用以下命令用於編譯和執行此程序。
D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo
10
Hello Scala with datatype declaration.
20
Hello Scala new without datatype declaration.
D:\software\scala-2.12.3\bin>
變量的作用域
Scala中的變量可以有三個不同的范圍,具體取決於它們被使用的位置。它們可以作為字段存在,作為方法參數和局部變量存在。以下是每種類型范圍的詳細信息。
字段
字段是屬於對象的變量。這些字段可以從對象中的每個方法的內部訪問。根據字段聲明的訪問修飾符,也可以在對象外部訪問字段。 對象字段可以是可變的和不可變的類型,可以使用var
或val
來定義。
方法參數
方法參數是在調用該方法時用於傳遞方法中的值的變量。方法參數只能從方法內部訪問,但是如果從方法外部引用了對象,則可以從外部訪問傳入的對象。方法參數始終是不可變的,由val
關鍵字定義。
局部變量
局部變量是在方法中聲明的變量。局部變量只能從方法內部訪問,但如果從方法返回,則您創建的對象可能會轉義該方法。局部變量可以是可變的和不可變的類型,可以使用var
或val
定義。
包,類或對象的成員可以使用私有(private
)和受保護(protected
)的訪問修飾符進行標注,如果不使用這兩個關鍵字的其中一個,那么訪問將被視為公開(public
)的。這些修飾符限制了對某些代碼區域的成員訪問。
1.算術運算符
下表顯示了Scala支持的所有算術運算符。假設變量A
的值是10
,變量B
的值是20
,那么 -
運算符 | 描述 | 示例 |
---|---|---|
+ |
將兩個操作數相加 | A + B = 30 |
- |
從第一個操作數減去第二個操作數 | A − B = -10 |
* |
將兩個操作數相乘 | A * B = 200 |
/ |
將第一個操作數除以第二個操作數 | |
% |
模數運算符和整數除法后的余數。 | B % A = 0 |
++ |
遞增運算符將整數值增加1 。 |
A++ = 11 |
-- |
遞減運算符將整數值減1。 | A-- = 9 |
object Demo { def main(args: Array[String]) { var a = 10; var b = 20; var c = 25; var d = 25; println("a + b = " + (a + b) ); println("a - b = " + (a - b) ); println("a * b = " + (a * b) ); println("b / a = " + (b / a) ); println("b % a = " + (b % a) ); println("c % a = " + (c % a) ); } }
2.關系運算符
下表顯示了Scala語言支持的關系運算符。假設變量A=10
,變量B=20
,則 -
運算符 | 描述 | 示例 |
---|---|---|
== |
檢查兩個操作數的值是否相等。 如果相等,則條件成立。 | (A == B) 結果為false |
!= |
檢查兩個操作數的值是否相等。 如果值不相等,則條件成立。 | (A != B) 結果為true |
> |
檢查左操作數的值是否大於右操作數的值。 如果是,則條件成立。 | (A > B) 結果為false |
< |
檢查左操作數的值是否小於右操作數的值。 如果是,則條件成立。 | (A < B) 結果為true |
>= |
檢查左操作數的值是否大於等於右操作數的值。 如果是,則條件成立。 | (A >= B) 結果為false |
<= |
檢查左操作數的值是否小於等於右操作數的值。 如果是,則條件成立。 | (A <= B) 結果為true |
object Demo { def main(args: Array[String]) { var a = 10; var b = 20; println("a == b = " + (a == b) ); println("a != b = " + (a != b) ); println("a > b = " + (a > b) ); println("a < b = " + (a < b) ); println("b >= a = " + (b >= a) ); println("b <= a = " + (b <= a) ); } }
3.邏輯運算符
下表顯示了Scala支持的所有邏輯運算符。 假設變量A=1
,變量B=0
,則 -
運算符 | 描述 | 示例 |
---|---|---|
&& |
邏輯與運算符。 如果兩個操作數都不為零,則條件成立。 | (A && B) 結果為false |
![]() |
稱為邏輯或運算符。如果兩個操作數中的任何一個非零,則條件成立。 | (A![]() true |
! |
稱為邏輯非運算符,它用於反轉其操作數的邏輯狀態。如果條件為真,則邏輯NOT 運算符將使其結果為false 。 |
object Demo { def main(args: Array[String]) { var a = true; var b = false; println("a && b = " + (a&&b) ); println("a || b = " + (a||b) ); println("!(a && b) = " + !(a && b) ); } }
4.按位運算符
按位運算符對位進行操作,並執行逐位運算。 &
,|
和^
的真值表如下 -
p | q | p & q | p/q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
下表列出了Scala支持的按位運算符。假設變量A=60
,變量B=13
,則 -
運算符 | 描述 | 示例 |
---|---|---|
& |
如果二進制AND運算符存在於兩個操作數中,則二進制AND運算符將對結果復制一位。 | (A&B)= 12 ,即0000 1100 |
![]() |
二進制OR運算符如果存在於任一操作數中,則復制一位。 | (A![]() 0011 1101 |
^ |
二進制XOR操作符復制該位,如果它設置在一個操作數中,而不是兩者。 | (A ^ B) = 49 , 即, 0011 0001 |
~ |
二進制補碼運算符是一元的,具有“翻轉”位的作用。 | (~A)= -61 ,即 1100 0011 的補碼形式。 |
<< |
二進制左移操作符,左操作數值左移由右操作數指定的位數。 | A << 2 = 240 即, 1111 0000 |
>> |
二進制右移操作符,左操作數值被右操作數指定的位移動。 | A >> 2 = 15 即,0000 1111 |
5.賦值運算符
下表列出了Scala語言支持的賦值運算符 -
運算符 | 描述 | 示例 |
---|---|---|
= |
簡單賦值運算符,將右側操作數的值分配給左側操作數 | C = A + B ,將A + B 的值分配給C |
+= |
相加與賦值運算符。它將右操作數添加到左操作數,並將結果分配給左操作數。 | C + = A 等價於C = C + A |
-= |
相減與賦值運算符。它從左操作數中減去右操作數,並將結果分配給左操作數。 | C -= A 等價於 C = C - A |
*= |
乘以與賦值運算符。它將右操作數與左操作數相乘,並將結果分配給左操作數。 | C * = A 等價於C = C * A |
/= |
除以與賦值運算符。它將左操作數與右操作數分開,並將結果分配給左操作數。 | C /= A 等價於C = C / A |
%= |
模數與賦值運算符。它需要使用兩個操作數的模數,並將結果分配給左操作數。 | C %= A 等價於C = C % A |
<<= |
左移與賦值運算符 | C <<= 2 等價於C = C << 2 |
>>= |
右移與賦值運算符 | C >> = 2 等價於C = C >> 2 |
&= |
按位與賦值運算符 | C &= 2 等價於C = C & 2 |
^= |
按位異或運算符和賦值運算符。 | C ^= 2 等價於C = C ^ 2 |
![]() |
按位包含OR和賦值運算符。 | ![]() |
6.運算符優先級
運算符優先級決定表達式中術語的分組,並決定如何評估計算表達式。 某些運算符的優先級高於其他運營商; 例如,乘法運算符的優先級高於加法運算符,則先要執行乘法運算符的運算。
讓我們通過下面的例子了解優先級:
int value = 10 + 20 * 10;
value
變量計算結果為:210
,因為*
(乘法運算符)的優先級比+
(加法運算符)高,所以在+
(加法運算符)之前進行求值。
C語言運算符的優先級和關聯性如下:
分類 | 運算符 | 關聯性 |
---|---|---|
后綴 | () [] -> . ++ - - |
左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof |
右到左 |
乘法 | * / % |
左到右 |
加法 | + - |
左到右 |
位移 | << >> |
左到右 |
關系 | < <= > >= |
左到右 |
等於 | == != |
左到右 |
按位與 | & |
左到右 |
位異或 | ^ |
左到右 |
按位或 | / |
左到右 |
邏輯與 | && |
左到右 |
邏輯或 | // |
左到右 |
條件 | ?: |
右到左 |
賦值 | = += -= *= /= %=>>= <<= &= ^= /= |
右到左 |
逗號 | , |
左到右 |