Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1478719
  • 博文数量: 254
  • 博客积分: 8696
  • 博客等级: 中将
  • 技术积分: 2961
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 16:46
文章分类

全部博文(254)

文章存档

2015年(4)

2014年(18)

2013年(16)

2012年(8)

2011年(25)

2010年(2)

2009年(74)

2008年(107)

分类: Java

2008-07-06 17:33:10

java参数与引用

总所周知,java虽然没有引用的概念,但是java在传入参数时,实际传入的参数对象是外部对象的引用,也就是重新生成一个指向外部对象的对象,只不过这两个对象指向的是同一片内存对象而已,我们举例来说明参数和引用的关系,我们假定方法changeString为
        public void changeString(String a ){
                a = new String("I am b!" );
                System.out.println(a);
        }
       
那么当如下调用changeString(String a )方法时
        String a = new String("I am a!" );
        changeString(a);
        ......
java的做法实际等价于
        String a = new String("abc" );
        String b = a;
        changeString(b);
        ............
也就是说在被调用方法内部,传入参数对象和外部对象是不同的对象;虽然两者指向的是同一个内存对象,但是很容易将两者的联系断开,比如我们可以用如下的方法来测试一下
        String a = new String("I am a!" );
        System.out.println(a);
        //调用changeString方法
        changeString(a);
        System.out.println(a);
       
        结果应该为
        I am a!;
        I am b!;
        I am a!;
也就是说外部对象a的值并没有改变,这是因为在changeString(String a )方法内部,参数对象a并不是外部对象a了(其实你如果把方法改成public void changeString(String b)这样更能理解参数对象b和外部对象a是两个对象了),参数对象a和外部对象a是两个对象,指向同一个内存对象new String("abc" ),但是在方法内部,当参数对象a被重新赋值时(a = new String("b" ))时,参数对象
a被重新指向一个新的内存对象new String("I am b!" ),这样参数对象a和外部对象a断开了关系
,再没有任何联系了,因此外部对象a的值也不可能有什么变化。

   通过以上说明,你应该对参数和引用有所理解;说到这里,我们要注意变量的赋值,当使用"="为变量赋值时,一般都是为变量a重新指定一个新的内存对象,因此当用"只读对象"做为参数时,外部对象的值安全的,这些对象和数据包括为
                基本类型,比如int,char
                只读对象,比如String,Integer等
   也就是说你不可能通过调用方法来试图改变原有对象的值,你能通过调用changeValue(int a,int b)来交换a和b的值么?
       

    如果某些时候你需要在方法内部改变原有对象的值怎么办,办法很简单,不要为参数对象指向新的内部对象,并在此基础上,调用参数对象的方法来改变内存对象,比如,我们考虑如下方法
        public void changeBufferValue(StringBuffer sb){
                sb.append("I am b!");
        }
       
如下调用
        StringBuffer a = new StringBuffer("I am a!");
        System.out.println(a.toString());
        changeBufferValue(a);
        System.out.println(a.toString());

输入结果应该为
        I am a!
        I am a!I am b!

如果方法写成
        public void changeBufferValue(StringBuffer sb){
                sb = new StringBuffer("I am b!");
        }
你应该知道结果是什么了吧!,因此当你期望方法内部能改变传入变量的值时,慎用"="号为参数对象重新赋值。
 
 
八种基本数据类型是值传递,对象是引用传递
阅读(1882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~