1. 介绍
本篇为Groovy学习第12篇内容。从第6篇开始学习Groovy中有关运算符的相关知识。而那些知识只是介绍了各种运算符的使用以及注意事项。
而本篇就来学习各种运算符的优先级方面的知识。因为如果多种运算符同时使用时,程序会先执行哪个后执行哪个。这个是开发中很重要的一个知识点。
2. 运算符优先级
下面,通过表格的形式,展现所有Groovy中运算符的优先顺序。顺序是从先到后的。
Level | 运算符 | 解释 |
---|---|---|
1 | new () | 对象创建,显式括号 |
() {} [] | 方法调用, 闭包操作, List和Map调用 | |
. .& .@ | 成员访问, 对象获取,方法或属性访问 https://zinyan.com/?p=396 | |
?. * *. *: | 安全导航,展开运算符 | |
~ ! (type) | 按位取反运算符,逻辑非运算符,以及最后的类型转换 | |
[] ?[] -- | 列表对象获取,和列表对象安全获取, 累加或累减 | |
2 | ** | 幂运算 |
3 | -- - | 基本的算术运算符,累加和累减 (PS:官方也是这样标注的,我觉得应该是前加和后加的区别) |
4 | * / % | 乘,除,取余 |
5 | - | 加减运算符 |
6 | << >> >>> .. <..< | 左右位移运算符, 无符号位移,区间运算符 |
7 | < <= > >= in !in instanceof !instanceof as | 大于等于比较运算符, in 和非in 成员运算符, instanceof和not instanceof, as 类型转换运算符 |
8 | == != <=> === !== | 比较运算符,三元比较运算符 |
=~ ==~ | 正则表达式操作符 | |
9 | & | 位运算符:and |
10 | ^ | 位运算符: xor |
11 | | | 位运算符:or |
12 | && | 逻辑运算符:逻辑与 |
13 | || | 逻辑运算符:逻辑或 |
14 | ? : | 三元运算符 |
?: | 条件运算符,可以算三元运算符的缩写 | |
15 | = **= *= /= %= = -= <<= >>= >>>= &= ^= |= ?= | 其他各种运算符。 |
再次强调一下:1级是最先执行的,15级是最后执行的。
3. 运算符重载
Groovy允许您重载各种运算符,以便它们可以与您自己的类一起使用。
我在前面的介绍中,也有使用过相关的重载方法。
总而言之,各种运算符其实就是对方法的简写。而所谓的运算符重写。就是将各运算符所代表的方法,进行重载。我们可以重新定义该运算符在使用时的意义。
示例如下所示 我重载了plus方法,这个就是用来进行计算的方法:
代码语言:javascript复制class Bucket {
int size
Bucket(int size) { this.size = size }
Bucket plus(Bucket other) {
return new Bucket(this.size other.size)
}
}
然后我们再使用该值的计算方法:
代码语言:javascript复制def b1 = new Bucket(4)
def b2 = new Bucket(11)
println(b1 b2.size) //输出为15
下面是运算符及其相应方法的完整列表:
运算符 | 方法 | 运算符 | 方法 |
---|---|---|---|
| a.plus(b) | a[b] | a.getAt(b) |
- | a.minus(b) | a[b] = c | a.putAt(b, c) |
* | a.multiply(b) | a in b | b.isCase(a) |
/ | a.div(b) | << | a.leftShift(b) |
% | a.mod(b) | >> | a.rightShift(b) |
** | a.power(b) | >>> | a.rightShiftUnsigned(b) |
| | a.or(b) |
| a.next() |
& | a.and(b) | -- | a.previous() |
^ | a.xor(b) | a | a.positive() |
as | a.asType(b) | -a | a.negative() |
a() | a.call() | ~a | a.bitwiseNegate() |
我们可以根据自己的实际需求,进行自定义类后重载相关方法。那么在该类使用运算符的时候,计算逻辑就会按照我们定义的方法进行了。
如果不能理解。那么就多修改几个方法试试吧。
这种特性在新出的一些高级语言中可以说都是存在的。例如python 和Kotlin等语言中,也有类似的重载机制。
4. 小结
本篇,可以说是针对运算符的各种符号的一个归纳介绍。 如果对某个运算符不了解的话,建议看我分享的运算符详细知识。
到这里,有关运算符的相关知识就分享结束了。在学习这些运算符的同时,我们对于Groovy的语言的特性也在不断的了解中。
本篇内容知识来源于Groovy官网文档:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_operator_precedence
从下一篇开始,介绍Groovy的语言结构。也就是语法和代码结构的相关知识点。