Double作为参数应该是引用传递吧,double应该是值传递吧,可是我现在调试出来的现象是Double也是值传递
不知道为什么,是不是我理解的有问题,望高手告知!谢谢

解决方案 »

  1.   

    因为自动装箱吧。Double和double的行为看上去一样
      

  2.   

    double:原始类型
    Double:引用类型
    引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
      
    Double是对象而double不是,内存的分配位置也不一样double是一种基本数据类型,而Double是相应于double的类类型,称为对象包装。   
    实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;   
    另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。
      

  3.   

    请问java_cxrs, Double参数传递是引用类型吗?为什么我测试下来的结果是值传递呢?
      

  4.   

    看下API 里那个类 然后 一个个测试下 比如 INT的
      

  5.   

    很多地方都这么说:
    java只有值传递,
    如果参数是引用类型,那么传递的值就是这个引用。
    把代码发出来,大家看看。
      

  6.   

    java不是只有值传递吗?本质上都是值传递
      

  7.   

    你怎么写的代码,贴上来看看。
    double是值传递,但是Double是对象,对象都是引用传递。
      

  8.   

    基本数据的包装类比较特殊吧!
    Double对象本身没有相应的加、减、乘、除的方法。
    那么对它的修改实际上应该是通过拆装箱转化成基本数据类型,进行加、减、乘、除后,又通过自动拆装箱转化成Double对象。
    在转化成Double对象时,应该已经不是以前的对象了吧!个人猜测,有误请高手指正。
      

  9.   

    Double 是个值类型,你怎么可以用 Double 去测试引用传递。用 List 或者 Map 之类的都行,就别用 String 和 Number 下的子类。
      

  10.   

    1 Double 是把引用作为值的值传递  , 2 另, Api里没有对Double 对象进行改变的方法(类型转换除外)。
      

  11.   

    Double 是作为对象传递的, double 是值传递.
      

  12.   

    java只有值传递,引用传递也是值传递,传的是复制的引用
      

  13.   

    double
    Doulbe
    用的时候把他们看成一样就可以了.
    不要被一些细微的区别搞混了.
      

  14.   

    结贴了,总之测试下来的结果就是Double也是值传递,我用StringBuffer就是引用传递。
      

  15.   

    java中只有值传递,引用传递说白了也是值传递
      

  16.   

    http://www.cndw.com/tech/program/2006042962403.asp
      

  17.   

    double是值传递   Double是地址传递
      

  18.   

    Double是个类肯应该引用传递吧?
      

  19.   

    贴出你的调试过程吧,让大家分析一下;java 1.5之后,基本数据类型能自动封装成对应的对象,自动解封也是可以的
      

  20.   

    楼主应该把代码贴出来。
    对象都是引用传递,基本数据类型是值传递,个人认为,前者很容易引起误解: public class Person {
    private String name = "aa"; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } /**
     * 用来证明传递的是引用
     * */
    public void changePer(Person p) {
    p.setName("bb");
    } /**
     * 虽然传递引用,但这个方法产生的作用不会起到预期的效果....
     * */
    public void reInitPer(Person p1) {
    p1 = new Person();
    } public static void main(String[] args) {
    Person p = new Person();
    p.changePer(p);
    System.out.println(p.getName());
    p.reInitPer(p);
    System.out.println(p.getName());
    }
    }
    运行结果是 : 
    bb
    bb
      

  21.   

    对于reInitPer,p把引用传递给p1,则p、p1都指向同一个对象;注意,p和p1是两个不同的引用!然后p1重新赋值,则它指向另一个对象,但p所指向的对象地址并未改变,p1爱指哪儿就指哪儿,与p无关。
      

  22.   


    你总结的不对!
    虽然Double和double表现出来的结果看似一样,但其机理是完全不一样的。
    你之所以有这样错误的理解,是因为Double没有提供任何修改其内容的方法,而StringBuffer的append就可以改变内容。
      

  23.   

    Double 引用类型, double 原始类型
      

  24.   

    楼主是想做类似下面这个操作吧:void change(Integer i){
       i=2
    }
    ...
    Integer a=1
    change(a)
    System.out.println(a);  // 如果我没理解错的话,你是想得到a=2是吗?
    ....
    我试着分析一下,大家讨论看看是不是这样的:
    1. Integer a=1, 这时执行auto-boxing, 创建一个Integer对象(注意它是匿名的,假设引用为ref1),
       它的value(也就是Integer.value属性)值是1, 然后再把ref1赋值给a,
       这时a的值=ref1
    2. change(a), 把a传递给i, 这时i的值变成了ref1
    3. i=2, 同1的操作,执行auto-boxing操作,这时会创建另外一个匿名对象ref2,它的value值为2,然后对i付值,这时i的值是ref2
    4. 这时a的值还是ref1,而ref1的value还是1, 所以你就会感觉好像和一般的对象引用传递不一样.
    5. 结论就是: 
       a. Integer和String一样是不可变对象(Immutable)
        b. Auto-boxing的操作在赋值时是创建一个新的Integer类,而不是修改被赋值Integer对象的value值