
一、前言如果你有Java开发基础在入门Kotlin时一定会发现一个极具幸福感的语法特性——运算符重载。比如在java开发中我们早已习惯了刻板的对象运算写法两个自定义对象相加、对比、取值只能通过定义add、compareTo、get等工具方法实现。代码冗余可读性和优雅度都大打折扣。而kotlin为了解决这一痛点原生支持安全、规范、可控的运算符重载。它允许开发者为自定义类绑定系统内置运算符让对象运算逻辑和基础类型运算一样简洁自然。二、为什么需要运算符重载Java有一个硬性限制不支持任何形式的运算符重载。对于Int、Double、String等原生类型我们可以直接使用运算符运算但一旦涉及自定义对象所有运算、比较和取值行为都必须手动封装成员方法。三、Kotlin运算符重载核心概念与本质1、核心定义运算符重载Kotlin允许开发者为自定义类重写系统内置运算符的执行逻辑让对象支持算术运算、比较运算、下边访问等符号式操作。2、底层本质纯语法糖这是最关键的核心Kotlin所有运算符重载本质都是固定命名的普通函数。编译器也不会新增特殊指令只是做了一层语法翻译ab编译器会自动翻译为 a.plus(b)a-b编译器会自动翻译为 a.minus(b)简单来说运算符只是函数的简写外衣底层依然是正常的函数调用3、必备关键字operator所有的运算符重载函数必须使用operator关键字修饰。它的作用我简化为三点第一点告诉编译器当前函数是运算符重载专用函数。第二点校验函数名、参数、返回值是否符合官方规范。第三点允许该函数支持符号调用方式。如果省略operator只能普通函数调用无法使用运算符语法。4、常用运算符a b - plus()a - b - minus()a * b - times()a /b - div()!a - not()a[i] - get(i)a[i] value - set(i , value四、标准重载写法说了那么多接下来我们看看究竟是如何使用的。class Student (var name : String , var age : Int){ operator fun plus(another : Student) : Student{ //学生相加之后的结果是 return Student(this.name another.name,this.age another.age) } }首先定义了一个Student.kt一共有两个参数分别为name、age使用operator修饰的plus方法实现了将两个名字和年龄相加。fun main(){ val student1 Student(zhangsan,18) val student2 Student(lisi,13) val student3 student1 student2 println(student3.name) println(student3.age) }接下来在主函数中初始化了student1和student2student3是两个对象相加最后输入student3的名字和年龄结果如下图所示。zhangsanlisi 31五、总结Kotlin运算符重载并不是花哨的语法糖他通过固定函数映射operator关键字约束在保证语言安全性的前提下让对象运算逻辑简洁、直观、语义统一。但是在开发中也需要掌握好使用规范它只用于语义明确、纯粹的数值或者状态运算在复杂业务逻辑、多分支判断、IO操作中绝对不要使用运算符重载可能会造成语义混淆。