Java基本功:Reference

来源:互联网 发布:网络规划设计师很难吗 编辑:程序博客网 时间:2024/05/16 05:09

看过很多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的参数传递都是传值的,也就是说在方法中,行参是对实参的一个复制,对于传递对象,其实传的是这个对象的引用(对象在内存中的地址),在方法体内,行参是这个地址的值(值传递),当在方法内修改对象属性时,就根据这个内存地址修改在该地址的对象的属性,这样实参所指的对象的属性就被改变了。根据上边的讲解是很容易理解这一点的,下边的例子可以更好的说明:

public class Test{
 int t;
 String s="hello";
 
 public static void main(String[] args){
  Test test = new Test();
  System.out.println(test.t);

  test.change1(test);
  System.out.println(test.t);
 
  test.t=0;
  test.change2(test);
  System.out.println(test.t);
   
  System.out.println(test.s);
 
  test.change3(test.s);
  System.out.println(test.s);
  
  test.change4(test);
  System.out.println(test.s);
        }
 
 public void change1(Test test){
  test.t=5;
 }
 public void change2(Test test){
  test = new Test();
  test.t=5;
 }
 
  
 public void change3(String string){
  string="hi";
 }
 
 public void change4(Test test){
  test.s="hi";
 }
}

 
 
输出:
0
5
0
hello
hello
hi

原创粉丝点击