CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

关于值传递和引用传递的一点点疑惑。

楼主chaos_blue(chaos(混沌))2006-12-01 11:58:19 在 Java / J2SE / 基础类 提问

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递  
  他给的答案是:是值传递。Java   编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的  
   
   
  小弟不太明白,好像和自己对值类型与引用类型的理解不太一样,请熟悉这个的人给解释一下好么?  
   
  感谢中。晚上结贴。 问题点数:100、回复次数:16Top

1 楼malligator(十步之内没有我的爱人)回复于 2006-12-01 12:32:21 得分 5

对象参数传的是地址的拷贝(它指向同一个内存单元)而不是地址本身,用=只改变拷贝的指向,没有改变本身:通过=给对象引用赋值都是徒劳的  
   
  只能通过类封装好的方法改变其内容(改的是它指向的内存)  
  Top

2 楼zeroasan_()回复于 2006-12-01 12:35:13 得分 20

确实java只有值传递  
  不过我总觉得这样讲有些误导人的嫌疑。  
   
  其实参数传递,传递的只有两种形式的参数,一种是基本类型参数,一种对象参数。  
  基本类型传递的是数值,而对象传递传的是对象引用值。所以说java只有值传递。其实这个概念被强调应该是区别于c++的。  
   
  其实很简单的一个概念,初学者最早理解基本都是正确的,却被“只有值传递”弄糊涂了Top

3 楼For_suzhen(不懂装懂)回复于 2006-12-01 12:55:13 得分 2

引用Top

4 楼liuzhongsheng1984()回复于 2006-12-01 13:00:07 得分 2

就像遥控器和电视的关系一样  
  传的是遥控器的copy,但是这个copy还是可以操作那台电视的。Top

5 楼theforever(碧海情天)回复于 2006-12-01 14:54:48 得分 1

楼上的比喻很形象Top

6 楼jicken_woo(黑夜里你留下的轮廓,指引我-------不寂寞---------------)回复于 2006-12-01 15:15:45 得分 1

学习学习。。。Top

7 楼sxnucseven(*)回复于 2006-12-01 15:16:42 得分 2

这像是文字游戏,可以尽量的去绕过这些名词去理解真正的执行过程。这样会好些。Top

8 楼syoumei(良匠不择器)回复于 2006-12-01 15:24:27 得分 2

 
  今天这板块第4个这类问题了  
   
  100分诱惑有点  
   
  不过我忍了  
   
  劝君多看结账贴Top

9 楼yslf8517()回复于 2006-12-01 17:47:36 得分 10

我感觉,之所以Java   声称只有值传递参数,没有引用传送的原因是:还是为了区别C++中的指针,维护自己据说的JAVA中没有指针引用。  
  这样话,当对象作为参数进去后,它让我们理解传的只是一个引用,把这个引用当个值,可能是一个内存地址值,这样话在里面所作的修改,都可能影响到这个对象的具体属性。  
   
  不知道,你是否明白了?Top

10 楼AWUSOFT(程序设计,一个字:爽!)回复于 2006-12-01 17:57:44 得分 35

这样给你解释看看吧....  
  A   a;这里定义一个变量  
  a=new   A();这里把创建的对像的内存首地址给它,所说a变量的值只是一个地址值.  
   
  当传参数的时候  
  public   void   s(A   b)  
  {  
  }  
  这时候也是创建一个变量b,然后把变量a的值(地址值)给b,所以b和a就是引用了同个对像,因为它们的值是同一个地址值.  
  所以说是传"值"-------------->地址值  
   
  但是它们都是指向同一个对像(因为地址值相同)-----这就产生了引用传值的说法.Top

11 楼marckle(小马哥)回复于 2006-12-01 18:13:02 得分 2

赞同zeroasan_(),我觉得他已经说得很清楚了。  
  Top

12 楼aniude(重返荣耀)回复于 2006-12-01 18:33:11 得分 4

通常来说值传递不会占用太多的内存空间,但是传递对象时如果用值传递的话一般来说会占用很多的内存,那么选择引用传递是比较合理的。Top

13 楼aniude(重返荣耀)回复于 2006-12-01 18:34:37 得分 2

by   the   way,100分真的有点诱惑   :)Top

14 楼schumiXsuse(我记住了名字,却忘记了密码)回复于 2006-12-01 23:52:11 得分 7

楼主看这里:  
  当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递  
  他给的答案是:是值传递。Java   编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的  
  ------------------------------------------------------------------------------------  
  首先要声明,JAVA中只有值传递,没有地址传递。  
  然后我们来看,JAVA中对象分为两种,一种是基本类型,另一种是引用类型。基本类型是值传递这个没什么好说的;引用类型则麻烦一点,我们来看个例子:  
   
  class   ReferObj    
  {  
        private   int   arr   =0;  
         
        ReferObj(int   i)  
        {  
                this.arr   =   i;  
          }  
       
          public   void   setArr(int   i)  
          {  
                this.arr   =   i   ;  
          }    
       
        public   String   toString()  
        {  
              return   this.arr;  
          }  
   
  }  
   
  public   class   Test  
  {  
         
        void   modifyArr(ReferObj   obj   ,   int   i)  
        {  
            obj.setArr(i)  
        }  
   
        void   modifyObj(ReferObj   obj   ,   int   i)  
      {  
            obj   =   new   ReferObj(i);    
        }  
   
        public   static   void   main(String[]   args)  
        {  
            Test   test   =   new   Test();  
           
            ReferObj   obj   =   new   ReferObj(1)     ;  
           
            test.modifyArr(obj   ,2);  
   
            test.modifyObj(obj   ,3);  
         
            System.out.print(obj);  
      }  
             
      搂主说,这段程序会打印什么呢?呵呵,当然是2。  
        这是因为在JAVA中,初始化一个引用类型的变量会初始化两个变量,一个引用,一个对象本身,在JAVA中传递的实际上是引用的COPY,也就相当于引用的值传递,所以在程序中你能改变的只是引用指向的对象的属性,而不能改变引用的指向。  
             
   
         
         
       
             
   
   
   
  Top

15 楼AWUSOFT(程序设计,一个字:爽!)回复于 2006-12-01 23:55:52 得分 0

 
   
   
   
   
   
  --如果明白了请结贴,你的结贴是我回贴的最大动力Top

16 楼meconsea(罂粟(mecon))回复于 2006-12-02 10:50:27 得分 5

http://blog.csdn.net/meconsea/archive/2005/03/23/327294.aspxTop

相关问题

关键词

得分解答快速导航

  • 帖主:chaos_blue
  • malligator
  • zeroasan_
  • For_suzhen
  • liuzhongsheng1984
  • theforever
  • jicken_woo
  • sxnucseven
  • syoumei
  • yslf8517
  • AWUSOFT
  • marckle
  • aniude
  • aniude
  • schumiXsuse
  • meconsea

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo