1.算術(shù)運算符重載
| 表達(dá)式 | 翻譯為 |
|---|---|
| a + b | a.plus(b) |
| a - b | a.minus(b) |
| a * b | a.times(b) |
| a / b | a.div(b) |
| a % b | a.rem(b) 、 |
| a..b | a.rangeTo(b) |
代碼示例
fun main(args: Array<String>) {
val number1 = 12.5
val number2 = 3.5
var result: Double
result = number1 + number2
println("number1 + number2 = $result")
result = number1 - number2
println("number1 - number2 = $result")
result = number1 * number2
println("number1 * number2 = $result")
result = number1 / number2
println("number1 / number2 = $result")
result = number1 % number2
println("number1 % number2 = $result")
}
輸出:
number1 + number2 = 16.0
number1 - number2 = 9.0
number1 * number2 = 43.75
number1 / number2 = 3.5714285714285716
number1 % number2 = 2.0
+操作符也可以用于連接字符串
代碼示例
fun main(args: Array<String>) {
val start = "沒說過!"
val middle = "不是我! "
val end = "別瞎說"
val writer= "------魯迅"
val result = start + middle + end + writer
println(result)
}
輸出
沒說過!不是我!別瞎說------魯迅
2.賦值操作符
| 表達(dá)式 | 翻譯為 |
|---|---|
| a += b | a.plusAssign(b) |
| a -= b | a.minusAssign(b) |
| a *= b | a.timesAssign(b) |
| a /= b | a.divAssign(b) |
| a %= b | a.remAssign(b)、 |
對于賦值操作符需要注意的是,當(dāng)操作內(nèi)容可變的對象時,在聲明對象的時候不能使用var
data class Student(var age: Int) {
operator fun plus(other: Student): Student{
return Student(age + other.age)
}
operator fun plusAssign(other: Student) {
age += other.age
}
}
fun main() {
// var s1 = Student(10) // 不能這樣聲明Student,否則執(zhí)行 += 時會報錯.
val s1 = Student(10)
val s2 = Student(11)
s1 += s2
}
為什么使用 var 定義的 s1 會導(dǎo)致 += 報錯呢?因為理論上,執(zhí)行 += 時,既可以調(diào)用 s1 = s1 + s2,也就是 s1 = s1.plus(s2),又可以調(diào)用 s1.plusAssign(s2),都符合操作符重載約定,這樣就會產(chǎn)生歧義,而如果使用 val 定義 s1,則只可能執(zhí)行 s1.plusAssign(s2),因為 s1 不可被重新賦值,因此 s1 = s1 + s2 這樣的語法是出錯的,永遠(yuǎn)不可能調(diào)用,那么調(diào)用 s1 += s2 就不會產(chǎn)生歧義了。
既然編譯器會幫我把 a += b 解釋成 a = a + b,那兩者之間有何區(qū)別呢?
+(plus) 始終返回一個新的對象
+= (plusAssign) 用于內(nèi)容可變的類型,修改對象自身的內(nèi)容。
在kotlin的集合庫中也有類似的實現(xiàn)
fun main() {
val list = arrayListOf(1, 2)
list += 3
println("list=$list")
val newList = list + 4
println(println("newList=$newList"))
}
運行輸出:
list=[1, 2, 3]
newList=[1, 2, 3, 4]
按住ctrl鼠標(biāo)點擊 進(jìn)入源碼
public inline operator fun <T> MutableCollection<in T>.plusAssign(element: T) {
this.add(element)
}
代碼很簡單,直接調(diào)用了原集合的add()方法
用同樣的方式點擊
public operator fun <T> Collection<T>.plus(element: T): List<T> {
val result = ArrayList<T>(size + 1)
result.addAll(this)
result.add(element)
return result
}
代碼同樣很簡單,只不過這次它是新建了一個集合,將原來的集合addAll(),然后再把element也加入新的集合里返回。
3.in操作符
| 表達(dá)式 | 翻譯為 |
|---|---|
| a in b | b.contains(a) |
| a !in b | !b.contains(a) |
fun main(args: Array<String>) {
val numbers = intArrayOf(1, 4, 42, -3)
if (4 in numbers) {
println("numbers array contains 4.")
}
}
輸出
numbers array contains 4.
in操作符也可以用于循環(huán)中
fun main(args: Array<String>) {
val numbers = intArrayOf(1, 2, 3, 4)
for(i in numbers) {
print("$i ")
}
}
輸出
1 2 3 4
4. Invoke操作符
| 表達(dá)式 | 翻譯為 |
|---|---|
| a() | a.invoke() |
| a(arg) | a.invoke(arg) |
| a(arg_1,arg_2, ...,arg_n) | a.inkove(arg_1, arg_2, ..., arg_n) |