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

解决方案 »

  1.   

    很正常啊。这就是新手经常犯的错
    public void change(String str,char[] ch1){
    str="text ok";
    ch1[0]='g';
    }
    这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有变。
    你改成这样就可以了。
    public void change(String str,char[] ch1){
    this.str="text ok";
    this.ch1[0]='g';
    }
      

  2.   

    我主要不明白的是,为什么ex.ch的值变了?
      

  3.   


    我主要不明白的是,为什么ex.ch的值变了? 
      

  4.   

    以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如:
    public static void main(String[] args) throws IOException {
      char[]test = {'a','b','c'};
      exchange(test);
      System.out.println(test);
    }
    private static void exchange(char[] test){
    test = null;
    }
    如果它直接修改自己本身,对源对象不会有丝毫影响,但是他内部的属性修改是可以直接影响到的,比如A和B都指向地址C,A修改自己本身其实修改了自己指向的地址,可是他们共同指向C的属性是可以相互影响的,这就牵扯到深拷贝和浅拷贝了。
      

  5.   

    ch1[0]='g'; 这个就是将'g'赋值给ch1[0],ch1[0]是char[] ch={'a','b','c'}数组里面的第一个'a',这样'g'把'a'覆盖了,ch[] ch 就变成{'g','b','c'}了,有什么不明白的
      

  6.   

    哦,明白了。
    ex.ch变了就好比A和B都指向C,然后A改变了C的具体值,所以导致B的具体值也发生了变化。
    而 ch1=null 就好比把A指向另外一个地址,所以不影响B的值。
    是这么理解的么?
      

  7.   

    str是传值,chr[]是引用,str虽然在方法中改变但不能返回给实参,方法结束后等待销毁,而chr[]是引用传值,方法中的操作就是对实参的操作!
      

  8.   

    是的,java和c语言里面的指针相似,都是传值,基本类型直接传递值本身,非基本类型传递对象的地址值,String是非基本类型,为final类,不可以修改,你通过a = "123"相当于直接修改其地址,并非它所具有的的属性,对源对象不产生影响;而其他的非基本类型比如StringBuffer,其通过append等方法修改内部属性value,当然会影响源对象,其都是浅拷贝,只是拷贝了对象本身的地址,并未对对象的属性进行深层次拷贝。
    你可以在编辑框上面一排看看,可以调整格式,各种语言的格式都可以设置