public class Example {
          String str = new String("good"); 
          char[] ch = {'a','b','c'}; 
          public static void main(String[] args) {
                Example ex=new Example();
                ex.change(ex.str,ex.ch);
                System.out.print(ex.str+" and ");
                System.out.println(ex.ch);
          }
  public void change(String str,char ch[]){
                str="test ok";
                ch[0]='g';
          }
    }输出结果为什么会是good and gbc

解决方案 »

  1.   


    public class Example { String str = new String("good");
    char[] ch = { 'a', 'b', 'c' };
    public void change(String str, char ch[]) {
    str = "test ok";
    ch[0] = 'g';
    } public static void main(String[] args) {
    Example ex = new Example();
    ex.change(ex.str, ex.ch);
    System.out.print(ex.str + " and ");
    System.out.println(ex.ch);
    }
    }
    上面是你的代码,再看一下我改完之后的代码:public void change(String str, char ch[]) {
    this.str = "test ok";
    ch[0] = 'g';
    }
    这样才能把 ex的str的值改变。这里为什么你的change方法 能改变 ex的 ch  而不能改变 str,你可以参考一下 这个帖子:http://topic.csdn.net/u/20100716/15/db8ffab6-cc0c-4f04-89c5-a2e49d7ece44.html  ,  我当时也有和lz有类似的困惑。
      

  2.   

       楼主change方法里的String str,并不是上面定义的类变量str;而是一个重新定义的局部变量,它们两者在不同的内存中;要改变原有类变量的值,在其它方法中要加上this;在这里this可以理解为本类的!固楼上更改是正确的...
      

  3.   

    java里都是值传递
    故方法里更改的只是参数的副本,这个是不影响参数本身的值的
    当参数是数组的时候,其实传进来的是那个数组在内存中的地址的值的副本
    相当是两个引用的值相同,指向同一个内存空间,那样是可以通过这个地址去修改内存中的值的
      

  4.   

    不是1楼回答的那样,这就是Java中的参数传递,等有时间了给你详细说说!现在上班呢?
      

  5.   

    引用值传递是指向对象的信息。这样虽然可以共享资源,但是如果你替换了对象就不能共享资源了.例如你注册了一个网站,并有了相应的url.你将这个url告诉了你的朋友,那么以后你只需将信息发布到网站上,而你的朋友可以通过url找到你的网站从而看到你的新的信息。这就是引用值传递。其中的url就是引用值信息.但是如果你的网站的url变了,那么你的好友就看不到你的信息了.这就需要引用传递了,即将所有的原来的url重新定向到最新的url中
      

  6.   

    public void print(char[] s)打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。 参数:
    s - 要打印的字符数组 
    抛出: 
    NullPointerException - 如果 s 为 null以上是api的参考文档.多查api
      

  7.   


    public void change(String str, char ch[]) {
            str = "test ok";
            ch[0] = 'g';
        }值传递传递的是值的拷贝,所以传过去的值被改变也不会改变原来的值。该例中的“str”就是一个值的拷贝。public void change(String str, char ch[]) {
            this.str = "test ok";
            ch[0] = 'g';
        }
    这里的"Str"加了this之后表示的是全局变量.
      

  8.   

    个人认为因为String是final属性,所以它的值是不可变的,如果改成StringBuffer的话就没问题了
      

  9.   

    楼主代码的问题在于全局变量与局部变量同名了,在两种变量同名的情况下,局部变量在它的领域中式拥有优先权的,所以str = "test ok";其实是赋值给了局部变量另文JAVA中的参数传递都是值传递所以两个str的地址是不同的所以就造成了这样的输出
      

  10.   

    String是immutable object, array是mutable object
      

  11.   

    Sorry上面说的不完全,又在网上研究了一下,java是pass by value,但是对于object他是pass reference by value.就是说对于object,他传进的实际上是原对象的地址的值。所以对于mutable object你可以更改object内部的值,但是不能更改原对象的地址的值,因为这个对象的reference是pass by value而已。
      

  12.   

    第一个str已经是一个常量了,后面传递给函数不可能改变一个常量的值了,所以只能是原来的值了
      

  13.   

    String类的对象是不可以改变的 要想改变字符串的值就得用StringBuffer类 
    String对象是保存在内存中的 StringBuffer是在缓存中
    至于String的值不可变忘了 好像有点复杂 暂时先死记住就行了 等自己的修炼的差不多了也就自然明白了