结果:5--8 9--6
为什么自定义类的成员变量可以改变,Integer类的却不行呢?搞不懂啊,求解 作者: Kristy_Li 时间: 2012-6-8 22:31
Integer a = 5, b = 8;是通过自动装箱的,在-128到127之间的数值,是不会通过new在堆内存中为对象分配空间,而是:
public static Integer valueOf(inti){
finalintoffset=128;if(i>=-128&&i<=127){//must cache
return Integer Cache.cache[i+offset];}
return new Integer(i);}
而你在交换函数中又通过new来分配,在交换函数内部你可以看到确实交换了数值,但不会传递给外部的a,b.而你自己定义的都是通过new 来分配的,交换之后的值传递到了外部。
作者: 何旭栋 时间: 2012-6-8 22:36
Kristy_Li 发表于 2012-6-8 22:31
Integer a = 5, b = 8;是通过自动装箱的,在-128到127之间的数值,是不会通过new在堆内存中为对象分配空间 ...
a和b的值改128、129结果还是没有交换啊作者: 赵兵锋 时间: 2012-6-8 22:38
因为对于你的自定义类来说,成员变量是基本数据类型,赋值就会被改变。
但对于Integer来说
public static void swap(Integer a, Integer b)//这里引用a指向内存中一块地址,里面装着值5,b指向内存中一块地址,里面装着值5
{
int temp = a.intValue();//temp赋值为5
a = new Integer(b.intValue());//引用a被指向新位置,里面装着值8
b = new Integer(temp);//引用b被指向新位置,里面装着5.
}//注意,此方法里的a和b都是局部变量,在方法体内部被指向新位置了,出了这个方法,a和b就无法访问了,会被垃圾回收器收拾掉。
System.out.println(a.intValue()+"--"+b.intValue());//这里的a和b指向的内存中的地址里的值从未被修改过,自然不会变。作者: Kristy_Li 时间: 2012-6-8 22:45
public static void swap(Integer a, Integer b)//这里只是把a、b的引用复制到这个函数内,
//方法外部的a,b还是指向原来的对象
{
int temp = a.intValue();
//这里是改变了a、b的指向,并没有对a、b原来的对象做任何操作。
a = new Integer(b.intValue());
b = new Integer(temp);
}//程序运行到这里,swap方法中的局部局部变量都会被释放掉
//所以,这段代码没有对main方法中的对象做任何操作。
public static void swap(myInt a, myInt b)
{
int temp = a.x;
//这里就不同了,这里直接操作的是a、b指向的对象,把对象中的内容改变了
//当然,这个方法运行完之后,a、b的指向还是原来的对象。
a.x = b.x;
b.x = temp;
}
复制代码
作者: 揭耀祖 时间: 2012-6-8 23:07
public static void swap(Integer a, Integer b)
{
int temp = a.intValue();
// a = new Integer(b.intValue());
a = b;
// b = new Integer(temp);
b = temp;
}
这个函数之所以不能交换值是因为Integer会自动装箱和拆箱成int类型的,而它是基本类型的对象,基本类型对象在进行函数参数传递时是以值传递的,也就是说在调用swap(Integer , Integer)这个函数时,实参a 和b 分别复制了一个值给函数swap(Integer , Integer)的形参,所以不管a 和b 的值在函数内部如何改变,都没有改变实参的值。
public static void swap(myInt a, myInt b)
{
int temp = a.x;
a.x = b.x;
b.x = temp;
}
这个函数能交换是因为它的参数是类类型的对象,而类类型的对象在进行参数传递时是以地址传递的,而myInt 是一个类类型的对象,调用swap(myInt a, myInt b)后,a 和b 指向的地址中的值已发生了改变,所以这个函数能交换实参的值。