解决方案 »

  1.   

    分两种情况, 
    第一种 基础类型, 这个java里不管是效果还是形式, 只有值传递
    第二种 对象, 这个表现比较奇怪, 效果其实更像是指针而不是引用。而指针,说白了是值传递,传递的是地址值。 java这边也一样, 只是没有指针的形式罢了。 
      

  2.   

    同意该总结,同事对第二种说法进行一下说明,参数是类类型的时候,在传入实参时,如果直接传 new cType(),表示传入的是对象本身,如果传入已经声明好的对象名,则传入的是引用。
      

  3.   

    举例说明:
    class cType{
    public value;
    }
    void fun(cType cobj){
    cobj.value = 10;
    }
    1.调用函数:fun(new cType());
    此时传入的是对象本身。
    2.首先声明对象:cType c = new cType();
      调用函数:fun(c);
    此时传入的是对象的引用,这是调用函数返回之后,对象c的value值为10。
      

  4.   

    Java中传递值有两种方法
    pass by value
    pass by reference
    肯定有啊!
    对于wrapper多数时候请用pass by reference.
      

  5.   

    Java 传一般变量的时候使用的是“值传递”
    Java 传对象(Object)的时候使用的是“引用传递”
      

  6.   

    你对值的理解有些偏差,java的引用传递只是传递了一个地址,而不是整个对象的值。
    而值传递是传递整个数据的值。反正引用传递说破大天也不是值传递,按你的理解,可能是觉得引用传递这个叫法不准确吧。
      

  7.   


    感觉你的说法很有道理,但不知道你说的“传递的都是栈里的的值”是不是正确的。请问有出处吗?JAVA传递的只有值,这个是肯定的了.传递的都是栈里的的值.这句你可以分析一下JAVA的存储机制.它出处是我总结的.哈哈.不知道有哪些书说到.
    我博客里也写了一篇简单的值的传递的笔记http://blog.csdn.net/java_jh/article/details/16921357
      

  8.   

    这里. 对象的传递. 
    例如.对象1的两部份.内存地址--A  内存--a
    对象2 = 对象1   那么对象2的两部份是  内存地址--A副本  内存a 
    它们只是传递了栈里的内存地址.
    对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递. 
      

  9.   

    这里. 对象的传递. 
    例如.对象1的两部份.内存地址--A  内存--a
    对象2 = 对象1   那么对象2的两部份是  内存地址--A副本  内存a 
    它们只是传递了栈里的内存地址.
    对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递. 嗯,非常感谢。看了你的解释我明白了。我总结一下就是:基本类型,复制的就是一个值,这个值是实参的副本,你对这个副本的任何操作都不会影响到实参。
    引用类型,它传递的也是值,这个值是引用的内存地址的复制(相当于两个引用指向了堆中同一对象),那么你对这个对象的操作会同时影响实参和形参。所以,基本类型就是”值传递“,而引用类型就是”引用传递“。
      

  10.   

    不好意思,原理我明白了。但是,我还是想问一下:JAVA是不是只有值传递?(所谓的引用传递,说白了就是堆中对象的别名,其实都是一个东西嘛。所以传递的也是”内存地址这个值“,是不是也算值传递)那么,在C++中的为什么就有”值传递“和”引用传递“两种呢?我个人还是倾向于基本类型是”值传递“,引用类型是”引用传递“
      

  11.   

    给你引用一段编程随想的博文:★传参的问题  引用类型(在函数调用中)的传参问题,是一个相当扯的问题。有些书上说是传值,有些书上说是传引用。搞得Java程序员都快成神经分裂了。所以,我们最后来谈一下“引用类型参数传递”的问题。
      还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:
    System.out.println(str);
    这个语句又是什么意思捏?这时候就两说了。
      第一种理解:
    可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。
      第二种理解:
    可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。
      费了这么多口水,其实不论是传引用还是传值,都可以讲得通,关键取决于你是如何看待参数所传递的东西。这就好比量子力学中“光的波粒二象性”,如果你以粒子的方式去测量它,它看起来像粒子;如果你以波动的方式去观测它,它看起来像波动。假如你不太懂量子力学,前面这话当我没说 :-)出处:http://program-think.blogspot.com/2009/03/java-reference-types-detail.html
      

  12.   

    这个问题在《practice java 》中第一个为我们解答的就是,你可以自己去看看
      

  13.   

    OK。看了很多高手的解答+网上搜资料。总结如下:JAVA确实只存在:”值传递“基本类型:”值传递“,无异议
    引用类型:内存地址传递。首先内存地址是一个值,而我们当成参数时,实际会生成这个值(内存地址)的副本,它和实参指向了堆上相同的对象,而不是在堆上新建一个对象。说白了,还是值的复制。所以,引用类型本质上说还是”值传递“
    =================================================================================
    引用《Head First Java》P78页的原文:问:如果想要传入的参数是对象而不是primitive主数据类型会怎样?
    答:你会在稍后的章节中知道有关这件事情更多的细节,但是你早就知道答案了。在Java中所传递的所有东西都是值,但此值是变量所携带的值。还有,引用对象的变量所携带的是远程控制而不是对象本身。若你对方法传入参数,实际上传入的是远程控制的拷贝。
    =================================================================================
    1. 上文中,primitive主数据类型就是基本类型(8大类)
    2. 红色字体清晰指出”Java只有值传递“
    3. 远程控制就是内存地址
    4. 远程控制的拷贝,很明显值的复制,所以是”值传递“
    =================================================================================
    如果各位还有异议,请明确指出出处。最好是摘抄原文方便大家查看。当然,也欢迎有根据的提出自己的见解。我觉得这个问题应该搞清楚,所以,如果有人能把C++为什么同时有”值传递“和”引用传递“,而JAVA只有”值传递“(或者JAVA也同时有”值传递“和”引用传递“)的原因讲清楚,我想很多人都会或偶然开朗的。谢谢~~~
      

  14.   


    第二种理解明显的错的,str只是一个引用。new StringBuffer()才是一个对象。
      

  15.   

    学了JAVA,还真没认真区分过这个问题,一直把它当作和C语言的指针来处理,只是JAVA里面没有指针这一概念而已
      

  16.   

    我上午看了一篇文章,也是说的这个参数传递问题的,我感觉很容易理解,不懂的可以去看下http://blog.csdn.net/cocoa_cactus/article/details/16992091