Double 引用传递问题? Double作为参数应该是引用传递吧,double应该是值传递吧,可是我现在调试出来的现象是Double也是值传递不知道为什么,是不是我理解的有问题,望高手告知!谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为自动装箱吧。Double和double的行为看上去一样 double:原始类型Double:引用类型引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 Double是对象而double不是,内存的分配位置也不一样double是一种基本数据类型,而Double是相应于double的类类型,称为对象包装。 实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法; 另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。 请问java_cxrs, Double参数传递是引用类型吗?为什么我测试下来的结果是值传递呢? 看下API 里那个类 然后 一个个测试下 比如 INT的 很多地方都这么说:java只有值传递,如果参数是引用类型,那么传递的值就是这个引用。把代码发出来,大家看看。 java不是只有值传递吗?本质上都是值传递 你怎么写的代码,贴上来看看。double是值传递,但是Double是对象,对象都是引用传递。 基本数据的包装类比较特殊吧!Double对象本身没有相应的加、减、乘、除的方法。那么对它的修改实际上应该是通过拆装箱转化成基本数据类型,进行加、减、乘、除后,又通过自动拆装箱转化成Double对象。在转化成Double对象时,应该已经不是以前的对象了吧!个人猜测,有误请高手指正。 Double 是个值类型,你怎么可以用 Double 去测试引用传递。用 List 或者 Map 之类的都行,就别用 String 和 Number 下的子类。 1 Double 是把引用作为值的值传递 , 2 另, Api里没有对Double 对象进行改变的方法(类型转换除外)。 Double 是作为对象传递的, double 是值传递. java只有值传递,引用传递也是值传递,传的是复制的引用 doubleDoulbe用的时候把他们看成一样就可以了.不要被一些细微的区别搞混了. 结贴了,总之测试下来的结果就是Double也是值传递,我用StringBuffer就是引用传递。 java中只有值传递,引用传递说白了也是值传递 http://www.cndw.com/tech/program/2006042962403.asp double是值传递 Double是地址传递 Double是个类肯应该引用传递吧? 贴出你的调试过程吧,让大家分析一下;java 1.5之后,基本数据类型能自动封装成对应的对象,自动解封也是可以的 楼主应该把代码贴出来。对象都是引用传递,基本数据类型是值传递,个人认为,前者很容易引起误解: 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()); }}运行结果是 : bbbb 对于reInitPer,p把引用传递给p1,则p、p1都指向同一个对象;注意,p和p1是两个不同的引用!然后p1重新赋值,则它指向另一个对象,但p所指向的对象地址并未改变,p1爱指哪儿就指哪儿,与p无关。 你总结的不对!虽然Double和double表现出来的结果看似一样,但其机理是完全不一样的。你之所以有这样错误的理解,是因为Double没有提供任何修改其内容的方法,而StringBuffer的append就可以改变内容。 Double 引用类型, double 原始类型 楼主是想做类似下面这个操作吧:void change(Integer i){ i=2}...Integer a=1change(a)System.out.println(a); // 如果我没理解错的话,你是想得到a=2是吗?....我试着分析一下,大家讨论看看是不是这样的:1. Integer a=1, 这时执行auto-boxing, 创建一个Integer对象(注意它是匿名的,假设引用为ref1), 它的value(也就是Integer.value属性)值是1, 然后再把ref1赋值给a, 这时a的值=ref12. change(a), 把a传递给i, 这时i的值变成了ref13. i=2, 同1的操作,执行auto-boxing操作,这时会创建另外一个匿名对象ref2,它的value值为2,然后对i付值,这时i的值是ref24. 这时a的值还是ref1,而ref1的value还是1, 所以你就会感觉好像和一般的对象引用传递不一样.5. 结论就是: a. Integer和String一样是不可变对象(Immutable) b. Auto-boxing的操作在赋值时是创建一个新的Integer类,而不是修改被赋值Integer对象的value值 java 数组小问题 java连接数据库问题 icu的简单程序例子 跟applet相关 在applet中怎么把一个图像文件嵌入图像图标 然后把图像图标置于标签label中 怎样判断JTree的一个结点是它的叶结点? 求助JAVA连接oracle数据库ClassNotFoundException的问题 如何获取树节点的值??? 请教如何求俩日期相差的天数? ResultSet求总行数 高手请进 Vector的同步问题 关于list中bean复制问题(急)
Double:引用类型
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
Double是对象而double不是,内存的分配位置也不一样double是一种基本数据类型,而Double是相应于double的类类型,称为对象包装。
实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;
另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。
java只有值传递,
如果参数是引用类型,那么传递的值就是这个引用。
把代码发出来,大家看看。
double是值传递,但是Double是对象,对象都是引用传递。
Double对象本身没有相应的加、减、乘、除的方法。
那么对它的修改实际上应该是通过拆装箱转化成基本数据类型,进行加、减、乘、除后,又通过自动拆装箱转化成Double对象。
在转化成Double对象时,应该已经不是以前的对象了吧!个人猜测,有误请高手指正。
Doulbe
用的时候把他们看成一样就可以了.
不要被一些细微的区别搞混了.
对象都是引用传递,基本数据类型是值传递,个人认为,前者很容易引起误解: 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
你总结的不对!
虽然Double和double表现出来的结果看似一样,但其机理是完全不一样的。
你之所以有这样错误的理解,是因为Double没有提供任何修改其内容的方法,而StringBuffer的append就可以改变内容。
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值