class Tank{
int leael;
}
public class Assignment{
public static void main(String[] args){
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 27;
print(t1.level + t2.level);
t1 = t2;
print(t1.level + t2.level);
t1.level = 80;
print(t1.level + t2.level);
t1 = new Tank();
print(t1.level + t2.level);
}
}
/* output
1:9 27
2:27 27
3:80 80
4:0 80
*/
之所以出现以上输出结果其原理图如下:
原因就在于赋值操作的是一个对象的引用,即将t2的引用copy了一份给t1,当t1没有受到引用改变(例如t1=new Tank()重新分配内存),两份引用指向的是同一个内存地址,可以通过任意一个引用来操作此时的对象。当t1的引用受到改变后,引用指向的内存地址就此更改,但t2的引用仍然指向原来的内存地址。和此类似的方法别名问题也是这个原因。
public static class Letter{
char c;
}
public static class Change{
static void change(Letter l){
l.c = 'y';
}
}
public static class Change1{
static void change(Letter l){
l = new Letter();
l.c = 'x';
}
}
public static void main(String[] args) {
Letter letter1 = new Letter();
letter1.c = 'a';
Change.change(letter1);
System.out.println(letter1.c);
Change.change1(letter1);
System.out.println(letter1.c);
}
/*output
1:y
2:x
*/