Java支持的运算符包括算术运算符,赋值运算符、扩展后的赋值运算符、比较运算符、逻辑运算符,Kotlin完全支持这些运算符。 Kotlin不支持Java的三目运算符——Kotlin使用if表达式代替了三目运算符。 Kotlin的位运算符与Java的位运算符也略有区别。 但有一点需要说明:Kotlin的运算符都是以方法形式来实现的,这些运算符都具有特定的符号(如+或*)和固定的优先级。 各种运算符对应的方法名都是固定的,我们只要为某个类型提供了特定名称(比如双目+运算符对应的方法名为plus)的方法,成员方法或扩展方法都可,接下来即可对该类型的对象使用+进行运算——因此Kotlin的所有运算符的功能都是广义的,它不仅能作用于数值型、字符串,也可作用于任意自定义的Kotlin类。本章后面内容会介绍运算符重载的知识。 3.1.1一目前缀运算符一目前缀运算符有+、-、!这三个。它们对应的固定方法名依次如表3.1所示。 表3.1一目前缀运算符
例如如下程序: 程序清单: codes\03\3.1\UnaryTest.kt fun main(args: Array<String>) { var a = 20; // 用运算符 val b = -a; // 调用方法 val c = a.unaryMinus(); println("b: ${b}, c: ${c}"); val flag = true // 用运算符 val notFlag1 = !flag // 调用方法 val notFlag2 = flag.not() println("notFlag1: ${notFlag1}, notFlag2: ${notFlag2}"); } 从上面粗体字代码可以看出-a与a.unaryMinus()的效果是完全一样的;!flag与flag.not()的效果也是完全一样的,因此以后读者在查阅API时发现某个类有unaryPlus()、unaryMinus()、not()方法,那就说明可对该类的实例使用单目前缀的+、-、!进行运算。 3.1.2自加和自减自加或自减对应的固定方法名依次如表3.2所示。 表3.2自加自减
由于++、--放在变量前后是有区别的,因此自加、自减的inc(),dec()两个方法还不完全等同于a++、a--。 当++、--放在变量之前时,执行过程如下: (1)先对变量调用inc()、dec()方法,并将方法返回值赋值给变量。 (2)自加或自减表达式返回变量的新值。 当++、--放在变量之后时,执行过程如下: (1)先将一个临时变量缓存变量的值。 (2)对变量调用inc()、dec()方法,并将方法返回值赋值给变量。 (3)自加或自减表达式返回临时变量的值。 例如如下程序: 程序清单: codes\03\3.1\SelfInc.ktfun main(args: Array<String>) { var a = 20 a++ println("a: ${a}") //输出21 // 以下代码大致相当于a++ a = a.inc() println("a: ${a}") // 输出22 } 由此可见,以后读者在查阅API时发现某个类有inc()、dec()方法,那就说明可对该类的实例使用++、--进行运算。 3.1.3双目算术运算符双目算术运算符对应的固定方法名依次如表3.3所示。 表3.3双目算术运算符
例如如下程序: 程序清单: codes\03\3.1\Arthimetic.ktfun main(args: Array<String>) { // 加法运算 println(5 + 6) println(5.plus(6)) // 乘法运算 println(2.3 * 3.4) println(2.3.times(3.4)) // 求余运算 println(2.5 % 1.2) println(2.5.rem(1.2)) } 由此可见,以后读者在查阅API时发现某个类有带一个参数的plus()、minus()、times()、div()、rem()和rangeTo()方法,那就说明可对该类的实例使用以上算术运算符。 提示:此处暂时不介绍rangeTo和..运算符,本章的区间运算符就是专门介绍它们。 以上内容节选自《疯狂Kotlin讲义》:一本让您最直接认识Kotlin的疯狂讲义 |