猜猜下面代码中第三行输出的t2.level
是多少呢?
public class Tank {
private int level;
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 19;
System.out.println("t1.level=" + t1.level + ",t2.level=" + t2.level);
t1 = t2;
System.out.println("t1.level=" + t1.level + ",t2.level=" + t2.level);
t1.level = 29;
System.out.println("t1.level=" + t1.level + ",t2.level=" + t2.level);
}
}
运行结果
t1.level=9,t2.level=19
t1.level=19,t2.level=19
t1.level=29,t2.level=29
我们期望是t1
和t2
是相对独立的,但结果是我们修改了t1
的值之后,t2
的值也跟着变了,原因是t1 = t2
这句话并不是将t2
的值赋值给t1
,而是将t2
这个对象引用赋值给了t1
,也就是说此时t1
和t2
指向了相同的对象。
这种特殊现象通常称作别名现象
,是java
操作对象的一种基本方式,那么如何才能避免这个样的问题呢?
t1.level = t2.level;
这样就能保持两个对象的独立,而不是将t1
和t2
绑定到相同的对象。
还有下面这种情况也属于别名问题
public class Letter {
char c;
static void f(Letter y) {
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
System.out.println("x.c : " + x.c);
f(x);
System.out.println("x.c : " + x.c);
}
}
运行结果
x.c : a
x.c : z