在最底层,Java 中的数据都是通过使用操作符来操作的。
3.1 静态导入
import static com.xxx.... // 可直接引入包中的方法
3.2 使用 Java 操作符
- 几乎所有操作符智能操作基本类型。
- 例外的‘=’,‘==’,‘!=‘,能操作所有对象。
- String 类支持’+‘,’+=‘.
3.3 优先级
- 先乘除,后加减。
- 多用括号,少歧义。
3.4 赋值
’=‘赋值操作符:
- 取右边的值,赋给左边的值。
- 右边可以是任何常数,变量或者表达式。
- 左边必须是一个明确的,已命名的变量。
对于赋值,又区分为:
- 基本类型的赋值:
基本类型存储了实际的数值,而非指向一个对象的引用。是直接将一个地方的内容复制到另一个地方。 - 对象的赋值:
真正操作的是对象的引用,是将“引用”从一个地方复制到另一个地方。
关于别名的问题:
- 将一个对象的引用 t1 直接赋值给另一个对象 t2 后,t1 会随着 t2 的变化而变化,因为赋值的是引用,两个变量实际指向了相同的对象。这种现象被称为“别名”。
- 将一个对象传递给方法时,也会产生别名问题。
3.5 算数操作符
Ramdom 类:随机数生成器,对于特定的种子值总会产生相同的随机数序列(所以实际上是伪随机)。
3.6 自动递增和递减
- 递增:++;递减:--
- 前缀-->先执行计算,后生成值;后缀-->先生成值,后执行计算
3.7 关系操作符
关系操作符生成 boolean 结果
’==‘/’!=‘适用于所有对象,比较的是对象的引用,就是说即使值相同,但是不同对象的话也是不同的。在比较不同的对象的相同值时,使用 equals()
方法。
由于 equals()
的默认行为是比较引用,除非在自己的新类中覆盖 equals()
方法,否则不可能表现出我们希望的行为。这是重写 equals()
方法的意义。
3.8 逻辑操作符
与:&&
或:||
非:!
逻辑操作符生成 boolean 结果
在应该使用 String 值的地方使用 boolean 值,布尔值会自动装换为适当文本形式的 true/false(装箱)。
短路:一旦能够明确无误的确认整个表达式,就不会在计算表达式剩余的部分。
3.9 直接常量
numbers + L --> long
numbers + F --> float
numbers + D --> double
0x/0X + numbers --> 十六进制
0 + numbers --> 八进制
值得注意的是计算机中 e 代表10的幂次。
3.10 按位操作符
按位操作符用来操作整数积累数据类型和中的单个“比特”(bit),即二进制位。
按位操作符会对两个参数中对应的位执行布尔代数运算。
按位与:&
按位或:|
按位异或:^
按位非:~
按位操作符可与等号(=)联合使用。&=,!=,^=都是合法的。
3.11 移位操作符
操作二进制的“位”,只可以用来处理整数基本类型数据。
- 左移<<:按操作符右侧指定的位数,将操作符左边的操作数左移动(低位补0)
- 右移>>:按操作符右侧指定的位数,将操作符左边的操作数右移动(符号拓展,符号为正,高位插0;符号为负,高位插1)
- 无符号右移>>>:无论正负,高位插0
按位操作符可与等号(=)联合使用。<<=,>>=,>>>=都是合法的。
3.12 三元操作符
boolean-exp ? value0 : value1;
3.13 字符串操作符 + 和 +=
如果表达式以一个字符串开头,那么后续所有操作数都必须是字符串类型。
3.14 使用操作符时常犯的错误
多用括号不出错
3.15 类型转换操作符
执行类型转换,可以将希望得到的数据类型治愈圆括号内,放在要进行类型转换的值的左边
- 窄化转换:编译器会强制进行转换
- 扩展转换:新类型一定会容纳原来的类型的信息
float/double --> int 总会进行截尾。
如果想要得到舍入的结果,需要调用 java.lang.Math
中的 round()
方法
对基本类型执行算术运算或者按位运算,只要比 int 小,在运算前,这些值会自动转换为 int。
float * double = double
int + long = long
3.16 Java 中没有 sizeof
所有数据类型在任意机器上的大小都是相同的-->高可移植性