kotlin 基础之运算符重载

我们知道Java 中是不允许运算符重载的,1+1,输出肯定是2,kotlin 则可以重载。可见 kotlin 官网

'+' 运算符的重载

kotlin 官网我们可以看到关于加法运算符的解释,如下所示。

3171886-27d227b7edb542a8.jpg
image

  • 我们定义一个类 Complex(复数),有两个属性real 实部,imagary虚部。
class Complex(var real: Double, var imagnary: Double) {


    //重载 + 号参数
    operator fun plus(other: Complex): Complex {
        return Complex(real + other.real, imagnary + other.imagnary)
    }

    //重载对参数和返回值没有要求,只要 operate 关键字+ 方法名相同,参数数量相同即可
    operator fun plus(other: Int):Int{
        return real.toInt()+other
    }


    //复写
    override fun toString(): String {
        return "$real+${imagnary}i"

    }

}
//调用重载后方法
fun main(args: Array<String>) {
    val a = Complex(1.0, 2.0)
    val b = Complex(5.0, 7.9)
    val c=10
    println(a+b)
    println (a+c)
  
  • 重载对参数和返回值没有要求,只要 operate 关键字和方法名相同,参数数量相同即可。

再重载个‘()’invoke 方法

首先还是先看下官网中关于运算符()的解释。

3171886-cdf4b4264c9b37f2.jpg
image

  • 重载()invoke 方法,我们把它重载为一个打印hellworld 的方法吧
class Complex(var real: Double, var imagnary: Double) {

    //重载()invoke 方法,我们把它重载为一个打印hellworld 的方法把
    operator fun invoke(){
        println("hello world!!")
    }


}


fun main(args: Array<String>) {
    val a = Complex(1.0, 2.0)
    a()

  
}

中缀表达式

另外由于中缀表达式可以定义像运算符一样的函数,所以这里顺带说下中缀表达式

  • 在普通的一个只有一个参数的方法前面加一个infix 就是中缀表达式了。
  • 我们在Desk 类中定一个一个on 方法,它接收一个参数(物体的名称),然后打印出该物体在桌子上。

class Desk{

    //中缀表达式,普通的方法前面加个 infix 就是中缀表达式
    infix fun On(name:String){
        println("$name on the Desk!!")
    }
}

fun main(args: Array<String>) {
       val desk=Desk()
   
   //中缀表达式的调用,可以省略 .  和 ()。不过这玩意有啥用呢?随便还是不要用的好,不容易阅读。
    desk On "a lot of books"
}

  • 调用的时候可以省略 . 和 () ,除了看起来简洁,但会使得代码更难阅读,所以还是不要用的好。

总结

  • 任意类可以定义或重载父类的基本运算符
  • 通过运算符对应的具名函数来定义
  • 参数的个数必须和运算符原来的具名函数相同,但对于参数和返回值的类型不做要求
  • 可以重载的运算符有限,不像scalar 可以任意定义。

源码地址

github 源码地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值