本章主讲Kotlin的运算符
一、运算符
1. 算术运算符
1.1 一元运算符
一元运算符一共三个,-、++ 、--。
fun main(args: Array<String>) {
var int = 1
val a = int++
val b = ++int
println(-1)
println(a)
println(b)
}
结果:
-1 (取反符)
1 (先赋值再运算,所以1没有问题)
3 (先运算再赋值,3没有问题)
1.2 二元运算符
二元运算符,比较简单,就是一些数学基本运算,它需要对基本数据类型使用。
+(加)、-(减)、*(乘)、/(除)和%(取余数)
栗子:
fun main(args: Array<String>) {
var int = 10
val add = int + 1
val minus = int - 1
val multiply = int * 1
val divide = int / 1
val `%` = int % 5
println(add)
println(minus)
println(multiply)
println(divide)
println(`%`)
}
结果:
11
9
10
10
0
1.3 算术赋值运算符
就是+=、-=、*=、/=和%=,这个你要试试就行了
栗子:
fun main(args: Array<String>) {
val int = 10
var a = 100
a += int
println(a)
a -= int
println(a)
a *= int
println(a)
a /= int
println(a)
a %= int
println(a)
}
结果:
110
100
1000
100
0简单例子说明就是a+=int ==a=a+int
使用方式很简单,但是不能给没有初始化的值使用。
fun main(args: Array<String>) {
val int = 10
var a += int //a没有初始化报错
}
2. 关系运算符
关系运算符是比较两个表达式大小的的运算符,结果为布尔类型。
<、>、== 、 ===、 !=、 !==、 <= 、>= 这8种,我先把简单演示一下,再讲复杂的。
栗子:简单实例
fun main(args: Array<String>) {
val a = 1
println(a > 0) //a大于0
println(a < 0) //a小于0
println(a <= 1) //a小于等于0
println(a >= 0) //a小于等于0
}
true
false
true
true
很简单吧!
下面来看==、!=、===、!==
==就是比较它们值,===比较的是引用。==就是Java中的equals方法,===就是Java中的==,它比较的是地址值。
同样先简单的例子:来说明==和!=的区别
fun main(args: Array<String>) {
val a = 1
val b = 1
println(a == b) //就是值判断是否相等
println(a != b) //取反
}
true
false 两个值相等,然后就取反。(就是和正确结果相反)
再来看===和!==的区别
fun main(args: Array<String>) {
val a = 1
val b = 1
println(a === b)
println(a !== b)
}
结果相同。因为在比较基本类型的时候,比较的是值。
true
false
现在看引用类型
先写个人的类
class Person(val name: String, val age: Int) {
}
测试:
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
println(person1 == person2)
println(person1 != person2)
}
结果:
false 因为比较的是引用类型。Any.equals() 函数比较的是两个对象的引用是否相等。也就是说,如果没有覆盖 equals() 函数,== 与 === 的结果是相同的。如果某个类有比较属性是否相等的需求,需要自行覆盖 equals() 方法。 来自欢颜 的博客
true
那我们重写Person类的equals方法,试试
class Person(val name: String, val age: Int) {
override fun equals(other: Any?): Boolean {
if (name == "王" || age == 11) {
return true
}
return false
}
}
true
false好的,验证成功,接下看===表现
===是比较的地址值,还是上面的例子,Person类不变。
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
println(person1 === person2)
println(person1 !== person2)
}
结果
false 不是一个对象,地址值肯定不同
true再看
fun main(args: Array<String>) {
val person1 = Person("王", 11)
val person2 = Person("王", 11)
val person3 = person1
println(person1 === person3)
println(person1 !== person3)
}
结果:
true
false我们把重写的equals方法删除了
3.其它运算符
Kotlin 支持以下操作符和特殊符号:
+
、-
、*
、/
、%
—— 数学操作符
*
也用于将数组传递给 vararg 参数
=
赋值操作符
也用于指定参数的默认值
+=
、-=
、*=
、/=
、%=
—— 广义赋值操作符
++
、--
—— 递增与递减操作符
&&
、||
、!
—— 逻辑“与”、“或”、“非”操作符(对于位运算,请使用相应的中缀函数)
==
、!=
—— 相等操作符(对于非原生类型会翻译为调用equals()
)
===
、!==
—— 引用相等操作符
<
、>
、<=
、>=
—— 比较操作符(对于非原生类型会翻译为调用compareTo()
)
[
、]
—— 索引访问操作符(会翻译为调用get
与set
)
!!
断言一个表达式非空
?.
执行安全调用(如果接收者非空,就调用一个方法或访问一个属性)
?:
如果左侧的值为空,就取右侧的值(elvis 操作符)
::
创建一个成员引用或者一个类引用
..
创建一个区间
:
分隔声明中的名称与类型
?
将类型标记为可空
->
分隔 lambda 表达式的参数与主体
分隔在函数类型中的参数类型与返回类型声明
分隔 when 表达式分支的条件与代码体
@
引入一个注解
引入或引用一个循环标签
引入或引用一个 lambda 表达式标签
引用一个来自外部作用域的 “this”表达式
引用一个外部超类
;
分隔位于同一行的多个语句
$
在字符串模版中引用变量或者表达式
_
在 lambda 表达式中代替未使用的参数
在解构声明中代替未使用的参数
-----------------------来自官网
4.运算符优先级
-----------来自Kotlin从小白到大牛