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);}}/* output1:9 272:27 273:80 804: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);}/*output1:y2:x*/
