一个小问题!!! 为什么不会改变?在Java中,对象名只是个引用,靠他来引用到内存中实际的对象,而且传进函数时,也不会对他所引用的对象进行拷贝,换句话说。直接传进去的只是个引用,函数内部依旧靠这个引用去存取那个实际的对象,这样,如果函数通过这个引用改动了这个引用所引用到的保存在内存里的那个实际的对象(可以看作是一组数据),那当然就是改了,还能怎么样?以上讨论进适用于非内建类型。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static void swap(Employee a,Employee b){ Employee temp; temp=a; a=b; b=temp; }class Myclass{ public static void main(String[] args){ Employee x=new Employee(...); Employee y=new Employee(...); swap(x,y);}}为什么不可以交换x,y???? 当你写下面代码:Employee e=new Employee(),那么jvm在堆中开辟了一个空间,里面存了这个Employee实例的属性数据(没有方法数据哦,方法是类所共有的数据),然后在栈中分配4个字节(是不是四个字节,我想应该是的,不会和机子的位数有关吧),在这个四个字节中存储的是刚刚为Employee对象实例分配空间的地址,如0xffffff什么的,当你使用某个方法时,如你上面的代码,他的参数是Employee类型的,好,那么再在栈中分配四个字节的数据,把刚刚那四个字节里面的数据考过来,所以现在新的这四个字节里面的数据也是0xffffff,所以他们两个指向的是同一个对象,是吧.所以当你使用代码x.raiseSalary(200);时,意思是说将内存0xffffff里面的对象执行这个方法,所以你实际上改变的时堆里面数据,而这两个四个字节里面的值一样,所以在方法里面的操作当然能被外面的对象捕获了.这里还有一个注意的地方就是,假如我在方法里面这么写代码:public void ff(Employee x){ x=new Employee(); x.doSome();}呢,注意,当你写代码x=new Employee();时,又在堆里面生成了一个数据,将这个数据的地址赋到x所代表的那四个字节里面,所以现在方法体里面的这个x四个字节里面的数据就和外面的那个不同的,所以现在你对x所作的操作就不能反映到方法外面了.还有就是当你退出这个x的作用域时,给x所分配的那四个字节被弹出栈 ^_^,希望你看了我上面的答复可以理解这是为什么! Employee temp; 1 temp=a; 2 a=b; 3 b=temp; 41句,你开辟了四个字节的数据可以用来存储Employee的地址2:你将a这四个字节里面的数据付给了temp这四个字节3:你又将b这里面的四个字节数据考到了a这四个字节里面4:同样的但是请记住,当你进入方法是,你现在的a这四个字节在栈中地址不是你方法体外面的那个,他是当你进入方法时从新从栈中分配的,只是和方法外面的那个四个字节里面的数据一样而已,所以你在方法体里面都只是对tmp,a,b这三个局部的变量变来变去,影响不到外面的 记住,java统统都是值传递,全是栈中的数据值传递,所以原始类型int,float等,本来就在栈中分配的,当然明显时值传递了,但是对象也是值传值,是其引用(理解为地址的值更好理解)的值传递 一个关于进程资源的问题,求大牛指导思路 java socket email 问题 不了解类里面方法的作用,望前辈们讲一下! 请教两道问题? 求救..java虚拟机的问题.. java JS跳转 关于线程!如何将定时器放在线程中 那位大虾可以告知小弟,怎样实现把从数据库中得到的纪录用Excel打印出来,十分着急,还请多多帮忙。 寻visibroker for java 4.51 的注册码? 哪里有JDK下载,给分! 接口和抽象有什么区别? 请教:打印一个对象的时候,系统都在做什么呢?
{
Employee temp;
temp=a;
a=b;
b=temp;
}
class Myclass
{
public static void main(String[] args)
{
Employee x=new Employee(...);
Employee y=new Employee(...);
swap(x,y);
}
}
为什么不可以交换x,y????
这里还有一个注意的地方就是,假如我在方法里面这么写代码:
public void ff(Employee x){
x=new Employee();
x.doSome();
}
呢,注意,当你写代码x=new Employee();时,又在堆里面生成了一个数据,将这个数据的地址赋到x所代表的那四个字节里面,所以现在方法体里面的这个x四个字节里面的数据就和外面的那个不同的,所以现在你对x所作的操作就不能反映到方法外面了.还有就是当你退出这个x的作用域时,给x所分配的那四个字节被弹出栈
Employee temp; 1
temp=a; 2
a=b; 3
b=temp; 4
1句,你开辟了四个字节的数据可以用来存储Employee的地址
2:你将a这四个字节里面的数据付给了temp这四个字节
3:你又将b这里面的四个字节数据考到了a这四个字节里面
4:同样的
但是请记住,当你进入方法是,你现在的a这四个字节在栈中地址不是你方法体外面的那个,他是当你进入方法时从新从栈中分配的,只是和方法外面的那个四个字节里面的数据一样而已,所以你在方法体里面都只是对tmp,a,b这三个局部的变量变来变去,影响不到外面的