首页 > 代码库 > 《Java开发手册》学习进程之第3章运算符详解
《Java开发手册》学习进程之第3章运算符详解
运算符重载是指同一个运算符在不同的情况下执行不同的操作。
例如,“+”运算符在Java中就有不同的功能:
- 加法运算
- 数值正号
- 字符串连接
特别要注意要在字符串连接的表达式中字符串与其他基本数据类型的变量的连接问题。
例如:
(1)System.out.println(a + m + n)中,a为一String对象,m和n为int型变量(也可以是byte,short,float等其他基本数据类型)。根据此表达式中的运算符优先级可知,a先与m相连接,其合并为一个字符串,然后再与n连接并以字符串的形式输出。而不是m和n相加后再与字符串a连接。
(2)System.out.println(m + n + a)中,m与n先相加,然后再与字符串a相连接。这与上面的情况相反。
在有取余运算符参与的表达式中,要注意以下几种情况:
- “15%-4”运算结果为“3”,结果的符号与右边操作数无关
- “-15%4”运算结果为”3”,结果的符号与左边操作数相关
- “6.8%6.3”运算结果为”0.5“,浮点数也可以求余
- “15.0%0”运算结果为”NaN“,表示不知道结果是什么
- “15%0”运行报错,与整除中除以0是一样的
自增、自减运算符不会对其进行类型提升。
”NaN“表达的意思是”不知道“,故”NaN“之间无法用”==“和”!=“相互比较,只能返回”false“。
将数值与无穷大进行是有意义的,而与”NaN“进行比较没有意义,Java中规定任何数值与”NaN“进行大小比较永远返回”false“。
三元运算符中的结果表达式1和2如果为基本类型,则要求其是兼容的。如果为引用类型,则永远是可以的,因为三元表达式的返回类型将设置为两个表达式类型的最小公共父类类型。
移位运算中,有些情况不符合我们正常的思维。比如下面这个例子:
public class Sample3_14{ public static void main(String[] args) { int i = 88 << 32; long l = 67 >> 64; System.out.println("i = " + i); System.out.println("l = " + l); }}按我们对移位运算的正常理解,32位的整型数值88被左移了32位后,整个位模式都显示为0,所以最后结果为0,但在最后结果中会发现i的值没变。这是因为,在移位前,Java系统首先把被移数的位数与所要移的位数求余,然后才根据余数进行移位。
在赋值运算中,要注意一个小细节。赋值运算符”=“的运算顺序是从右到左,即先把”=“号右边的表达式算完,然后再将其值赋给”=“右边的变量。所以”int k += 1”无法通过编译。因为”int k += 1“实际上等同于”int k = k + 1“,而这个式子首先计算”k + 1“,但是k并没有被定义,故”int k += 1“明显错误。正确的做法是先将”k”初始化为某个值,然后再进行”+=“运算。
另外,类型于”+=“的赋值运算符还有”-=“、”>>>=“等。而整个”X +=Y“相当于”X=(<X的类型>)(X+Y)“,即具有隐含的强制类型转换。
《Java开发手册》学习进程之第3章运算符详解