第三章 操作符
除了 + - * / , Java还支持 += , ++, -- 等操作,运算符 = 、==、 !=
它们有一定的优先级,如果不清楚优先级建议使用小括号明确规定运算顺序。
算术操作符 +,-,*,/
赋值 =
需要注意的是,除了基本类型中,其他对象赋值只是将一个引用给了另一个变量,它们都是指向同一个对象,这种现象叫做“别名现象”。同样在方法传递的时候,如果传进去得是一个对象,那么不是复制对象,而是传了一个引用进去,方法对这个引用的修改会使这个对象在方法外面同样发生改变。引用有点类似于C++的指针操作。
自增自减操作 ++ ,--
需要注意的是++和--可以放在变量的前面和后面,例如 i++和++i,i++表示先得到i值再i增加1并赋值到i,++i表示先把i增加1赋值i再进行其他操作,在单句使用的时候 ,并没有明显的差异。但是在复合语句中就有不同了,例如简单的语句,当 i = 0时,a = i++,得到的结果是 a = 0,i= 1;如果是a = ++i,得到的结果是 a =1,i= 1。(这里和C++一样)
关系运算符 <, >, <= , >=, !=, ==
在Java的Object 对象中有一个equals方法,在对象比较时候,一般需要==和equals的区别,在默认的方法中,equals是比较引用的的,结果和==一样。但是在一些类中,equals是经过重写的,例如String中,equals是指内容一样就相等,而不需要是同一个引用。
逻辑运算符(与或非) &&, ||, !
- 注意 &&和&的区别,&是位运算。
-
“短路”现象,就是在一个表达式中,如果已经确定了表达式的值就不再计算剩余的部分了。譬如 i = 1, j =2,表达式 (i>5 && j >0),在判断了i>5这里已经知道了这个式子后面无论是什么为false了,那么后面就不在计算了,已经没有意义了。那么计算和不计算无所谓么,不是的,因为后面的表达式可能有自增,赋值等运算,那么就有区别了。例如表达式(i>5 && j-- >0),那么得到的j还是2,因为后面j--,由于短路现象并没有计算。
常量和指数计算法
int i = 0x2f; 十六进制
int i = 0177; 八进制
long i = 100l; 长整型
float = 1.3e-12f; 指数计数法(后面的f是必须的,默认浮点数是双精度double类型,不能自动转为单精度float)
位运算 &, ~, ^
额外操作 &=, !=,^=
移位操作 <<, >>
<< 左移,对变量二进制向左移动指定的位数,低位补0
>> 右移,对变量二进制向右移动指定的位数,符号位保持不变,其他的高位补零
>>>无符号右移,主要区别是无论正负,高位都是补零
三元操作符
条件 ? 值1:值2; 如果条件为true,则返回值1,否则,返回值2.
类型转换(cast)
- 在低精度赋值到高精度是会自动转换的,但是高精度到低精度赋值,需要手动转换,并且会有信息丢失的风险。
-
把浮点数转为整型,会进行舍尾操作,如果需要四舍五入,可以使用Math.round函数。
-
在计算表达式时,会自动把低精度转为高精度计算,得到的结果也是高精度的,类型比int小的会转为int运算,因此计算之后赋值到低精度变量,需要类型转换
关注我的公众号