看到许多帖子在讨论JAVA的method在使用变量(parameter)时是pass-by-value还是pass-by-reference.
SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055)做出了解释,也算是权威性的吧。“Does Java Use Pass-By-Value Semantics?
If Java passes objects by passing the reference variable instead, does that mean Java uses pass-by-reference for objects? Not exactly, although you'll often hear and read that it does. Java is actually pass-by-value for all variables running within a single VM. Pass-by-value means pass-by-variable-value. And that means, pass-by-copy-of-the-variable! (There's that word copy again!)
”不管method的parameter是primitive variable 还是 renference variable,都是值传递。都传递的是代表该变量的位的拷贝(the copy of bits representing the variable). 比如,int a = 3, 传递的是代表a的位的拷贝;Dog dog = new Dog(),传递的是代表指向Dog的dog的位的拷贝(the copy of bits representing the reference refer to the object)。希望大家以后不要再争论了,向下一难关挺进!:D

解决方案 »

  1.   

    我想你理解有误。by value 是指类似int这样的参数,系统实际传递给方法的就是这样一个数字,而不是什么地址
    by reference 传过去的是对象的地址,而不是对象自己。如果以前搞过汇编,我想最清楚了。
      

  2.   


    我觉得lz理解是对的
    by reference应该不是简单的指传递地址,应该指当传递一个参数时,实际传递的并不是参数的值,而是参数的地址,才能称为引用传递。
    by value是传递参数的值,而不管参数的值是什么。对于Java,引用作为参数时,传递的是引用的值,而不是引用的地址。至于引用的值代表什么那并不重要。如果硬要说,那在C中,地址就是一个32位的值,比如0x0012FF7C,照样可以说它是int型。(Java中还真不知道怎么输出一个变量的地址,估计也差不多吧)
      

  3.   

    我是这样理解的
    JAVA中的基本数据变量,如int,long,byte,boolean这些都是by value;
    而JAVA中的对象都是by reference,譬如上面提到的基本数据变量的封装类Integer,Long,Boolean等
      

  4.   

    一些权威的书上说的都是pass by value
    比如java编程语言,java核心技术等等。
    一个很重要的问题是传进方法的参数可以重新赋值。
    方法里的参数可以指向新的对象,如果是引用的话方法里的参数指向新的对象了,外面的引用应该也指向新的对象才对,这就跟java的设计不符了。
      

  5.   

    C++ 和 Java 中的传递引用完全是两个不同的概念,能混为一谈吗?
      

  6.   

    这要看大家是怎么理解的。在本质上,传递的都是二进制代码。之所以有争论,是因为看待这个二进制代码的看法不一样。如果把二进制都当成数据,那就是pass by value。但是如果去区分这些二进制数据本身的意义,根据数据代表的意义不同,就可以分成pass by value和pass by reference了。所以呢,每一位理解的都对,用得对就可以了。
      

  7.   

    我见过的sun的资料中,比如James Gosling的<The Java Programming Language>,<The Java Tutorial>,还有一些认证的资料,说法都是pass by value.从没见过pass by reference的说法。
    Core Java也是坚持pass by value的说法。这是The Java Tutorial中的说法:
    Passing Reference Data Type Arguments
    Reference data type parameters, such as objects, are also passed into methods by value. This means that when the method returns, the passed-in reference still references the same object as before. However, the values of the object's fields can be changed in the method, if they have the proper access level.我现在特别想知道pass by reference 到底是谁提出来的。
      

  8.   


    估计最开始是C++中的东西吧,不知道谁没事把它拿到Java中来讨论了
    C++中传地址(值传递)和引用传递是不一样的,后来C#之类好像就更牛了,不懂了
    http://blog.programfan.com/article.asp?id=36710
      

  9.   

    查了一下java 语言规范,上面也是说传值。
    When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables, each of the declared Type, before execution of the body of the method or constructor.
      

  10.   

    希望坚持pass by reference的人指出这个说法的出处。
      

  11.   


    这位仁兄把C++中的reference和Java中的reference混淆了。在Java中,reference代表一种到达指定对象的方法(reference represent a way to get to the specific object).
      

  12.   

    primitive variable和object reference都存放在栈内存,我的理解是,传的都是栈内存的数据,这样行不?
      

  13.   


    object reference 如果在函数之外,是存入内存的堆(heap)里。之内的话是存在栈stack。