posts - 6,  comments - 7,  trackbacks - 0
 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的内容将是毫不相关的。

posted on 2008-03-04 17:33 zhan 阅读(1582) 评论(2)  编辑  收藏

FeedBack:
# re: 关于java变量的引用(reference)
2008-03-04 22:27 | DoubleJ
机制上是这样实现的.
但是@后面的并不是内在地址
  回复  更多评论
  
# re: 关于java变量的引用(reference)
2008-03-05 08:57 | 久城
一直把引用当内存地址理解....  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜