随笔-1  评论-3  文章-13  trackbacks-0
看过很多Java的书,里边对Reference讲的五花八门,很多初学者甚至一些学Java学了很长时间的javaor也被Reference搞的晕头转向、找不着北,但是要迈向Java高手的境界,就必须深入的理解这些基础概念。
   其实可以把Reference理解为一种逻辑上的原子类型的数据对象,他的值是对象在内存中的地址,例如,对一个Test类new出了两个对象object1,object2,那么object1==object2的值就是false的,为什么呢,因为是new了两次,就是在内存中生成了两个Test的对象,那么这两个对象的地址肯定是不一样的,所以object1==object2就是false了,但是如果只new了一个对象object,而object1和object2都是都是指向obect的reference,那么object1==object2肯定就是true了,因为object1和object2的值是同一个值,是同一个内存地址(一个对象当然只有一个内存地址,要不就是两个对象了)
  对于Java的参数传递,其实Java的参数传递都是传值的,也就是说在方法中,行参是对实参的一个复制,对于传递对象,其实传的是这个对象的引用(对象在内存中的地址),在方法体内,行参是这个地址的值(值传递),当在方法内修改对象属性时,就根据这个内存地址修改在该地址的对象的属性,这样实参所指的对象的属性就被改变了。根据上边的讲解是很容易理解这一点的,下边的例子可以更好的说明:
 1public class Test{
 2 int t;
 3 String s="hello";
 4 
 5 public static void main(String[] args){
 6  Test test = new Test();
 7  System.out.println(test.t);
 8
 9  test.change1(test);
10  System.out.println(test.t);
11 
12  test.t=0;
13  test.change2(test);
14  System.out.println(test.t);
15   
16  System.out.println(test.s);
17 
18  test.change3(test.s);
19  System.out.println(test.s);
20  
21  test.change4(test);
22  System.out.println(test.s);
23        }

24 
25 public void change1(Test test){
26  test.t=5;
27 }

28 public void change2(Test test){
29  test = new Test();
30  test.t=5;
31 }

32 
33  
34 public void change3(String string){
35  string="hi";
36 }

37 
38 public void change4(Test test){
39  test.s="hi";
40 }

41}

42 
43 
44输出:
450
465
470
48hello
49hello
50hi
posted on 2006-05-13 17:32 romance 阅读(89) 评论(0)  编辑  收藏

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


网站导航: