关于Java中参数传递的问题:在网上看到一各说法:"Java只有一种参数传递方式:那就是按值传递,即Java中传递任何东西都是传值。如果传入方法的是基本 类型的东西,你就得到此基本类型的一份拷贝。如果是传递引用,就得到引用的拷贝。"真的是这样吗?对于基本类型是按值传递,我很容易理解.
可是对于传递引用,也是按值传递,我就不明白了,传的是什么值???
求解!

解决方案 »

  1.   

    为什么把按引用传递看作是按值传递?
    对于这种问题,还是套用Bruce Eckel的话:这依赖于你如何看待引用,最终你会明白,这个争论并没那么重要。真正重要的是,你要理解,传引用使得(调用者的)对象的修改变得不可预期。请问:"传引用使得(调用者的)对象的修改变得不可预期. "这句话是什么意思???
      

  2.   

    我把例子也贴上来,大家可以对照这个讲一下:public class ObjectRef {
    // 基本类型的参数传递
    public static void testBasicType(int m) {
    System.out.println("m=" + m);// m=50
    m = 100;
    System.out.println("m=" + m);// m=100
    } // 参数为对象,不改变引用的值
    public static void add(StringBuffer s) {

    s.append("_add");
    } // 参数为对象,改变引用的值
    public static void changeRef(StringBuffer s) {
    s.append("_111");
    s = new StringBuffer("Java"); 
    s.append("_222");
    } public static void main(String[] args) {
    int i = 50;
    testBasicType(i);
    System.out.println(i);// i=50
    StringBuffer sMain = new StringBuffer("init");
    System.out.println("sMain=" + sMain.toString());// sMain=init
    add(sMain);
    System.out.println("sMain=" + sMain.toString());// sMain=init_add
    changeRef(sMain);
    System.out.println("sMain=" + sMain.toString());// sMain=init_add_111
    }}
      

  3.   


    你能确定按引用传递传的是hashcode?
    有什么依据?
      

  4.   

          这问题怎么说呢,看个人理解的。
          依照我的理解是,java就是分两类东西,一类是变量,一类是对象。在代码里面走的都是变量而不是对象。传参数,永远都是复制一个变量,作为参数传进去,而不是不会复制一个对象传进去。所以严格的意义上来说都是传值,而不是传址。只是由于代表对象的变量是一个记录地址的指针。所以才有传址一说。
      

  5.   

    java也有人说有传递引用的概念.但和传统的引用传递不一样。 
    Java中一切都是值传递。你可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候,like this: Apple a = new Apple(); a 存的就是这个对象实例的地址。而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。 
    所以说java中的都是按值传递
      

  6.   

    传递的是变量的值。
    先理解引用变量是个什么东西。
    Core Java这本书上画图说明了,建议去看看。一看内存图就明白了
      

  7.   

    基本类型(int, double.....), 可变对象(stringbuffer, Date .....)传值.
    不变对象(String....) 传址.
      

  8.   


    首先需理解
    引用的值跟引用值里存放的内容是两个不同东西,引用作为参数里,引用的值是不会改变的,而引用值存放的内容是可以修改的。看下面解释:
    int i = 50;
    testBasicType(i);   //i把值传给参数m后,i就什么都不管,走人了,你这样理解,i只是给m赋值,相当于只执行一句m=i,函数里面是 对m操作,当然不会对i有作用了
    System.out.println(i);// i=50,
    StringBuffer sMain = new StringBuffer("init");
    System.out.println("sMain=" + sMain.toString());// sMain=init
    add(sMain);    //这句相当于执行了这句,参数s=sMain,也就是s跟sMain指向同一地址,函数里面操作是的s,所以并不能改变sMain的指向地址,但s改变了它指向地址的内容的话(注意是地址里存放的内容,而不是地址的值),sMain指向地址的内容也会改变.
    System.out.println("sMain=" + sMain.toString());