1行  public class TempTest { 
2行  private void test1(A a){  
3行    a.age = 20; 
4行    System.out.println("test1方法中的age="+a.age); 
5行  }  
6行  public static void main(String[] args) { 
7行    TempTest t = new TempTest(); 
8行    A a = new A(); 
9行    a.age = 10; 
10行   t.test1(a); 
11行   System.out.println("main方法中的age="+a.age); 
12行 }  
13行 } 
14行 class A{ 
15行 public int age = 0; 
16行 } 
结果是2个打印都是20
问题是运行到第10行时,将t.test1的a传给test1方法中的a,由于是引用传递,所以2个同时指向同一个空间age=10,我已经明白到了这一步~!!
但为什么会main里面的age也变成了20了?难道又重新运行了第3行?(为什么不再运行第9行了?)
到底运行顺序是怎么样的? 务必回答我这个问题啊~!!!
麻烦各位大大赐教啊~!! 

解决方案 »

  1.   

    1.main方法中定义了A类型的变量a,指向内存中的一个地址temp,存放着一个A的实例
    2.当把a传给test1方法时,jvm复制了一个a的引用D传给test1方法,这个引用D也指向内存地址temp, 
    3.在你的test1方法中,a.age = 20;实际上是把地址temp中的A实例的内容改变了,而main中的变量a还是指向地址temp,所以两次都打印出20,
    4,如果在test1方法中用a = new A();a.age=20;那就把引用D的指向改了,不再指向地址temp了,而main中的变量a还是指向地址temp的,这时候就会打印10,20了 
      

  2.   

    但为什么会main里面的age也变成了20了?难道又重新运行了第3行?(为什么不再运行第9行了?) 第9行运行了,但接下来不是又调用了t.test1()方法了吗?还把a这个引用传给了test1方法,在方法中,又把a.age给改成了20.并打印出来,接下来test1运行完毕,main中打出来的a.age也应该是20.你可能认为在test1中对a.age的改变不会带回到main,这是不对的,应该是test1中对a这个引用的改变不会带回到main
      

  3.   

    因为你第十行又对a.age进行了一次赋值....
    要养成结贴的好习惯.
      

  4.   

    谁跟你说 Java 是按引用传递的?
      

  5.   

    第九行被第十行重新改变了地址
    a.age都是指向了同一个引用地址了也就是20
    你的逻辑有问题
      

  6.   

    t.test1(a); 
    这个里面的a和你问的问题没有任何关系.
    这里只是一个你要传的对象而已;
    你这个方法一调用就会把a.age的内存地址改变
      

  7.   

    这个问题很简单,你把int类型改成String类型再看看打印的结果就知道,java的值传递是什么意思了。基本数据类型只有值传递。
      

  8.   

    楼主阿,可以进我的博客,我有篇文章写这个题目的,希望对你有帮助,Java是值传递的,很多书上也写有引用传递,那只是作者本人的更好的理解方式而已。
    http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
      

  9.   

    楼主阿,可以进我的博客,我有篇文章写这个题目的,希望对你有帮助,Java是值传递的,很多书上也写有引用传递,那只是作者本人的更好的理解方式而已。
    http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
      

  10.   

    java 是按值传递的,你传进的是对象,对象的属性在方法里是可以改变的,所以打印的都是20
      

  11.   

    java中参数传递都是值传递,只不过你这里传的是对象不是基本类型,所以传递的值是指对象的引用,当你在test1里改变此引用所指向对象的属性时,main方法里的引用指向的同一个对象也改变了!