前言:这是第二次发帖征集高手了, 第一个帖子被回的乱七八糟的。 
执行顺序:3--->4--->7--->8--->9--->10--->11--->12
结果顺序: 见各步的注释
关注要点:[7步, 9步 ~ 11步]; [8步, 10步 ~ 12步]//////////////////////////////////////////////////////////////////////////////////////////////////////////public class Example

String man=new String("American");     //1,人是美国人
char[] fly={'F','2','2'};              //2,机是F22

public static void main(String[] args)

Example ex=new Example();          //3, 构造实例 man=American , fly=F22

ex.change(ex.man,ex.fly);          //4, 用实例调用成员方法
System.out.print(ex.man+" and ");  //11,跳出change后, man=American
System.out.print(ex.fly);          //12,跳出change后, fly=J10


public void change(String man,char fly[])

man="Chinese"; //7,人是中国人 man=Chinese
fly[0]='J';    //8,机是J10    fly=J10
fly[1]='1';
fly[2]='0';
System.out.print(man+" and ");  //9, 输出 Chinese and
System.out.println(fly);        //10,输出 J10
       

} 请问:为什么会是American and J10
而不是:American and F22
而不是:Chinese and J10

解决方案 »

  1.   

    主要看调用change是发生了什么。
    对于局部变量man,在栈生成一个临时String类型的对象man,赋值时并指向了
    成员变量的ex.man,然后将局部变量man又指向了“Chinese”对象。ex.man并没有改变。changge结束,局部变量销毁。对于数组,他是将首地址地址赋予了那个临时变量的数组首地址,这样方法中的数组变化实际就是原数组的变化。希望说明白了。所以结果是,
    Chinese and J10
    American and J10 //成员变量man没有变,数组变化了。
      

  2.   

    成员man地址 =》 对象"American"
    成员fly地址 =》 字符数组首地址参数man地址 =》 对象"American"
    参数fly地址 =》 字符数组首地址对参数man赋值,更改参数man地址:
    参数man地址 =》 对象"Chinese"
    成员man地址不变更改参数fly,即更改字符数组,即更改字符数组地址里的值,地址存的数据变为{'J','1','0'}
    而成员及参数fly地址都没变输出目标:
    成员man地址 =》 对象"American"
    成员fly地址 =》 字符数组首地址///////////////////////////////
    类似情况:
    Object o;
    initObj(o);void initObj(Object o){
      o = new Object();
    }
      

  3.   


    弄了半天, 你还是想说 change()参数中的man是ex.man的复制; 而参数中的fly[]数组,与ex.fly是同一个东西[也就是你所说的共用首地址] !!!
    然后就是, 在跳出change()的时候, change()内的man销毁, 而fly数组则与ex.fly相同,故其所做的操作也被完整地保存下来了。你是不是这个意思 ???
      

  4.   

    change 中 操作的是 man 的引用, fly 的对象
    当你将ex.man 和 ex.fly传入change时传入的是指向这两个对象的引用的拷贝
    man="Chinese";是对引用的操作,相当于man = new String("Chinese");
    他创建了一个新的String对象并将man指向他
    fly[0]='J';
    fly[1]='1';
    fly[2]='0';
    是直接对数组对象的操作,如果你在这三行之前加上一行
    fly= new char[3];
    会发现输出结果会变成美国 f22
    因为如果这时fly指向另一个新数组对象而不是ex中那个fly所指向的对象对于引用的操作只能生存在方法中,因为出了方法他们的生命周期就结束了 
      

  5.   

    都不要瞎扯了, 你们:
    http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
      

  6.   

    很简单,String类型的变量一旦赋值就改不了了