一个小问题!!!
一个员工类Employee
一个加薪函数:raisesalary()
public static void tripleSalary(Employee x)
{
x.raiseSalary(200);
}
harry=new Employ(...);
tripleSalary()harry;
他的工作过程是怎样的?为什么x会改变harry的值.我现在对java的引用调用糊涂了,谁能给我讲讲!救命啊!!
问题点数:20、回复次数:5Top
1 楼steedhorse(晨星)回复于 2004-09-03 20:08:15 得分 10
为什么不会改变?在Java中,对象名只是个引用,靠他来引用到内存中实际的对象,而且传进函数时,也不会对他所引用的对象进行拷贝,换句话说。直接传进去的只是个引用,函数内部依旧靠这个引用去存取那个实际的对象,这样,如果函数通过这个引用改动了这个引用所引用到的保存在内存里的那个实际的对象(可以看作是一组数据),那当然就是改了,还能怎么样?
以上讨论进适用于非内建类型。Top
2 楼ggggosling(爪哇娃)回复于 2004-09-03 20:17:10 得分 0
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????Top
3 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2004-09-03 20:19:27 得分 10
当你写下面代码: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所分配的那四个字节被弹出栈Top
4 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2004-09-03 20:31:09 得分 0
^_^,希望你看了我上面的答复可以理解这是为什么!
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这三个局部的变量变来变去,影响不到外面的Top
5 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2004-09-03 20:33:53 得分 0
记住,java统统都是值传递,全是栈中的数据值传递,所以原始类型int,float等,本来就在栈中分配的,当然明显时值传递了,但是对象也是值传值,是其引用(理解为地址的值更好理解)的值传递Top




