1. 赋值
- 对于基本数据类型赋值是很简单的。基本数据类型存储了实际的值,而不是指向对象的引用。例如,对基本数据类型使用a=b,那么b的内容就复制给a了,若接着修改a,b不会受到影响。
- 为对象赋值时则不同。对对象进行操作时,我们真正操作的是对象的引用。所以如果“将一个对象赋值给另一个对象”,实际上是将“引用”复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向d原来指向的那个对象。下面的例子阐述了这一点。
import static net.mindview.util.Print.*; class Tank{ int level; } public class Assignment{ public static void main(String[] args){ Tank t1 = new Tank(); Tank t2 = new Tank(); t1.level = 4; t2.levle = 3; print(t1.level+" "+t2.level); t1 = t2; print(t1.level + " " + t2.level); t1.level = 5; print(t1.level + " " + t2.level); } }
当对t1赋值时,这个引用被覆盖,也就是丢失了,而对那个不再被引用的对象,即4 会由“垃圾回收器”自动清理。
这种现象叫做“别名现象”,要想避免这种现象,应该写成t1.level=t2.level
,这样就可以保持两个对象彼此独立。 - 方法调用中的别名现象
class Letter{ char c; } public class PassObject { static void f(Letter y){ y.c = 'a'; } public static void main(String[] args){ Letter x = new Letter(); x.c = 'b'; print(x.c); f(x); print(x.c); } }
方法f()仿佛要在它的作用域内复制其参数Letter y的一个副本,但实际上只是传递了一个引用,y.c = 'a' 实际改变的是f()之外的对象。
2. 逻辑操作符
- 短路
public class ShortCircuit {
static boolean test1(int val){
System.out.println("test1"+val);
System.out.println("result"+(val<1));
return val<1;
}
static boolean test2(int val){
System.out.println("test2"+val);
System.out.println("result"+(val<2));
return val<2;
}
static boolean test3(int val){
System.out.println("test3"+val);
System.out.println("result"+(val<3));
return val<3;
}
public static void main(String[] args) {
boolean b = test1(0)&&test2(2)&&test3(2);
System.out.println(b);
}
}
三个测试结果中,第一个是true,第二个是false,由于这意味着整个表达式都是false,所以没必要继续计算剩余的表达式,那样只是浪费,这就是短路。
3. 类型转换
- 注意当类型转换成一个较小的类型时,必须注意“窄化转换”的结果,否则会在类型转换时不知不觉丢失了信息。在计算过程中还有可能会出现溢出。
网友评论