在最底层,Java中的数据是通过使用操作符来操作的。
赋值运算符
- =
在Java中,基本类型的赋值会改变被赋值变量的值,但是对对象的赋值改变的是引用
class Tank {
int level;
}
public class Assignment {
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
t1.level = t2.level;//赋值后t1.level,t2.level都为47
t1 = t2;
t2.level = 27;//此时t1.level,t2.level都为27,因为上一行中t1=t2让t1、t2都指向了同一个对象
}
}
在方法传参数上,传递的对象也是一个引用,而不是形参。
算术操作符
- +
- -
- *
- /
- %
- +=
- -=
- *=
- /=
- %=
一元加减操作符
- +
- -
x=-a;
x=+a;
自动递增和递减
- 前缀递增、后缀递增(a++,++a)
- 前缀递减、后缀递减(a–,–a)
关系操作符
- >
- <
- >=
- <=
- ==
- !=
String a = new String("abc");
String b = new String("abc");
a == b;//false
a.equals(b);//true
//==比较的是引用,因为两个字符串是不同的对象,所以结果是false,equals比较的才是值。
class Value {
int i;
}
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
v1.equals(v2);//false
//此处为什么是false呢,因为equals()的默认行为是比较引用,所以要覆盖equals()方法,另外如果要深入研究hashCode()方法。
逻辑操作符
- &&
- ||
- !
短路原则
- 对于expression1&&expression2&&expression3,如果左边的运算得到的结果为false,总的结果一定为false,所以下一步运算便不再进行下去
- 同理expression1||expression2||expression3,如果左边的运算得到的结果为true,总的结果一定为true,发生短路
直接常量
int a = 0x2f;
int b = 0177;
long c = 100L;
float d = 100F;
double e = 100D;
//大小写均可
指数计数法
float expFloat = 1.39-43f;
//expFloat的值为1.39*10的-43,e表示的并不是自然对数的基数
按位操作符
- &
- |
- ~
- ^
移位操作符
- << 在低位补0
- >> 在高位按符号补,正数补0,负数补1
- >>> 高位补0
- <<=
- >>=
- >>>=
public class URShift {
public static void main (String[] args) {
int i = -1;
print(Integer.toBinaryString(i));
i>>>= 10;
print(Integer.toBinaryString(i));
//结果是:
//11111111111111111111111111111111 32位
//1111111111111111111111 22位
long l = -1;
print(Long.toBinaryString(l));
l>>>= 10;
print(Long.toBinaryString(l));
//结果是:
//1111111111111111111111111111111111111111111111111111111111111111 64位
//11111111111111111111111111111111 1111111111111111111111 54位
short s = -1;
print(Integer.toBinaryString(s));
s>>>= 10;
print(Integer.toBinaryString(s));
//结果是:
//11111111111111111111111111111111 32位
//11111111111111111111111111111111 32位
byte b = -1;
print(Integer.toBinaryString(b));
b>>>= 10;
print(Integer.toBinaryString(b));
//结果是:
//11111111111111111111111111111111 32位
//11111111111111111111111111111111 32位
b = -1;
print(Integer.toBinaryString(b));
print(Integer.toBinaryString(b>>>10));
//结果是:
//11111111111111111111111111111111 32位
//1111111111111111111111 22位
如果对char、byte、short类型的数值进行移位处理,那么在移位进行之前,它们会被自动转换为int类型,并且结果也是int类型。上述的结果倒数二三个例子的结果赋值回byte,short变量中,所以结果被截断了,再打印出来的时候又转成int类型输出,所以结束依然是32位,而最后一个例子运算到的结果得到22位的结果就被直接打印出来了。所以结果没有错。
三元操作符
- ? :
字符串操作符
- +
- +=
类型转换操作符
- 窄化转换 (显式转换)
- 扩展转换 (隐式转换)
提升
byte或者short类型的数执行算术运算或按位运算后,值会自动转换成int。如果要把结果赋值给较小的类型,就必须使用类型转换。
以上皆个人学习的总结,如有不对之处,欢迎指出。邮箱:527219336@qq.com