操作符
在最底层,Java中的数据是通过使用操作符来操作的。
3.1更简单的打印语句
静态导入:从类中导入静态成员,允许它们在没有类引用的情况下使用
3.2使用Java操作符
操作符作用于操作数,生成一个新值。
几乎所有的操作符只能操作基本类型,例外的是“=”、“==”、“!=”,这些操作符能操作所有的对象。除此以外,String类支持“+”和“+=”。
3.3优先级
优先级决定了各部分的计算顺序
参考:java操作符优先级
3.4赋值
基本类型值复制,对象类型引用复制(对象赋值两个变量将指向相同的对象,这种现象称为“别名现象”)。
3.5算术操作符
有+ - * /
其中,整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果。
3.6自动递增和递减
递增操作符++
递减操作符--
分前置和后置
3.7关系操作符
关系操作符生成的是一个boolean布尔结果,它们计算的是操作数的值之间的关系。
ps.测试对象的等价性:“==”和“!=”适用于所有对象,当操作数是对象类型时,“==”比较的是对象的引用,而不是对象的内容。
对象的被覆盖的equals()方法比较的是实际内容。注意,equals()的默认行为是比较引用,所以除非在自己的新类中覆盖equals方法,否则它比较的还是引用。
3.8逻辑操作符
与&& 或|| 非!
注:不可将一个非布尔值当作布尔值在逻辑表达式中使用。
逻辑操作符的“短路”现象:一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了。
3.9直接常量
示例:
int n = 0x2f;
long m = 100L;
3.10按位操作符
对于布尔值,按位操作符具有与逻辑操作符相同的结果,只是它们不会中途短路。
3.11移位操作符
左移: <<
"有符号"右移: >>
"无符号"右移:>>>
如果对char byte short类型的数值进行移位处理,那么在移位进行之前,它们会被转化为int类型,并且得到的结果也是int类型的值。
如果对byte short值进行 >>>=这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1的结果。
3.12三元操作符
boolean-exp ? value0 : value1
相对于if-else语句,三元操作符更加简洁,但是可读性较差。
3.13字符串操作符+和+=
用途:连接不同的字符串
3.14使用操作符时常犯的错误
while(x=y){
//...
}
Java编译器会报错,防止这个错误发生。因为它不允许我们随便把一种类型当作另一种类型来用。
3.15类型转换操作符
要想执行类型转换,需要将希望得到的数据类型置于圆括号内,放在要进行类型转换的值的左边。
如:
int i = 5;
long lng = (long) i;
Java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。
ps.在执行窄化转换时,必须注意截尾与舍入问题。在将float或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法。
如果对基本数据类型执行算术运算或按位运算,只要类型比int小(char short或者byte),那么在运算之前,这些值会自动转换为int。
3.16Java没有Sizeof
Java所有数据类型在所有机器中的大小都是相同的,Java不需要sizeof()操作符来满足移植这方面的需要。