第 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<<b |
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
2) equals() 方法。 [Usage : n1.equals(n2)] 例: EqualsMethod.java
ü 不适用于 “ 主类型 ” 。
注意:可以比较封装器类型和主类型和常数。
ü 当用 equals() 方法进行比较时,对类 File 、 String 、 Date 及封装类( Wrapper Class )来说,是比较类型及内容而不考虑引用的是否是同一个实例;
ü equals() 的默认行为是比较句柄。要想比较对象必须重新实现它例: EqualsMethod2.java
ü 大多数 Java 类库都实现了 equals() ,所以它实际比较的是对象的内容,而非它们的句柄。
四、 逻辑运算符: &,|,!,^,&&,||
1. 只能应用于布尔值。不可将一个非布尔值当作布尔值在逻辑表达式中使用。
2. 逻辑运算符功能
! -- 逻辑非 & -- 逻辑与 | -- 逻辑或
^ -- 逻辑异或 &&-- 短路与 || -- 短路或
3. 短路:如果一个逻辑表达式的所有部分都不必执行下去,那么潜在的性能提升将是相当可观的。
&& -- 第一个操作数为假则不判断第二个操作数
|| -- 第一个操作数为真则不判断第二个操作数
例: ShortCircuit.java
五、 按位运算符: & , | , ^ , ~
1. 按位运算符允许我们操作一个整数主数据类型中的单个 “ 比特 ” ,即二进制位。按位运算符会对两个自变量中对应的位执行布尔代数,并最终生成一个结果 .
2. Java 整数进制转换
ü Java 语言二进制数采用补码形式,数正负区分标志:符号位
ü 正数进制转换
Ø 十进制 ---- 二进制:除 2 取余、除尽为止
Ø 二进制 ---- 十进制:累加求和
ü 负数进制转换
Ø 十进制 ---- 二进制:
•取绝对值
•转换为二进制
•逐位取反
•加 1
Ø 二进制 ---- 十进制
•减 1
•逐位取反
•转换为十进制正数
•乘 -1
六、 移位运算符: << , >> , >>>
1. 移位运算符面向的运算对象也是二进制的 “ 位 ” 。可单独用它们处理整数类型(主类型的一种)
2. 左移 <<
ü 将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0 )
ü "