关于java变量的引用(reference)

关于java变量的引用(reference)
 1  package  cn.com.gentek.imatrix.test;
 2 
 3  public   class  tesRef {
 4       private  DataItem item1;
 5       private  DataItem item2;
 6 
 7       public  tesRef() {
 8          item1  =   new  DataItem();
 9          item2  =  item1;
10      }
11 
12       public   void  newItem1() {
13          item1  =   new  DataItem();
14      }
15 
16       public   void  print() {
17          System.out.println( " item1:  "   +  item1.toString());
18          System.out.println( " item2:  "   +  item2.toString());
19      }
20 
21       public   static   void  main(String[] args) {
22          tesRef tr  =   new  tesRef();
23          tr.print();
24          tr.newItem1();
25          tr.print();
26      }
27  }
28 


    以上一段很简单的代码,很容易看懂。它的运行结果如下:
item1: cn.com.gentek.imatrix.test.DataItem@c17164
item2: cn.com.gentek.imatrix.test.DataItem@c17164
item1: cn.com.gentek.imatrix.test.DataItem@1fb8ee3
item2: cn.com.gentek.imatrix.test.DataItem@c17164

    toString()的结果格式为类名@对象的16进制Hash表示。这里我们可以如此理解,是一个指向DataItem类实例化时,在内存中开辟的一块空间的地址标识。
    在调用函数 tr.newItem1()(24行)之前,item1和item2所指向的内存空间是相同的。所以在改变item1的同时item2的值势必更这一起改变,同理改变item2的内容,item1的内容也会做出相同的改变。 item1.toString()和 item2.toString()的结果正可以说明这一点。这也说明了,item1和item2存储的都是一个内存地址。
    当调用
tr.newItem1(),重新实例化item1,之后item1指向的另一块内存空间,而item2保持不变,指向最初那块内存空间。此时,item1和和item2的内容将是毫不相关的。



你可能感兴趣的:(关于java变量的引用(reference))