A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹学良 中级黑马   /  2013-3-11 10:35  /  1261 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class demo1 {

  2. public static void main(String[] args) {
  3. int a = 1;
  4. update(a);
  5. System.out.println(a);
  6. Koo k= new Koo();
  7. update(k);
  8. System.out.println(k.a);
  9. }
  10. static void update(int a) {
  11. a++;
  12. }
  13. static void update(Koo ko){
  14. ko.a++;
  15. }
  16. }

  17. class Koo{
  18. int a = 1;
  19. }
复制代码
求大神解惑

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
第一个update(int  a) 是值传递,本身的值是不变的
第二个update(koo a)是引用传递,本身的值是随之改变的
回复 使用道具 举报
本帖最后由 袁见 于 2013-3-11 10:48 编辑

这是因为值传参的问题。
所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本事不会受到任何影响。【Java里的参数传递类似与《西游记》里的孙悟空,孙悟空复制了一个假孙悟空,这个假孙悟空具有和孙悟空同样的能力,可以降妖除魔。但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。呵呵这里打了一个简单的比方】。
main方法开始创建了一个Koo对象,并定义了一个k引用变量来指向Koo对象,这个与基本类型不同。创建对象时,系统内存中有两个实体:堆内存中保存了对象本身,栈内存中保存了该对象的引用。紧接着给k对象赋值。  接下来,main方法中开始调用update(Koo ko)方法,此时main方法并没有结束,系统会分别开辟出main和update两个栈区,分别用于保存mian方法和update方法的局部变量。调用update方法时,k变量作为实参,传入update方法,同样采取值传递方式,把main方法中的k变量的值赋给update方法里的ko形参,从而完成update方法的ko形参初始化。这里需要指出的是,main方法中的k是一个引用(也就是指针),它保存的是Koo对象的地址值,当k的值赋值给update方法中的ko形参后,update方法中的ko也是Koo对象的地址值,同样也是指向堆内存中Koo对象的地址。此时,不管是操作main方法中的k变量还是操作update方法中的ko变量,其实质都是操作它所引用的Koo对象,它们操作的是同一个对象。当update中将ko对象的变量a加1,那么mian方法中输出的Koo对象的属性同样也加1了。

希望对你有所帮助。一起加油哦
回复 使用道具 举报
java传值的方式有两种,基本类型数据(byte,boolean,short,int,long,float,double,char)在传值时传过去的是本身的拷贝,也就是说,改变拷贝中的数据不会改变原来的数据,而对象在传值时传过去的是引用,也可以说是在内存中的地址,所以改变参数变量的实体也会造成原本的改变。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马