根據與 Java 中運算符的區別,Kotlin 中的運算符能夠分爲四類:java
與 Java 中徹底相同的,如加減乘除等基本數學運算等;編程
Java 中有,可是用途不一樣的,好比冒號;數組
Java 中有而 Kotlin 中沒有的,重點 ;app
Java 中沒有而 Kotlin 中有的,重點。ide
什麼是操做符重載?讓咱們回想一下 Java 學習時涉及到的 多態 概念,對於一個對象,咱們並不在意它是什麼類型,只關注特定的行爲,讓程序在執行的時候根據對象的實際類型執行具體的實現方法,這就是多態,它讓咱們擺脫了類型的束縛,作到面向 行爲 編程。函數
理解了多態的概念,就能理解操做符重載。舉個例子,一樣是一個 + 號,用在兩個數字之間表示加法,用在字符串之間則表示將它們鏈接成一個新字符串,編譯器怎麼將同一個加號識別爲不一樣的行爲呢?咱們可讓這些數據類型使用名稱相同的函數 重載 + 號這個運算符,編譯器在遇到 + 號時會自動把它理解爲執行這個函數,而後根據不一樣的數據類型執行不一樣的操做。學習
對於 Kotlin 來講,全部重載了運算符的函數都要用 operator 關鍵字標記。好比,Kotlin 中規定 + 號應該重載爲 plus() 函數,全部基礎類型都重載這個函數,執行 a + b 實際就是執行 a.plus(b),對於 Int.plus() 函數,它執行的就是加法,對於 String.plus() 函數,它執行的就是字符串鏈接。spa
全部的 Kotlin 操做符都是經過特定名稱的函數重載實現的,具體的重載方法咱們會結合具體的操做符講解。orm
這一部分咱們就簡單給出運算符與重載函數吧:對象
主要是兩個:== / != 和 []。
== 和 !=
咱們先看一下這兩個運算符的重載:
a?.equals(b) ?: (b===null) 這個表達式,用 Java 寫出來是這樣的:
if(a != null){ return a.equals(b);}else{ return b == null;}
能夠看到,它實際上調用的是 equals 方法來比較兩個元素是否 對象相等,而不是 Java 中的比較 引用相同。
若是須要比較兩個對象的引用是否相同,可使用 === 和 !== 操做符,它們與 Java 中的== 和 != 是同樣的。
[]
這個運算符的重載:
與 Java 中的不一樣之處在於,Kotlin 中這個運算符不只能夠用在 數組 變量後,也能夠用在集合 變量後,能夠方便地 調用和操做 數組和集合中的元素。
與 Java 相比,Kotlin 拋棄了類 C 風格的 位運算符,只是定義了幾個函數:
對於 <<=、>>=、>>>= 這三個賦值操做符,Kotlin 中沒有與之對應的函數。
中綴表示法 是 Kotlin 定義的一種特殊的函數調用方式,標記爲 infix ,而且只有一個參數的擴展函數或成員函數,可使用這種表示方法。
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 的整數