第三章 运算符
Kotlin中的运算符都是以***方法形式***实现的,各种运算符对应的方法名都是固定的;如果某个自定义类提供对应运算符对应的方法(既可以是成员方法也可以是扩展方法),那么该类的对象就能使用该运算符进行运算;
单目运算符
+、-、!
+a–(对应方法)–>a.unaryPlus()
-a---->a.unaryMinus()
!a---->a.not
+a和a.unaryPlus效果完全一样;
自加、自减
a+±------>a.inc()
a-- ---->a.dec()
由于自加和自减分为++a、a++、–a、a++两种形式,因此inc方法并不完全等于a++
当++、–放在变量前:
- 先执行变量的inc()、dec()方法,并将方法返回值赋值给变量
- 自加、自减表达式返回变量的新值
当++、–放在变量后面:
- 先用一个临时变量缓存变量的值
- 对变量调用inc()或dec()方法,并将方法返回值赋值给变量
- 自加、自减表达式返回临时变量值
双目算术运算符
a+b-------->a.plus(b)
a-b-------->a.minus(b)
a*b------->a.times(b)
a/b------->a.div(b)
a%b-------->a.rem(b)
a…b------>a.rangeTo(b)
in和!in运算符
a in b ----->b.contains(a)
a!in b------>!b.minus(a)
索引访问运算符"[]"
a[i]-------->a.get(i)
a[i,j]----->a.get(i,j)
a[i]=b----->a.set(i,b)
a[i,j]—>a.set(i,j,b)
a[i_1,…,i_n]=b---->a.set(i_1,…,i_n,b)
调用运算符"()"
a()----->a.invoke()
a(b)----->a.invoke(b)
a(b1,b2)----->a.invoke(b1,b2)
a(b1,b2,…)----->a.invoke(b1,b2,…)
如:
var s="leslie"
var met=Class.forName(s).getMethod("length");
met.invoke("java");
广义赋值运算符
a+=b----->a.plusAssign(b)
a-=b----->a.minusAssign(b)
a*=b---->a.timesAssign(b)
a/=b----->a.divAssign(b)
a%=b---->a.remAssign(b)
a+=b,实际上等于a=a+b,往往并不需要a有plusAssign()方法:
- 如果有plusAssign()方法,若果plus方法也存在,将报错
- 确保plusAssign()方法没有返回值,否则报错
- 前两步都满足,则转换为执行a.plusAssign(b)
如果没有plusAssign()方法,a+=b直接转换为a=a+b
注意:Kotlin的赋值运算不是表达式,因此不需要表达式;
相等于不相等运算(==和!=)
ab-------> a?.equals(b)?:(b=null)
a!=b ------>!(a?.equals(b)?:(b===null))
Kotlin中"“不在比较两个边路是否引用同一个对象,”“与equals()比较基本是等义的,只不过”=="比较是空指针安全的;
Java中的“”和"!=“在Kotlin中有”=“和”!=="替代了,判断两个变量是否是指向同一个对象;
比较运算符
a>b -------->a.compareTo(b)>0
aa.compareTo(b)<0
a>=b-------->a.compareTo(b)>=0
a<=b-------->a.compareTo(b)<=0
该运算符其实是由compareTo()方法来实现的,而是该方法是Comparable接口中定义的方法,原来Java类中支持使用compareTo()方法比较大小的对象,都可以使用比较运算符进行运算;
位运算符
Kotlin提供了与Java功能完全相同的位运算,但是这些位运算不是以特殊字符给出的,而是以infix函数形式给出的;
and(bits):按位与
or(bits):按位或
inv(bits):按位非
xor(bits):按位异同或,当相同为0,不同为1
shl(bits):左移移运算符
shr(bits):右移
ushr(bits):无符号右移
Kotlin的位运算符只能对int和Long两种数据类型起作用
区间运算符
闭区间运算符(…)###
a…b:区间包括a、b的值
半开区间运算符(until)
a until b:定义一个从a~b(包括a,不包括b边界)的所有值区间;
如果a==b,将产生一个空区间,该区间不包含任何值;如果a…b中,a、b相等,会产生包含一个值的区间;
半开区间:可用于遍历数组列表
for(index in 0 until books.size){
}
反向区间(a downTo b(要求:a>=b))###
闭区间从大到小,则可以使用downTo运算符,该运算符同样构建一个闭区间;
var range=6 downTo 2
区间步长
所有区间默认步长都是1,通过step原运算符,可以显示指定一个区间步长
如:
for(num in 7 downTo 1 step 2){
}
运算符重载
重载运算符的方法需要用operator修饰符进行标记
为任意类定义以operator修饰的运算符对应的方法,既可重载运算符