public class Test
 { 
      public static void main(String[] args) 
           { 
             String str = new String("World"); 
             char ch[] = {'H','e','l','l','o'};
             change(str,ch);
             System.out.print(str+"and");
             System.out.println(ch);
                 
           } 
           
      public static void change(String str,char ch[])
      {
          str = "Change";
          ch[0] = 'C';
      }
           
 } 
不是说java全都是值传递的 然后传递的都是副本么 那么按说程序结果因该是
world and hello阿
怎么变成了
woeld and cello了
请牛人解答

解决方案 »

  1.   

    String和基本类型都是值传递,数组和对象都是引用传递,所以你上面的ch[0]才会变为'C'
      

  2.   

    我就觉得java只有值传递是错误的
      

  3.   

    String的传递应该还是引用
    只是str = "Change"让str形参引用指向了"Change"
    而不是让main中的str指向Change(这里可以将str形参看成C++的指针,
    在change()中改变的是str的指向,而不是改变其值,事实上任何改变
    字符串的操作jvm都会创造一个新的字符串,而不是真的在原串上修改)
    str = "Change";语句首先是到内存中查找是否存在"Change"字符串
    没有就str = new String("Change");这样就改变了str的指向,它不
    在引用main()传来的str实参
      

  4.   

    java数组才不和C相同
    首先C中数组必须再编译时确定大小
    而java可以动态分配,还有c\c++不允许返回数组
    java可以,这说明java的数组也是引用类型的java传值是错误的,这也不能这么说
    java可以用内部类的某些机制实现c\c++的一些功能
    只是更安全,当然,我们还是承认,不能传地址确实
    有时候不方便
      

  5.   

    str ch 都是传值的  只不过它们里面存的是地址  所以传的是它们本身的值你在change()改变了str的引用  也就是它本身的值  当然就不会传出去,而ch 是改变了它所指向的内容 当然就会在外面也改变了
      

  6.   

    你要是在change()里面这么写也不会改变它的值的ch = new char[]{'c','e','l','l','o'};
      

  7.   

    如果str ch存的是地址,那不就是传地址啊?传值存在拷贝
    如果是传递一个超长字符串
    jvm会去拷贝不啊?
      

  8.   

    传的是引用的拷贝, str = "Change";和ch[0] = 'C';是不同的,这里的str和main里的str是不一样的,但都指向同一个字符串(World),现在str = "Change";它指向了"Change",但是main里的还是指向"World",这里的ch和main里的ch也同时指向{'c','e','l','l','o'};
    不过ch[0]='C',你改变了原来的数组内容,所以影响到main里的ch,如果变成这样
    ch = new char[]{'c','e','l','l','o'};ch就指向了{'c','e','l','l','o'};,不会改变原来的数组
      

  9.   

    除了基本类型 都是引用传递
    这个里面还涉及到对象不可变的问题
    Sting就是个不可变的
    这种问题多看看书 就知道了 还跑这来问啥
      

  10.   

    所有的函数调用本质上都是值传递,也就是说函数的形参的值只是实参的一个副本, 关键在于形参和实参是什么类型的(是基本类型还是对象句柄,因为如果形参是对象句柄,那么所传递的这个副本就是对象句柄的副本,而不是对象句柄所指向的对象的副本)对于数组,函数里 ch[0]='C',这句话的含义是将ch所指向的内存中,偏移是0的内容存成'C',也就是说ch所指的对象的内容被改变了,但ch并没有变
    System.out.println(ch);这句的意思是把ch所指向的对象的值输出到控制台,不是把ch的值输出到控制台
      

  11.   

    楼主,输出应该是 world ,怎么可能输出 woeld 呢?
      

  12.   

    str = "Change"  其实就是在内存里面new 了一个新的string对象 str=new String("change")而本来的str里面的值并没有改变,而ch[0] = 'C'改变了数组第一个元素的值
      

  13.   

    JAVA是传值,不过有时候(对象)这个值是指针