根據與 Java 中運算符的區別,Kotlin 中的運算符可以分爲四類:
與 Java 中完全相同的,如加減乘除等基本數學運算等;
Java 中有,但是用途不同的,比如冒號;
Java 中有而 Kotlin 中沒有的,重點 ;
Java 中沒有而 Kotlin 中有的,重點。
1. 操作符重載的概念
什麼是操作符重載?讓我們回想一下 Java 學習時涉及到的 多態 概念,對於一個對象,我們並不在乎它是什麼類型,只關注特定的行爲,讓程序在執行的時候根據對象的實際類型執行具體的實現方法,這就是多態,它讓我們擺脫了類型的束縛,做到面向 行爲 編程。
理解了多態的概念,就能理解操作符重載。舉個例子,同樣是一個 + 號,用在兩個數字之間表示加法,用在字符串之間則表示將它們連接成一個新字符串,編譯器怎麼將同一個加號識別爲不同的行爲呢?我們可以讓這些數據類型使用名稱相同的函數 重載 + 號這個運算符,編譯器在遇到 + 號時會自動把它理解爲執行這個函數,然後根據不同的數據類型執行不同的操作。
對於 Kotlin 來說,所有重載了運算符的函數都要用 operator 關鍵字標記。比如,Kotlin 中規定 + 號應該重載爲 plus() 函數,所有基礎類型都重載這個函數,執行 a + b 實際就是執行 a.plus(b),對於 Int.plus() 函數,它執行的就是加法,對於 String.plus() 函數,它執行的就是字符串連接。
所有的 Kotlin 操作符都是通過特定名稱的函數重載實現的,具體的重載方法我們會結合具體的操作符講解。
2. Kotlin 中與 Java 完全相同的運算符
這一部分我們就簡單給出運算符與重載函數吧:
3. Kotlin中與 Java 使用有差異的運算符
主要是兩個:== / != 和 []。
== 和 !=
我們先看一下這兩個運算符的重載:
a?.equals(b) ?: (b===null) 這個表達式,用 Java 寫出來是這樣的:
if(a != null){ return a.equals(b);}else{ return b == null;}
可以看到,它實際上調用的是 equals 方法來比較兩個元素是否 對象相等,而不是 Java 中的比較 引用相同。
如果需要比較兩個對象的引用是否相同,可以使用 === 和 !== 操作符,它們與 Java 中的== 和 != 是一樣的。
[]
這個運算符的重載:
與 Java 中的不同之處在於,Kotlin 中這個運算符不僅可以用在 數組 變量後,也可以用在集合 變量後,可以方便地 調用和操作 數組和集合中的元素。
4. Java 中有而 Kotlin 中沒有的運算符
與 Java 相比,Kotlin 拋棄了類 C 風格的 位運算符,只是定義了幾個函數:
對於 <<=、>>=、>>>= 這三個賦值操作符,Kotlin 中沒有與之對應的函數。
中綴表示法 是 Kotlin 定義的一種特殊的函數調用方式,標記爲 infix ,並且只有一個參數的擴展函數或成員函數,可以使用這種表示方法。
5. Java 中沒有而 Kotlin 中有的運算符
is 和 !is
這兩個運算符相當於 Java 中的 instanceof 運算符,用於檢查對象是否是某個類的實例。
in 和 !in
a in b 重載爲 b.contains(a),用於檢查 a 是否是 b 內的元素,這裏的 b 可以是數組、集合和區間。這個運算符還可以用在 for 循環中,用來遍歷 b 中的元素:
val b = arrayOf(1, 2, 3)for(a in b) println(a)
..
a .. b 重載爲 a.rangeTo(b),返回一個從 a 到 b 的 區間,a 和 b 這兩個邊界也包含在內。這裏的 a 和 b 要求都是整數,而且 a <= b。
使用區間控制循環次數,要比 Java 和 C 中的方法更加方便清晰:
for(i in 1..10) println(i) //輸出從 1 到 10 的整數