黑马程序员技术交流社区

标题: 为什么会出现打印出 1与2的结果? [打印本页]

作者: 邹学良    时间: 2013-3-11 10:35
标题: 为什么会出现打印出 1与2的结果?
  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. }
复制代码
求大神解惑
作者: 高梦晓    时间: 2013-3-11 10:45
第一个update(int  a) 是值传递,本身的值是不变的
第二个update(koo a)是引用传递,本身的值是随之改变的
作者: scott0610    时间: 2013-3-11 10:46
本帖最后由 袁见 于 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了。

希望对你有所帮助。一起加油哦
作者: 张文星    时间: 2013-3-11 11:03
java传值的方式有两种,基本类型数据(byte,boolean,short,int,long,float,double,char)在传值时传过去的是本身的拷贝,也就是说,改变拷贝中的数据不会改变原来的数据,而对象在传值时传过去的是引用,也可以说是在内存中的地址,所以改变参数变量的实体也会造成原本的改变。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2