在Java中,运算符基本是用于数字的计算:+ - * / % ++ –。在Kotlin中通过对运算符进行重载,允许任意两个对象进行相加,或者是进行更多其他的运算操作。
重载二元运算符
语法结构
class Obj {
operator fun plus(obj: Obj): Obj {
// 处理相加的逻辑
}
}
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2
2、实例,实现一个Money类,重载plus方法:
class Money(val value: Int) {
var sum: Int = 0
operator fun plus(money: Money): Money {
sum = value + money.value
return Money(sum)
}
}
调用实现:
fun main() {
val money1 = Money(5)
val money2 = Money(6)
val money3 = money1 + money2;
println(money3.value)
}
//结果
11
上面例子就使用运算符重载实现了让两个Money对象相加的功能。Kotlin的语法糖,看下反编译后的Java代码:
Money money1 = new Money(5);
Money money2 = new Money(6);
Money money3 = money1.plus(money2);
看上面Java代码可以看到,运算符在编译时会替换成方法的调用,+替换成plus方法,Kotlin的每个运算符都有其对应的方法,其他同理也可以这样重载使用。
3、当然对象还可以和数字相加,在上面基础上我们在加一个重载方法
class Money(val value: Int) {
var sum: Int = 0
operator fun plus(money: Money): Money {
sum = value + money.value
return Money(sum)
}
operator fun plus(newValue: Int): Money {
sum = value + newValue
return Money(sum)
}
}
测试代码
fun main() {
val money1 = Money(5)
val money2 = Money(6)
val money3 = money1 + money2;
val money4 = money1 + 20;
println(money3.value)
println(money4.value)
}
//结果
11
25
反编译后的Java代码:
Money money1 = new Money(5);
Money money2 = new Money(6);
Money money3 = money1.plus(money2);
Money money4 = money1.plus(20);
各种运算符其对应的方法
表达式 | 函数名 |
---|---|
a + b | plus |
a - b | minus |
a * b | times |
a / b | div |
a % b | rem,mod(弃用) |
重载复合赋值运算符
什么是复合赋值运算符?类似于+=
这样的,合并了两步操作的运算符,同时运算和赋值称为复合运算符。
看个例子:
fun main() {
val names = mutableListOf("Tom", "Lucky", "Daniel")
names += "Alice"
println(names)
names -= "Daniel"
println(names)
}
//结果
[Tom, Lucky, Daniel, Alice]
[Tom, Lucky, Alice]
集合中默认实现了复合运算符的实现方法,可以直接使用。
各种运算符其对应的方法
表达式 | 函数名 |
---|---|
a += b | plusAssign |
a -= b | minusAssign |
a *= b | timesAssign |
a /= b | divAssign |
a %= b | remAssign |