public class StringTest{
    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="Changed"; ch[0]='C';
    }
}
最后的结果是:
World and Cello

解决方案 »

  1.   

    你是不是想让输出Changed and Cello这是不可能实现的~~~~这个例子就间接证明了Java只有传值调用~~~change方法里面str参数,在最初调用的时候和域str指向同一对象,但是在方法里面新建了一个字符串changed对象,让change方法的str指向了它~~~所以两个引用指向两个不同的对象~~自然不会相互影响了~~~
      

  2.   

    你new出一个String类型时,这时候内存空间里面有两个对象,str指向“World”,当用change方法是只是重新在new一块空间来存放“Changed”,肯定还是输出原来的“World”呀;而char类型只有一个对象。
      

  3.   

    楼主google下这个:理解Java赋值和参数传递机制
      

  4.   

    java当中只有值传递,String作为参数是只是把当中的值传递过来,并不是引用地址。
      

  5.   

    str="Changed"; //这是内部变量更换引用
    ch[0]='C';//这是与外部引用共同引用的数组对象的第一个元素被改变
      

  6.   

    其实不是什么值传递,引用传递的问题。主要是因为String是常数。
    这句话来自JDK的文档:字符串是常量;它们的值在创建之后不能改变。
      

  7.   

    刚开始传递参数时候:实参str和形参str都指向“World”。
    之后在函数内部:形参str试图改变其指向的"World"->"Changed"
    但不幸的是:由于String是常量不可以改变,所以就在内存中new 了一个“Changed"并把形参str指向了他
    可惜此时实参并没有变
      

  8.   

    所谓的改变String,例如String a = "abc";a+="cd";其实都是new了一个String,并把原理的对象
    丢弃了,等着GC过来回收的
      

  9.   

    String  传过去的是值  char [] 数组的话是地址,地址的指向变了, 所以 String 没变 ,而 char [] 会变,自然是
    World and Cello
      

  10.   

    只是参数传递而已,真实的变量不会变
    所以为什么我们经常要this.XXX=XXX,就是为了让我们方法里传进来的参数和真正我们要改变的变量关联起来
      

  11.   

    完全不是楼上那些说的情况。 java对于string有特殊处理。每个string 发生变更时是会产生新对象,而不是变更原对象。所以str重复赋值时, 等于修改了函数对象内的指针。对于函数对象外没影响。 
    java也只对string有这样的处理。所以不要把string当一般对象看。 
      

  12.   

    http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html这个网址讲解的非常详细,从内存分析的,浅显易懂
      

  13.   

    String Class is immutable
      

  14.   

    在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
       所以change函数的两个参数str 和 ch (形参)是和定义的变量(实参)的内存地址是一样的,或许你会认为在change函数里面改变str 和 ch后,原来的变量也会改变,所以你期望的结果是:Changed and Cello。   但是事实确实这样的:String对象没有被改变,ch[0]却被改变了,输出结果是:World and Cello。这个你应该会很快想到两种参数是否有差别?  原因就在于String类型是final的,一旦声明就无法被改变,所以当函数想改变形参str的时候,就为形参str用new重新分配了一个内存空间,此时形参str和实参str指向不同的内存空间,形参str改变了,但是实参依旧原地不动。ch[0]为什么不改变?原因就在于它是允许改变的,实参和形参依旧指向同一块内存。  所以根本原因就在于String是final的,一旦声明就不允许改变,而所谓的改变,其实是新new了一个String了的。   你也可以自己试试,用StringBuffer来替代String试试,结果应该是 Changed and Cello,StringBuffer和String的区别你应该会明白的
      

  15.   

    不管程序运行结果如何,String的用法不好,性能低