第七章:运算符重载及其他约定

重载算术运算发

  1. 重载运算符需要使用关键字: operator , 表明该函数作为相应的约定来实现;
  2. Kotlin限制了可以重载的运算符
    在这里插入图片描述
    注意:
    • 不要求两个运算数的类型相同;
    • 不会自动支持交换性(1.5 * p & p *1.5),由于两个运算数的类型不同,需要在相应的类型中做相应的重载处理(扩展函数…)
    • 返回类型可以不同于任一运算符类型
  3. 重载复合赋值运算符
    返回值为Unit,名为plusAssign(minusAssign, timesAssign)的函数,需要用operator关键字修饰,Kotlin将会在用到+=(-=, *=)运算符的地方调用对应的函数;
    可变集合的plusAssign函数
    在这里插入图片描述
    注意:不能同时定义plus, plusAssign函数,会报错;
    在这里插入图片描述
    Kotlin标准库支持集合的两个方法:+ , - , += , -=
    在这里插入图片描述
  4. 重载一元运算符
    不需要传参数
    在这里插入图片描述

重载比较运算符

由于operator修饰符被用在基类的接口中,因此重写该接口无需再重复

  1. 可以对任意的对象使用比较运算符(==, != , > , <),不需要调用equals或compareTo
  2. 等号运算符 == 与 != 可以用于可空运算符
    注意:!=会被转换成==的取反操作;
    在这里插入图片描述
    ===恒等运算符检查是否是同一个对象
  3. 排序运算发
    Kotlin支持相同的Comparable接口,比较运算符(< , > , <= , >=)的使用将会被转换成compareTo
    在这里插入图片描述
    使用compareValuesBy()函数来简洁的实现compareTo方法,按顺序依次调用回调方法,两两一组做比较,并返回结果

集合和区间之间的约定

  1. 通过使用下标来访问元素: get , set
    a[index] 称为下标运算符;读取元素会被转换成get方法,写入元素会调用set方法
    自定义类添加下标索引:定义一个名为get函数或者set函数,并标记为operator,参数类型可以是任意类型(数组的是Int, map的是键的类型…)
    在这里插入图片描述
  2. in的约定
    in运算符:检查某个对象是否属于集合 , 相对应的函数叫contains
    重载:operator fun contains(args…) : Boolean{…}
    注意: until 开区间,不包括最后一个元素;符号… 闭区间,包含最后一个元素
  3. rangeTo的约定
    创建区间:
    在这里插入图片描述
    rangeTo是Comparable的一个扩展函数 ,其优先级低于算术运算符,调用方法需要用括号括起来
  4. 在for循环中使用“iterator"的约定
    使用for(x in list){…}会被转换成list.iterator(),然后重复调用hasNext, next方法
    标准库已经为CharSequence定义了扩展函数iterator,所以可以遍历字符串

解构声明与组件函数

在这里插入图片描述
在这里插入图片描述
对于数据类,编译器为每个在主构造方法中声明的属性生成componentN函数

委托属性

  1. 委托:一种设计模式:操作的对象不用自己执行,而是把工作委托给另一个辅助的对象,辅助对象称为委托;
  2. 委托属性的基本操作:
    在这里插入图片描述
    关键字by可以用于任何符合属性委托约定规则的对象
    工作原理:
    在这里插入图片描述
    按照约定:Delegate类必须具有getValue和setValue方法 (后者属于可变属性)
    在这里插入图片描述
  3. 惰性初始化:by lazy()
    支持属性技术:
    在这里插入图片描述
  4. 变换规则
    在这里插入图片描述
    在这里插入图片描述
  5. 使用委托属性把值存到map中
    在这里插入图片描述
    原因:标准map和mutableMap接口已经定义了getValue, setValue扩展函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值