赋值-读Thinking in java

来源:互联网 发布:cef js 掉c 编辑:程序博客网 时间:2024/05/16 04:00
package thinkinginjava.exercise.chapter.one;public class Assignment {public static void main(String[] args) {/*对象赋值出现别名*/Tank t1 = new Tank();Tank t2 = new Tank();//t1,t2分别为两个对象的引用到堆当中t1.f = 20;t2.f = 30;System.out.println(t1.f+"  "+t2.f);t1 = t2;//将t2引用赋值给t1,这时候t1这个引用就被覆盖掉了,t1这个引用就会被Java的垃圾回收器回收了//t1和t2这两个引用就指向同一个对象,System.out.println(t1.f+"  "+t2.f);t1.f = 40;System.out.println(t1.f+"  "+t2.f);t2.f = 50;System.out.println(t1.f+"  "+t2.f);//在赋值之后,无论是修改t1,还是t2,都是指向同一个对象,所以输出的值,都会是一样/*基本类型赋值无别名*/int i1 = 20;int i2 = 30;//基本类型不是用new来创建变量,所以不是创建引用,而是直接创建变量到堆栈当中,该变量直接存储有值i1 = i2;//基本类型的赋值不存在别名的问题System.out.println(i1+"  "+i2);i1 = 40;System.out.println(i1+"  "+i2);/*方法中调用的别名*/Tank t3 = new Tank();t3.f = 90;Assignment.f(t3);System.out.println(t3.f);//方法的参数中传递对象,如果针对对象进行操作,也会出现别名的问题}static void f(Tank t){//这里实则是传递了一个引用到f方法当中//f方法实际上是更改了f之外对象的值t.f = 100;}}class Tank{float f;}