在前面的内容已经学会了如何定义变量和初始化变量。定义变量的目的就是为了操作数据。Java 语言中给我们提供了专门用来操作这些数据的代码符号,统称为“运算符”。
按照操作符的用法,我们可以分为以下几类:
算术运算符
赋值运算符
自增和自减运算符
逻辑运算符
关系运算符
位运算符
不用担心,它们就是些符号而已,帮我们处理操作数据的。下面用代码实例,一一来说明这些运算符的用法。
1. 算术运算符
算术运算符,就是针对数值变量的加、减、乘、除、取余的算术操作:
加 :+
减:-
乘:*
除:/
取余:%
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
输出结果:
| 1 2 3 4 5 |
|
2. 赋值运算符
与大部分编程语言相同,Java使用'='运算符来进行赋值操作。这种操作会将右边的计算结果(称为右值)赋给左边的变量。Java 中赋值运算符有:
= (num2 = num1 )
+= (num2 += num1 等价 num2 = num2 + num1)
-= (num2 -= num1 等价 num2 = num2 - num1)
*= (num2 *= num1 等价 num2 = num2 * num1)
/= (num2 /= num1 等价 num2 = num2 / num1)
%= (num2 %= num1 等价 num2 = num2 % num1)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
结果输出:
| 1 2 3 4 5 6 |
|
3. 自增和自减运算符
自增和自减运算符,只操作一个变量,是变量的值发生改变。
num++ (等价 num = num + 1)自增,主要针对数值变量,使自身变量的值加1。
num—(等价 num = num -1)自减,主要针对数值变量,使身变量的值减去1。
| 1 2 3 4 5 6 7 8 9 10 11 |
|
结果输出:
| 1 2 |
|
4. 逻辑运算符
逻辑运算符,顾名思义用于逻辑判断,运算的结果为boolean 类型的值,即 true 或者 false。逻辑匀运算符有
| 逻辑运算符 | 逻辑关系 |
|---|---|
| && | 与 |
| ` | |
| ! | 非 |
b1 && b2:如果b1和b2都为真,b1 && b2将返回true,否则返回false
b1 || b2:如果b1和b2都是假,将返回false,否则返回true。
!b1:将返回与b1相反的值,如果b1为false,则返回true;如果b1为true,则返回false
| 1 2 3 4 5 6 7 8 9 10 11 12 |
|
输出结果:
| 1 2 3 |
|
逻辑短路:
在Java中,逻辑运算符支持短路操作,一旦能够明确表达整个表达式的值,我们就不需要计算表达式的余下部分了。比如我们需要判断一个对象不为空且它的某个方法返回值不为空,我们就可以这样判断:
| 1 2 3 |
|
如果object为空,第一部分表达式object != null会返回false,那么不管&&运算符后面的表达式object.someFunction() != null的结果如何,最终的值都为false。编译器会自动将这部分运算进行优化,不会执行object.someFunction() != null。
5. 关系运算符
用来比较两个变量数据的大小,返回boolean的值,即 true 或者 false
关系操作符包括:
| 关系运算符 | 关系 |
|---|---|
| > | 大于 |
| < | 小于 |
| == | 等于 |
| != | 不等于 |
| >= | 大于等于 |
| <= | 小于等于 |
'=='和'!='适用于所有类型的值和对象(即基本类型变量和引用类型变量)。
'>'、'<'、'>='和'<='不适用于布尔类型的值,因为它们只有true或false,大于和小于并无实际意义。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
输出结果:
| 1 2 3 4 5 6 |
|
6. 位运算符
位运算符面向的运算对象是二进制的“位”,可应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型,运算时会将其对应Bit位(0或者是1)进行布尔代数运算或者移动操作。
| 位运算符 | 计算逻辑 |
|---|---|
| & | 与运算:对于某一位,只要两个操作数都为1,则该位的结果为1,否则为0 |
| ` | ` |
| ^ | 异或运算:对于某一位,如果两个操作数不相同,则该位的结果为1,否则为0 |
| ~ | 非运算:按位补运算符翻转操作数的每一位 |
| << | 二进制左移运算符:左操作数按位左移右操作数指定的位数 |
| >> | 二进制右移运算符:左操作数按位右移右操作数指定的位数 |
| >>> | 二进制右移补零操作符:左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 |
计算逻辑的描述读起来有些晦涩,我们通过例子可以更清晰得了解位运算符如何进行计算。假设如果x等于60;y等于13;则它们的二进制表示,以及位运算的结果如下所示:
| 1 2 3 4 5 6 7 8 9 10 |
|
注意>>和>>>的区别:
右移位运算符>>,若操作的值为正,则在高位插入0;若值为负,则在高位插入1;
右移补零操作符>>>,无论正负,都在高位插入0。
> 位运算不理解,先跳过。实际用到的时候,可以再去研究。
7. 运算符的优先级
运算符优先级决定一个表达式里术语的分组。它影响着一个表达式如何求值。一定的运算符比其他运算符拥有更高的优先级。
例如:乘法运算符比加法运算符有更高的优先级,表达式1 + 5 * 6,根据运算符的优先级,编译器会先计算5 * 6,再计算30 + 1,最终得到结果31。
各类各运算符的优先级从大到小如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
不用担心这么复杂的优先级列表,绝大多数情况下,表达式本身就很容易看得出优先级,比如赋值运算肯定是优先级最低的。在对优先级不太明确的情况下,我们使用括号就能按照我们希望的方式来改变优先级,所以不需要对运算符优先级做太多记忆。
8.其他运算符
三运运算符:
Java中的条件运算符是一个三元运算符,它的形式如下:
| 1 |
|
如果布尔表达式值为true,则表达式的值为valueWhenTrue的值,否则为valueWhenFalse的值。
比如我们要计算x的绝对值,可以通过如下代码实现:
| 1 2 3 4 5 |
|
通过三元运算符,只需要一条语句y = x >= 0 ? x : -x;就可以完成,更为简洁。
类型转换运算符:
我们在很多情况下会用到类型转换。在适当的时候,Java也会根据数据类型将数据类型自动转为另一种。比如我们为float变量赋一个整数值,编译器会将int转化为float赋给变量。
但是在很多情况下,Java并不能判断我们是否需要进行类型转换,这时就需要类型转化运算符,它允许我们显式地进行类型转换,如:
| 1 2 3 |
|
我们对变量和常量都能进行类型转换。
在对浮点数进行类型转换时,我们需要注意截尾的问题。如我们要将10.9进行类型转换:(int) 10.9,它的值并不是四舍五入的11,而是10


2796

被折叠的 条评论
为什么被折叠?



