在最底层,Java中的数据是通过使用操作符来完成的。
1 使用Java操作符
几乎所有的操作符都只能操作“基本类型”。例外的操作符是“=”、“==”和“!=”,这些操作符能操作所有的对象。除此之外,String类支持“+”和“+=”。
2 赋值
赋值使用操作符“=”,取右边的值,把它复制给左边。右值可以是任何常数、变量或表达式。但左值必须是一个明确的已命名的变量,也就是说,必须有一个物理空间可以存储等号右边的值。
①基本类型存储了实际的数值,而并非指向一个对象的引用。所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。
例如(基本类型数据):
a = b;
b的内容复制给a,若接着修改了a的值,b的值并受到这种修改的影响。
在对一个对象进行操作时,真正操作的是对对象的引用。
例如(对象):
c=d;
c和d都指向原本只有d指向的那个对象。当修改c的同时,也修改了d。这种特殊的现象通常称作“别名现象”。
3 操作符
这里只讲解需要特别注意的地方。
①算术操作符
一元加号是为了与一元减号相对应,但是它唯一的作用仅仅是将较小类型的操作数提升为int。
②关系操作符
“==” 和“!=”比较的是对象的引用。如果想比较两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals(),基本类型直接使用“==”和“!=”即可。
所以当需要比较自定义对象的内容时,需要覆盖equals()方法,这样才可能表现出你所希望的行为。
③逻辑操作符
短路:一旦能够确定整个表达式的值,就不再计算表达式余下的部分。
例如:
int a = 1;
int b = 2;
if(a!=1 && b!=2)
//b!=2 不再计算
if(a==1 || b==2)
//b==2 不再计算
④直接常量
直接常量后面的后缀字符标志了它的类型。
大写或小写的字母L,代表long;大写或小写的字母F,代表float;大写或小写字母D,代表double;
⑤指数计数法
通常会将指数作为双精度数处理。
float a = 1e-12f; //表示1*10的-12次方。
所以会在后面加一个f,表示使用类型转换将double转换成float。
⑥按位操作符
按位操作符是用来操纵整数基本数据类型中的单个比特(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
布尔类型作为一种单比特值对待。可以对它执行按位“与”,按位“或”和按位“异或”运算。不能执行按位“非”,避免与逻辑NOT混淆。
public class BitwiseOperators{
public static void main(String[] args){
int a = 21; //10101
int b = 10; //01010
pf(a & b); //输出为0
pf(a | b); //11111
pf(a ^ b); //11111
pf(~a); //11111111111111111111111111101010 32位
pf(~b); //11111111111111111111111111110101
}
static void pf(int i){
System.out.println(Integer.toBinaryString(i));
}
}
⑦移位操作符
移位操作符只可用来处理整数类型(基本类型的一种)。
左移位操作符(<<)能按照操作符右指定的位数将操作符左边的操作数向左移动(在低位补零)。
“ 有符号”右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动。若符号为正,则在高位插入0;若符号为负,则在高位插入1。
Java中增加了一种“无符号”右移位操作符(>>>),无论正负,都在高位插入0。
public class ShiftOperator{
public static void main(String[] args){
int a = -2;
System.out.print("a : "+a+" ");
pf(a); //输出为11111111111111111111111111111111
System.out.print("a << 2 实际值为:"+(a<<2)+" ");
pf(a<<2); //11111111111111111111111111111100
System.out.print("a >> 2 实际值为:"+(a>>2)+" ");
pf(a>>2); //11111111111111111111111111111111
System.out.print("a >>> 2 实际值为:"+(a >>> 2)+" ");
pf(a>>>2); //111111111111111111111111111111
}
static void pf(int i){
System.out.println(Integer.toBinaryString(i));
}
}
/*
程序结果为:
a : -2 11111111111111111111111111111110
a << 2 实际值为:-8 11111111111111111111111111111000
a >> 2 实际值为:-1 11111111111111111111111111111111
a >>> 2 实际值为:1073741823 111111111111111111111111111111
*/
⑧如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串型。
int a = -2;
int c = -1;
String b = "bb";
System.out.println(a+c+b); //-3bb
System.out.println(b+a+c); //bb-2-1
通常表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。