第3章 操作符
3.1 更简单的打印语句
……
3.2 使用Java操作符
基本类型 +
-
*
/
=
所有对象 =
==
!=
String类 +
+=
3.3 优先级
用括号明确
3.4 赋值
基本数据类型a=b
复制值
对象c=d
复制引用,指向同一对象
方法调用中的别名问题
对象传递给方法时仅传递引用
3.5 算术操作符
Random rand = new Random(47); //提供种子
int j = rand.nextInt(100) + 1; //1~100
一元加、减操作符
x = a * (-b); //加括号更明确
一元加号:将较小类型的操作数提升为int
3.6 自动递增和递减
前缀/后缀递增/递减
3.7 关系操作符
测试对象的等价性
==
!=
仅比较对象的引用
对象使用equals()
方法
但自建类虽覆盖equals()
方法,默认是比较引用
3.8 逻辑操作符
浮点数的比较是非常严格的
短路
一旦能够明确整个表达式的值就不再计算余下部分
boolean b = (0 < 1) && (2 < 2) && (2 < 3); //仅计算前两项
3.9 直接常量
int i1 = 0x2f; // Hexadecimal (lowercase)
int i2 = 0X2F; // Hexadecimal (uppercase)
int i3 = 0177; // Octal (leading zero)
long n1 = 200L; // long suffix
long n2 = 200l; // long suffix (but can be confusing)
float f2 = 1F; // float suffix
float f3 = 1f; // float suffix
double d1 = 1d; // double suffix
double d2 = 1D; // double suffix
Integer.toBinaryString(i1);
Long.toBinaryString(l1);
Integer.toBinaryString(c); // char c,较小的类型将自动转换为int
指数记数法
float expFloat = 1.39e-43f; // 1.39*10^(-43)
double expDouble = 47e47d; // 'd' is optional
指数作double
处理,用尾随的f
转换成float
3.10 按位操作符
&
与 |
或 ^
异或 ~
非
&=
|=
^=
布尔类型不能执行按位“非”,对布尔值按位操作不会“短路”
3.11 移位操作符
<<
<<=
左移位,低位补0
>>
>>=
“有符号”右移位
>>>
>>>=
“无符号”右移位,高位插入0
char
、byte
或short
移位会先转为int
,结果也是int
,>>>=
赋值给原来类型会被截断
二进制表示形式 有符号的二进制补码
3.12 三元操作符if-else
boolean-exp ? value0 : value1
可读性差
3.13 字符串操作符+
和+=
字符串起头,后续操作数都是字符串型
e.g. s + i1 + i2 + i3; // s for String, i for int
int + String
为String
类型
int x = 0;
print("" + x); // "" + x, shorthand for Integer.toString(x)
3.14 使用操作符时常犯的错误
while (x = y) {} // 编译错误,int不会自动转换成boolean,除非x和y都为布尔值
3.15 类型转换操作符
窄化转换 必须显式否则报错
扩展转换 不必显式
boolean
不允许进行任何类型转换
截尾和舍入
截尾 浮点转换为整型
舍入 Math.round();
提升
执行算术运算或按位运算,类型比int
小会转换成int
,结果也是int
表达式中出现的最大数据类型决定结果的数据类型
3.16 Java没有sizeof
因为所有数据类型在所有机器大小相同
3.17 操作符小结
short x, y;
x = (short)(x + y); // 显式转换
复合赋值(如+=
)不需要类型转换
乘法溢出不会报错
3.18 总结
……