CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

一个小问题!!!

楼主ggggosling(爪哇娃)2004-09-03 19:59:48 在 Java / J2SE / 基础类 提问

一个员工类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

相关问题

  • 小小小小小问题!
  • 一个小小小小小小问题
  • 小小,小问题
  • 小小小小问题
  • 小小问题!
  • 小小问题?
  • 小小问题。
  • 小小问题!!!!
  • 小小API
  • 小小问题:)

关键词

  • 数据
  • 函数
  • 代码
  • 内存
  • 引用
  • employee
  • raisesalary
  • 对象
  • xffffff
  • 方法

得分解答快速导航

  • 帖主:ggggosling
  • steedhorse
  • shangqiao

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo