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);
String x = new String(ex.ch);
System.out.println(ex.str+"and"+x);
}
public void change(String str,char[] ch){
str = "test ok";
ch[0] = 'g';
}
}
输出结果是goodandgbcpublic class Example2{
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String[] args){
Example2 ex = new Example2();
ex.change(ex);
String x = new String(ex.ch);
System.out.println(ex.str+"and"+x);
}
public void change(Example2 ex){
ex.str = "test ok";
ex.ch[0] = 'g';
}
}
输出结果是test okandgbc
这两个程序的change方法都是传递的对象,为什么第一个的str不改变而第二个却变了呢

解决方案 »

  1.   

    String 类型是java中的一个类,而char类型是基本类型,对于类,java中是传引用的,而对于chat,int,float,double,boolean等基本类型,是传值,即把传过来的值拷贝了一份,然后在拷贝上做操作
      

  2.   

    基本类型是传值的,类对象类型是传引用的,但是String在java中是一个特殊的对象,它是传值的。对应于你的问题,Example1中由于String是传值的,所以你无法在方法内部改变其原有的值,你改变的是String的一个Copy的值。而Char[]是一个对象是传引用的,所以你可以直接改变它中的值。在Example2中由于你传的是对象exp,是引用,所以你可以直接改变其中的值.
      

  3.   

    Example中  str = "test ok";语句只是改变值但的调用是从地址调用的,
    从而失败;相反char[]可以 作为指针来用完成要求;
    Example2中 都用ex.str来调用显然能达到目的。
      

  4.   

    to ibiswang(神鸟) 
    public class Example3{
    String str;
    Example3(String s){
    str = s;
    }
    public static void main(String[] args){
     Example3 e1 = new Example3("good");
     Example3 e2 = new Example3("test ok");
     e1.swap(e1,e2);
     System.out.println(e1.str+"and"+e2.str);
    }
    public void swap(Example3 s1,Example3 s2){
    Example3 t;
    t = s1;
    s1 = s2;
    s2 = t;
    }
    }//结果输出goodandtest ok
    你的意思是除了String其他对象都按引用传递,可是我的swap参数是2个对象,却并没有改变。
      

  5.   

    基本同意freezh,补充一些:其实传的都是"值",这里对象的"值"就是一个实例,因为change方法中操作的变量都是它本身定义的参数变量,而不是类变量!所以,example1中,无论change方法怎么赋值,类变量的值都不会变化;但example2中,change方法传的参数是本类的一个实例,类的每个实例都指向相同的类变量(str,char[]),所以ex引用改变的是类变量的值。所以两个结果当然不同了
      

  6.   

    把Example1里的String str理解为指针,结果和实际结果相反啊
      

  7.   

    我上面说的有点问题,类的每个实例都有相同的且属于自己的类变量,这么说可能贴切一些
    另外,对luc_ne(Luc)的问题,可看一下:
     * Because String objects are immutable they can be shared. For example://这里
     * <p><blockquote><pre>
     *     String str = "abc";
     * </pre></blockquote><p>
     * is equivalent to://等同
     * <p><blockquote><pre>
     *     char data[] = {'a', 'b', 'c'};
     *     String str = new String(data);
     * </pre></blockquote><p>
      

  8.   

    谢谢大家
    to cs_winner(翼) 
    我第一个程序中的str不是类变量啊
      

  9.   

    对象作为参数应该也是按值传递的,传递的是它的地址,你可以改变该象的内容但不能改变这个对象.在example3中应该这样解释的. 
      

  10.   

    你的第一个change方法的参数设置成那样只是改变类中的属性,但是你在main中创建的对象已经被初始化了,建议你对面向对象的一些基本概念再好好理解
      

  11.   

    你可以简单的理解为String类型在传递的时候是按值传递的,而不是按引用,记住这点我想就够了
      

  12.   

    在java中,传递参数都是按值传递的,即使传的是对象,也是传的对象的副本,而不是引用
      

  13.   

    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);
    String x = new String(ex.ch);
    System.out.println(ex.str+"and"+x);
    }
    public void change(String str,char[] ch){
    str = "test ok";.................这个str用的是你带的参数str,当然不会影响到外面的str
    ch[0] = 'g';
    }
    }
      

  14.   

    前几天,我们刚做过这样的题,当时我就做错了,象前面几位所说的一样,String是一个特殊的类,一旦被初始化后,它的值在内存中就始终存在,传值只是传递他的一个副本而已,而数组是用地址传递,所以相应的就改变它的值,我是这么理解的,我说的有不对的地方,别被我误道就好,呵呵~~~~
      

  15.   

    www.source520.com     免费免注册80G源码书籍下载
      

  16.   

    to luc_ne(Luc):这个真是抱歉了,它是我的叫法,应该称之为类的属性.
    对于String这个类,它很特殊;他的对象既可以用NEW的方法得到,也可以
    象数据类型那样通过'='赋值得到,身兼两家之长
    要想刨根的话,那只能去看java.lang.String的源代码(结合注释部分一些使用说明)