今天阅读java编程思想,发现一个很有意思的东西,以前没有注意到,特此记录一下,如果让两个对象同时绑定到相同的对象上,容易造成对象内的域婚乱,什么意思呢,看看代码你就知道了。
public class Tank {
float level;
}
package liani;
public class Assingment {
public static void main(String[] args) {
Tank t1= new Tank();
Tank t2= new Tank();
t1.level = 9;
t2.level = 47;
System.out.println("1:t1.level: " +t1.level+", t2.level: "+t2.level);
t1 = t2;
System.out.println("2:t1.level: " +t1.level+", t2.level: "+t2.level);
t1.level = 27;
System.out.println("3:t1.level: " +t1.level+", t2.level: "+t2.level);
}
}
你猜,程序运行结果是什么?
**1:t1.level: 9.0, t2.level: 47.0
2:t1.level: 47.0, t2.level: 47.0
3:t1.level: 27.0, t2.level: 27.0**
和想象中的不一样吧,刚开始我以为3那里t1的值应该是27,t2的值还是47呢,但是由于我们做了t1 = t2;把t1也指向了t2所指像的对象,而之前t1指向的对象由于被覆盖,不在被引用,将会被GC清理掉,后来做了t1= t2操作,实际就是修改了对象内值,下面t1.level = 27,修改的时候,所以t2也会被同步掉。
避免别名现象方法是,在赋值的时候不要用对象之间的赋值,用t1.level = t2.levlel
就避免了。
个人理解,若有不到指出,欢迎指正