本章主講Kotlin的運算符
此外這系列博客還不完善,請等待我完善好。當你發現這行字沒有了,就是穩定了,謝謝。
一、運算符
1. 算術運算符
1.1 一元運算符
一元運算符一共三個,-、++ 、--。
fun main(args: Array<String>) {
var int = 1
val a = int++
val b = ++int
println(-1)
println(a)
println(b)
}
結果:
-1 (取反符)
1 (先賦值再運算,所以1沒有問題)
3 (先運算再賦值,3沒有問題)
1.2 二元運算符
二元運算符,比較簡單,就是一些數學基本運算,它需要對基本數據類型使用。
+(加)、-(減)、*(撐)、/)(除)和%(取餘數)
栗子:
fun main(args: Array<String>) {
var int = 10
val add = int + 1
val minus = int - 1
val multiply = int * 1
val divide = int / 1
val `%` = int % 5
println(add)
println(minus)
println(multiply)
println(divide)
println(`%`)
}
結果:
11
9
10
10
0
1.3 算術賦值運算符
就是+=、-=、*=、/=和%=,這個你要試試就行了
栗子:
fun main(args: Array<String>) {
val int = 10
var a = 100
a += int
println(a)
a -= int
println(a)
a *= int
println(a)
a /= int
println(a)
a %= int
println(a)
}
結果:
110
100
1000
100
0簡單例子說明就是a+=int ==a=a+int
使用方式很簡單,但是不能給沒有初始化的值使用。
fun main(args: Array<String>) {
val int = 10
var a += int //a沒有初始化報錯
}
2. 關係運算符
關係運算符是比較兩個表達式大小的的運算符,結果爲布爾類型。
<、>、== 、 ===、 !=、 !==、 <= 、>= 這8種,我先把簡單演示一下,再講複雜的。
栗子:簡單實例
fun main(args: Array<String>) {
val a = 1
println(a > 0) //a大於0
println(a < 0) //a小於0
println(a <= 1) //a小於等於0
println(a >= 0) //a小於等於0
}
true
false
true
true
很簡單吧!
下面來看==、!=、===、!==
==就是比較它們值,===比較的是引用。==就是Java中的equals方法,===就是Java中的==,它比較的是地址值。
同樣先簡單的例子:來說明==和!=的區別
fun main(args: Array<String>) {
val a = 1
val b = 1
println(a == b) //就是值判斷是否相等
println(a != b) //取反
}
true
false 兩個值相等,然後就取反。(就是和正確結果相反)
再來看===和!==的區別
fun main(args: Array<String>) {
val a = 1
val b = 1
println(a === b)
println(a !== b)
}
結果相同。因爲在比較基本類型的時候,比較的是值。
true
false
現在看引用類型
先寫個人的類
class Person(val name: String, val age: Int) {
}
測試:
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
println(person1 == person2)
println(person1 != person2)
}
結果:
false 因爲比較的是引用類型。Any.equals() 函數比較的是兩個對象的引用是否相等。也就是說,如果沒有覆蓋 equals() 函數,== 與 === 的結果是相同的。如果某個類有比較屬性是否相等的需求,需要自行覆蓋 equals() 方法。 來自歡顏 的博客
true
那我們重寫Person類的equals方法,試試
class Person(val name: String, val age: Int) {
override fun equals(other: Any?): Boolean {
if (name == "王" || age == 11) {
return true
}
return false
}
}
true
false好的,驗證成功,接下看===表現
===是比較的地址值,還是上面的例子,Person類不變。
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
println(person1 === person2)
println(person1 !== person2)
}
結果
false 不是一個對象,地址值肯定不同
true
再看
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
val person3 = person1
println(person1 === person3)
println(person1 !== person3)
}
結果:
true
false我們把重寫的equals方法刪除了
3.其它運算符
Kotlin 支持以下操作符和特殊符號:
+
、-
、*
、/
、%
—— 數學操作符
*
也用於將數組傳遞給 vararg 參數
=
賦值操作符
也用於指定參數的默認值
+=
、-=
、*=
、/=
、%=
—— 廣義賦值操作符
++
、--
—— 遞增與遞減操作符
&&
、||
、!
—— 邏輯“與”、“或”、“非”操作符(對於位運算,請使用相應的中綴函數)
==
、!=
—— 相等操作符(對於非原生類型會翻譯爲調用equals()
)
===
、!==
—— 引用相等操作符
<
、>
、<=
、>=
—— 比較操作符(對於非原生類型會翻譯爲調用compareTo()
)
[
、]
—— 索引訪問操作符(會翻譯爲調用get
與set
)
!!
斷言一個表達式非空
?.
執行安全調用(如果接收者非空,就調用一個方法或訪問一個屬性)
?:
如果左側的值爲空,就取右側的值(elvis 操作符)
..
創建一個區間
:
分隔聲明中的名稱與類型
?
將類型標記爲可空
->
分隔 lambda 表達式的參數與主體
分隔在函數類型中的參數類型與返回類型聲明
分隔 when 表達式分支的條件與代碼體
@
引入一個註解
引入或引用一個循環標籤
引入或引用一個 lambda 表達式標籤
引用一個來自外部作用域的 “this”表達式
引用一個外部超類
;
分隔位於同一行的多個語句
$
在字符串模版中引用變量或者表達式
_
在 lambda 表達式中代替未使用的參數
在解構聲明中代替未使用的參數
-----------------------來自官網
4.運算符優先級
-----------來自Kotlin從小白到大牛