Java笔记整理:操作符
JAVA操作符
除“=”,“==”和“!=”外,所有操作符只能操作基本数据类型
String类支持“+”和“+=”
优先级
在连加的表达式中,String类型的元素后面的所有元素,都会自动转换成String类型
赋值
常量不能作为左值
基本数据变量存储的是实际的数值,赋值时会复制实际的内容
对象赋值时实际上是复制引用,而不是对象本身
算术操作符
整数除法会直接去掉小数位,而不是四舍五入
一元加操作符,像“+4”,会将较小类型的操作数提升为int
递增递减操作符
递增递减操作符是唯一具有“副作用”的操作符,即改变操作数
关系操作符
关系操作符会生成一个boolean结果
boolean类型不支持除“==”和“!=”外的比较符
对象间进行比较时,实际上比较的是两个引用
JAVA内置的一些类的equals方法其实是重载了Object类的equals方法,equals方法默认比较引用
逻辑操作符
逻辑操作符会生成一个boolean结果
逻辑操作符的操作数只能是boolean类型,JAVA不允许将非布尔值当作布尔值使用
JAVA存在短路特性
直接常量
前缀
- 十六进制:0x 或 0X
- 八进制:0
- 没有二进制(可以使用Integer.toBinaryString()方法获得)
后缀
- long:l 或 L
- double:d 或 D
- float:f 或 F
试图将变量初始化成超出自身范围的值,会得到一条错误信息
如果没有后缀,会默认转换成int值
指数计数法
编译器会将指数作为double类型处理
位操作符
~是一元操作符,因此没有~=
boolean类型可以应用于位操作符,但不能使用 ~ 操作符
位操作符表达式不会中途短路
移位操作符
左移低位补零
右移高位正数补零,负数补一(>>>则全部补零)
char,byte和short在移位前会先转换成int,移位后截断转换为原来的类型
int和long移位后的位数不会超过自身的最大位数
字符串操作符
JAVA不能重载操作符
如果表达式以一个字符串开头,后续所有操作数都会被转换成字符串类型
JAVA可以通过编译时检查防止while(x=y)这种错误的发生,因为int类型不能转换为boolean类型,除非像true=false,则不会得到错误。同样的,也可以防止逻辑操作符和位操作符的混淆
类型转换
窄化转换可能会导致信息丢失
扩展转换不必显示进行,会自动发生
将float和double转换成int类型时,会进行截尾而不是舍入
对char,byte或short的数据进行算术运算或位运算时,运算之前会自动转换成int
表达式中出现的最大数据类型决定了最终结果的数据类型
JAVA没有sizeof,因为在所有机器上的数据类型大小都是没有区别的