Kotlin笔记 三 运算符和表达式

第三章 运算符

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++

当++、–放在变量前:

  1. 先执行变量的inc()、dec()方法,并将方法返回值赋值给变量
  2. 自加、自减表达式返回变量的新值

当++、–放在变量后面:

  1. 先用一个临时变量缓存变量的值
  2. 对变量调用inc()或dec()方法,并将方法返回值赋值给变量
  3. 自加、自减表达式返回临时变量值

双目算术运算符

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()方法:

  1. 如果有plusAssign()方法,若果plus方法也存在,将报错
  2. 确保plusAssign()方法没有返回值,否则报错
  3. 前两步都满足,则转换为执行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修饰的运算符对应的方法,既可重载运算符


版权声明:本文为Leslie_LN原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。