第3章控制程序流程
“就象任何有感知的生物一样,程序必须能操纵自己的世界,在执行过程中作出判断与选择。”
第一部分:Java运算符
“=”、“==”和“!=” 能操作所有对象。
String类支持“+”和“+=”。
>,<,>=,<=,比较不适用于boolean类型。
其余运算符都只能操作“基本数据类型”(Primitives)。
一、 赋值运算符:=
1. 赋值运算符(=),它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的、已命名的变量。也就是说,它必须有一个物理性的空间来保存右边的值。
2. 对主(Primitives)数据类型的赋值。主类型容纳了实际的值,可将一个地方的内容复制到另一个地方。例如,假设为主类型使用“A=B”,那么B处的内容就复制到A。若接着又修改了A,那么B根本不会受这种修改的影响。
3. 对一个对象赋值,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C和D最终都会指向最初只有D才指向的那个对象。Assignment.java
4. 扩展赋值运算符:
a = a>>>b |
a >>>= b |
>>>= |
a = a>>b |
a >>= b |
>>= |
a = a< |
a <<= b |
<<= |
a = a^b |
a ^= b |
^= |
a |= b |
a &= b |
a %= b |
a /= b |
a *= b |
a -= b |
a += b |
用法举例 |
a = a|b |
|= |
a = a&b |
&= |
a = a%b |
%= |
/= |
*= |
-= |
+= |
运算符 |
a = a/b |
a = a*b |
a = a-b |
a = a+b |
等效的表达式 |
二、 算术运算符:+,―,*,/,%,++,――
1. 整数除法会直接砍掉小数,而不是进位。
2. 前递增和前递减(如++A或--A),会先执行运算,再生成值。后递增和后递减(如A++或A--),会先生成值,再执行运算。
例:AutoInc.java
三、 关系运算符:>,<,>=,<=,==,!=
1. 关系运算符生成的是一个“布尔”(Boolean)结果。它们评价的是运算对象值之间的关系。若关系是真实的,关系表达式会生成true(真);若关系不真实,则生成false(假)。
2. 检查对象是否相等
1) ==和!=比较的是对象句柄。例:Equivalence.java
equals()方法。 [Usage:n1.equals(n2)]例:EqualsMethod.java
ü 不适用于“主类型”。
注意:可以比较封装器类型和主类型和常数。
ü 当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个实例;
ü equals()的默认行为是比较句柄。要想比较对象必须重新实现它例:EqualsMethod2.java
ü 大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
四、 逻辑运算符:&,|,!,^,&&,||
1. 只能应用于布尔值。不可将一个非布尔值当作布尔值在逻辑表达式中使用。
2. 逻辑运算符功能
!-- 逻辑非 & -- 逻辑与 | -- 逻辑或
^ -- 逻辑异或 &&-- 短路与 || -- 短路或
3. 短路:如果一个逻辑表达式的所有部分都不必执行下去,那么潜在的性能提升将是相当可观的。
&& -- 第一个操作数为假则不判断第二个操作数
|| -- 第一个操作数为真则不判断第二个操作数
例:ShortCircuit.java
五、按位运算符:&,|,^,~
按位运算符允许我们操作一个整数主数据类型中的单个“比特”,即二进制位。按位运算符会对两个自变量中对应的位执行布尔代数,并最终生成一个结果.
Java整数进制转换
Java语言二进制数采用补码形式,数正负区分标志:符号位
ü 正数进制转换
Ø 十进制----二进制:除2取余、除尽为止
二进制----十进制:累加求和
ü 负数进制转换
Ø 十进制----二进制:
•取绝对值
•转换为二进制
•逐位取反
•加1
Ø 二进制----十进制
•减1
•逐位取反
•转换为十进制正数
•乘-1
六、 移位运算符:<<,>>,>>>
1. 移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)
左移<<
将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)
"a<"将二进制形式的a逐位左移b位,最低位空出的b位补0;
带符号右移>>
将运算符左边的运算对象向右移动运算符右侧指定的位数。
ü "a>>b; "将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位;
“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
4. 无符号右移>>>
它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
ü "a>>>b;"将二进制形式的a逐位右移b位,最高位空出的b位补0。
移位运算符性质
ü 适用数据类型:byte、short、char、int、long,对低于int型的操作数将先自动转换为int型再移位
ü 对于int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数
ü 对于long型整数移位时a>>b ,则是先将移位位数b对64取模
ü 在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。
七、三元if-else运算符:布尔表达式 ? 值0:值1
1. 若“布尔表达式”的结果为true,就计算“值0”,而且它的结果成为最终由运算符产生的值。但若“布尔表达式”的结果为false,计算的就是“值1”,而且它的结果成为最终由运算符产生的值。
八、 逗号运算符
在Java里需要用到逗号的唯一场所就是for循环
九、字串运算符+
1. "+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接
2. 注意:对于Java的早期版本,如果想通过“加号”连接字串,请务必保证第一个元素是字串。
造型运算符