Kotlin学习 - 运算符重载

在Kotlin中,可以对运算符进行重载,使得自定义类型如Money类可以支持加法运算。通过`operatorfunplus`重载加法运算符,允许Money对象和数字相加。此外,文章还展示了如何重载复合赋值运算符,如`+=`,在列表操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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 + bplus
a - bminus
a * btimes
a / bdiv
a % brem,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 += bplusAssign
a -= bminusAssign
a *= btimesAssign
a /= bdivAssign
a %= bremAssign
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值