今天是Java编程思想第四版第三章读书笔记,操作符
第三章 操作符
在最底层,Java中的数据是通过使用操作符来操作的。
1.更简单的打印字句
静态导入net.mindview.util.Print类库
import static net.mindview.util.Print.*;
printf();
2.使用Java操作符
几乎所有Java操作符都只能操作“基本类型”,例外的是“=”,“==”和“!=”。
String类型支持“+”和“+=”。
3.优先级
System.out.printf()包含“+”操作符会尝试将费String类型元素转换为String。
4.赋值
对象的赋值其实是将“引用”赋值到另一个地方。
如 c = d;
那么c和d都指向原本只有d指向的对象。
下面这个小例子挺好的
t2赋给t1后,并非是互相独立桥归桥路归路。而是绑定在一起共同操作同一个对象。这种特殊的现象称为“别名现象”。
5.算术操作符
整数除法后直接去掉小数位,而非四舍五入的结果。
Random类对象
6.自动递增和递减
++i 先计算后取值
i++ 先取值后计算
7.关系操作符
==和!= 比较的是对象的引用。
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
} /* Output:
false
true
n1和n2这两个引用并不相同。
需要比较对象的实际内容使用equals(),此方法不适合基本类型。
public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}
} /* Output:
true
然而,对于自定义类,需要比较对象的内容时,还需要覆盖equals()方法。
class Value {
int i;
}
public class EqualsMethod2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
} /* Output:
false
8.逻辑操作符
与&&,或||,非!
与在C,C++中不同,不可将一个非布尔值当做布尔值在逻辑操作符中使用
如下,i和j都是int类型,以下写法不合法:
//! print("i && j is " + (i && j));
//! print("i || j is " + (i || j));
//! print("!i is " + !i);
如果在使用String值的地方使用bool值,bool值会自动转换成适当的文本形式。(也就是打印逻辑运算式计算结果的时候自动变为文本形式的true or false)
在使用逻辑操作符时,会遇到短路现象,即
boolean a =(2>1)&& (3<1) && (5>2) && (9>3);
在计算到(3>1)为false时,后续两个式子就不再计算,结果a = false不会再改变
9.直接常量
直接常量后缀表明了它的类型,大写(或小写)L,表示long,大写(或小写)F,表示float,大写D,表示double
如:
long n3 = 200;
float f4 = 1r-43f;
十六进制 0x(0X) + 0~f
八进制 0+0~7
将变量初始化的超出表示范围,编译器会报错。
通过使用Integer和Long的toBinaryString()方法,可以轻松又随意的以二进制形式表示。
Java的指数计数法中,e表示10的幂次而非自然数2,.71那个e:
float = 1.39e-43f;
表示1.39*10^(-43)
10.按位操作符
与&,或|,非~,异或^
&=,!=,^=。然而并没有~=,因为~是一元操作符。
对于布尔值,按位操作符具有与逻辑操作符相同效果,但是它们不会中途短路。
11.移位操作符
左移位操作符(<<),低位补0。
“有符号”右移位操作符(>>),高位补0,符号保留。
“无符号”右移位操作符(>>>),无论正负,高位补0。
char,byte,short移位前会被转换为int类型,得到结果也是int类型,只有右端低5位有效。(int类型只有32位)。
因此无符号右移时,它们会被先转成Int型,然后右移操作,然后截断,赋值给原来的类型,在这种情况下可能导致-1的结果。
如下所示:
long得到结果仍然为long,只有低6位有效。(long类型有64位)。
12.三元操作符if-else
boolean-exp ? value1 : value2;
这样虽然使代码紧凑,但是可读性降低,可以使用if else替换。
13.字符串操作符 + 和 +=
如果表达式以一个字符串起头,那么后续所有操作必须是字符串类型(会自动转换的,所有会有“” + int,int自动转换为String )。
比如:
import static net.mindview.util.Print.*;
public class StringOperators {
public static void main(String[] args) {
int x = 0, y = 1, z = 2;
String s = "x, y, z ";
print(s + x + y + z);
print(x + " " + s); // Converts x to a String
s += "(summed) = "; // Concatenation operator
print(s + (x + y + z));
print("" + x); // Shorthand for Integer.toString()
}
} /* Output:
x, y, z 012
0 x, y, z
x, y, z (summed) = 3
0
14.使用操作符时常犯的错误
while(x = y) {
// ....
}
在c,c++不会报错,在Java中编译会报错。
15.类型转换操作符
可以对变量或者数值进行类型转换(cast)。
如果执行窄化转换,数据可能会丢失,编译器会觉得是不是我们搞错了没注意到,此时需要显式的进行类型转换,强调一下。执行扩展转换,则不必显式的进行类型转换。
float和double转化为整型值时,总会对该数字执行截尾。
对于基本数据类型进行算术运算或按位运算,只要类型比int小,在运算前这些书会自动转换成int,即会自动执行数据类型提升。
表达式中出现最大的数据类型决定了表达式最终的数据类型。
16.Java没有sizaof
在C和C++中,需要使用sizeof()最大的原因是为了移植。Java不需要考虑这方面问题,因为所有数据类型在所有机器中的大小是相同的。
17.操作符小结
小心溢出