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方法,这个就是用来进行计算的方法:
class Bucket {
int size
Bucket(int size) { this.size = size }
Bucket plus(Bucket other) {
return new Bucket(this.size + other.size)
}
}
然后我们再使用该值的计算方法:
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的语言结构。也就是语法和代码结构的相关知识点。
评论区