您好、欢迎来到现金彩票网!
当前位置:盛世彩票 > 复合赋值符 >

Kotlin学习(十七): 运算符重载

发布时间:2019-07-07 20:05 来源:未知 编辑:admin

  在前面写了关于集合和范围的内容,里面包括了一点运算符重载的内容,在这里我们来详细了解运算符重载的知识,内容参考《Kotlin实战》(Kotlin in Action)。

  简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构,例如如果你在一个类上面定义了一个特定函数命名plus的函数,那么按照Kotlin的约定,可用在这个类的实例上使用+运算符,下面是代码。

  重载的运算符实际上是被定义成一个函数,Java调用Kotlin运算符就跟调用普通函数一样调用就行。

  算术运算符包括二元运算符、复合赋值运算符、一元运算符,当Kotlin在给一个集合添加元素的时候,是调用add方法,用到重载的话,我们就可以直接用+=来进行这个操作,就会显得更加的优雅。。。

  二元算术运算符就是常见的+、-、*、/和取余%,优先级与数学的是一样的,*、/和%要高于+、-的优先级。

  运算符函数不是单一返回类型的,也是可以定义不同的返回类型,下面举个栗子:

  在上面的代码中,这个运算符是Char类型的扩展函数,参数类型是Int类型,所以是Char * Int这样的操作,返回类型是String。

  注意:运算符和普通函数一样,可以重载operator函数,可以定义多个同名,但是参数不一样的方法。

  上面的+=等同于f1 = f1 + Foo(3, 4),这些操作当然是只对可变变量有效的。

  默认情况下,复合赋值运算符是可以修改变量所引用的对象,同时重新分配引用,但是在将一个元素添加到一个可变集合的时候,+=是不会重新分配引用的:

  同样我们可以对复合赋值运算符进行重载,同样可以定义多个同名,但是参数不一样的方法:

  如果在plus和plusAssign两个函数同时被定义且适用,那么编译器就会报错,最好在设计新类的时候保持(可变性)一致,尽量不同时定义plus和plusAssign运算。如Foo类是不可变的,那么只提供plus运算,如果一个类是可变的,如构造器,那么只需提供plusAssign和类似的运算就够了。

  实际上+=可以被转换为plus或者plusAssign函数调用,而Kotlin的标准库中为集合支持这两种方法。

  Kotlin中允许重载一元运算符,如-a,+a等等,同样我们列举支持的一元运算符和对应的函数名:

  重载一元运算符过程与前面一样,通过预先定义的一个名称来声明函数(成员函数或者扩展函数),并且用operator修饰符标记。

  比较运算符,可以在除了基本数据类型外的任意对象上使用,当Java中使用equals或compareTo时,在Kotlin中,直接用运算符重载。

  在我们平时使用判断字符串是否与某个字符串相等的时候,会使用equals函数来判断,然而在Kotlin中,我们可以是用==来代替equals函数,~=来代替!qeuals。

  在Java中如果使用null对象来equals的话,会爆空指针异常,而Kotlin中的==是支持可空类型的,因为会先判断是否为空,如a == b会先检查a是否为空,如果不是,就会调用a.equals(b),否则只有两个参数都是空值,结果才为真。

  注意:===与Java一样,检查两个参数是否是同一个对象的引用,如果是基本数据类型,检查值是否相同,===和!==不能被重载。

  在Java中,基本数据类型集合排序通常都是使用和来比较,而其他类型需要使用来比较的。而在Kotlin中,通过使用比较运算符(````=``=)来进行比较。

  比较运算符会被转换成compareTo函数,compareTo的返回类型必须为Int。

  compareValuesBy函数是按顺序依次调用回调方法,两两一组分别做比较,然后返回结果,如果则返回比较结果,如果相同,则继续调用下一个,如果没有更多回调来调用,则返回0。

  从上面可以看到,equals和compareTo都是被override标记的,之所以会被标记,是因为在Any类中已经定义了equals函数,而所有的对象都默认继承Any类,所有才重载的时候需要使用override标记,而且equals不能定义为扩展函数,因为Any类的实现是重要优先于扩展函数。

  同样,compareTo在Comparable接口中已经定义了,所有在重载的时候,需要使用override标记。

  第4章 基本数据类型与类型系统 《Kotlin极简教程》正式上架: 点击这里 去京东商城购买阅读 点击这里 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ 到目前为止,我们已经了解了Kotlin的基本符号以及基础语法。我们...

  原文链接:到目前为止,我们已经了解了Kotlin的基本符号以及基础语法。我们可以看出,使用Kotlin写的代码更简洁、可读性更好、更富有生产力。 本章我们来学习一下Kotlin的基本数据类型与类型系统。 道生一,一...

  第3章 Kotlin语言基础 《Kotlin极简教程》正式上架: 点击这里 去京东商城购买阅读 点击这里 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ 掌握基础,持续练习 学习任何东西,都是一个由表及里的过程。学习一门编...

  习惯二三点睡,是从那部叫三生三世的电视剧开始 习惯十一二点起,是从那部叫三生三世电视剧开始 很轻易就能养成一个习惯,很不容易能改掉一个习惯 没有电视剧追的日子,感觉少了点什么啊? 于是老板选择让我,“加班”…… 多久没动笔画画,都快怕了。。。。。 提笔乱七八糟的线条。。。。...

  月亮,倒映在碧波上,看似有点忧伤。 坚持原创,转载请务必联系本人,谢谢!

  曾幻想过出走 特别是一个人的时候 需要勇气 可我偏偏缺少勇气 曾经旅游 两个人 开心 现在 一个人的时候 需要的是冷静 生活里 太多的不得已 希望自己无畏 勇敢 σ(^^)

  不吃不喝不显瘦, 不长心眼光长肉。 运动健身记心头, 天天锻炼不作秀; 无形无相添烦忧, 健身房里把汗流。 饭前饭后百步走, 不坐电梯只爬楼; 单纯锻炼还不够, 大鱼大肉要忌口。 不吃海鲜不喝酒, 只品香茶润歌喉; 精减体重不吹牛, 不减十斤誓不休。 一日三餐不应酬, 健健...

  陕南山川盛产蚕丝、苎麻、茶叶、生漆、桐油、棕片等数十种土特产品以及杜仲、天麻、麝香、五倍子等珍贵中药材,早已在清代中叶就饮誉长江,远销国内外。除了这些医药养生常见的药物外,还有一种自明朝才被发现,至今在人类的健康舞台上姗姗来迟的中草药——绞股蓝。 随着现代生活的节奏加快、人...

http://coolscala.com/fuhefuzhifu/578.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有