1. 赋值
public static void main(String[] args) {
Integer i = new Integer(9);
Integer j = new Integer(47);
i = j;
i = 27;
System.out.println(i + ":" + j);
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
t1 = t2;
t1.level = 27;
System.out.println(t1.level + ":" + t2.level);
}
上述代码的输出结果为27:49, 27:27。
第一段代码不难理解,第二段可能会有疑惑,可以看下图。
步骤1,new出来赋值的时候,t1,t2分别指向了不同的对象
步骤2,t1 = t2时,只是将t1的引用指向了t2,此时两个指向同一个对象
步骤3,t1.level = 27,此时改变的是t1,t2共同指向对象的值,因此最后的值都相同
然后再回过来想第一段代码,可能反而有疑惑了。看Integer源码,可以发现value被定义了final,无法修改,所以i=j时是同一对象,但i=27时其实指向了另一个对象,因此最后值是不一样的。
2. 算术操作符
public static void main(String[] args) {
int a = 2;
int x = a-- * -a--;
int b = 2;
int y = ++b * +b++;
System.out.println(x);
System.out.println(y);
int weekly = 65;
int holiday = 112;
System.out.println(Integer.toBinaryString(weekly | holiday));
}
上述代码用了一些不常用的操作符,需要考虑到操作符的优先级
x = 2 * -1 = -2
y = 3 * 3 = 9
此处或操作可以用来计算节假日的集合
假设1000001代表周六周日放假,1110000代表节假日放假,周日周一周二放假,进行或操作,得到结果1110001