public class Test{

public static void main(String args[]){
String ac = new String("abc") ;
p(ac);
System.out.println(ac);

int[] o = new int[]{1,2,3};
pp(o);
for(int av=0 ;av<o.length;av++)
System.out.println(o[av]);
}
static void p(String t){
t="vvvvvv";
}

static void pp(int[] j){
j[0]++;
j[1]++;
j[2]++;
}
} String不是基本类型,我用一个方法改变了他的值,为什么不能保存下来?而int[]也不是基本类型,但用一个方法就可以改变它的内容呢?
不是说非基本类型传递的是对象的句柄吗?

解决方案 »

  1.   

    这里应该是这样的
    p方法接受的String变量的一个引用
    并没有改变在接受的变量象很多方法都是这样的
    现在方法外定义一个变量
    然后再在方法内来一个 this.ac = t;我初学不久,说错的请包涵.
      

  2.   

    传递的是值,在java中参数传递是值拷贝。
    可以这么理解:
     当程序执行到函数pp中时,存在两个引用 ac和 t,其中t是ac的一个拷贝,所以t和ac都指向同一个string对象,当执行语句t=“ttttttt”之后,引用t指向的新的string对象,但是并没有改变ac的指向。 在p函数中,情况类似,但是操作j[i]改变的是数组容器的内容,不是j引用指向的对象。
      

  3.   

    String是不可变的
    你 t=""
    根本没有改变传过来的String
    如果有
    t.setText("")就可以改变 
    但是没有
      

  4.   

    不是说非基本类型传递的是对象的句柄吗?
    ----------------------------------------------------------
    传递的确实是对象的句柄啊,准确的说传递的是句柄的COPY.
    1.但该COPY同样指向该对象,所以你改变了该对象的值,原来句柄指向的对象就发生变化,你这时再打印原来的对象,它已经变化了,就如同你的数组一样.
    2.然而,在String的例子中你实际上是改变了COPY的句柄的指向,让它指向了其他的对象,原来句柄的指向没有发生改变,所以打印原对象值也就没有改变.
      

  5.   

    String的话,传进去的String的对象的copy,修改的只是copy。
    int[]的话,传进去的是int[]引用的copy,这个copy和原来的引用都是指向同一个对象,
    修改了也都是修改同一个对象。所以会改变。
      

  6.   

    考虑下这个方法
    public class Test{public static void main(String args[]){
    String ac = new String("abc") ;
    ac=p(ac);
    System.out.println(ac);int[] o = new int[]{1,2,3};
    pp(o);
    for(int av=0 ;av<o.length;av++)
    System.out.println(o[av]);
    }
    static String p(String t){
    t="vvvvvv";
    return t;
    }static void pp(int[] j){
    j[0]++;
    j[1]++;
    j[2]++;
    }
    }
      

  7.   

    或者是:
    public class Test{
    static String ac = new String("abc") ;
    public static void main(String args[]){p();
    System.out.println(ac);int[] o = new int[]{1,2,3};
    pp(o);
    for(int av=0 ;av<o.length;av++)
    System.out.println(o[av]);
    }
    static  void p(){
    ac="vvvvvv";
    }static void pp(int[] j){
    j[0]++;
    j[1]++;
    j[2]++;
    }
    }
    反正感觉String 对象有点不同于其他对象如数组(按引用调用);
      

  8.   

    void change(Date date) {
     date = new Date(102938392);
    }void change(String str) {
     str = "abcdefg";
    } public static void main(String[] args) {
     Date date = new Date();
     change(date);
     String str = "aaaaaa";
     change(str);
    }上面两个change方法本质上是一样的, 都是让引用指向一个新的对象, 当退出方法后, 原来的main方法里面的date和str引用依然指向原来的对象所以String和其它对象并没有什么区别, 要说区别, 那就是String是不可变类...这里的关键不是String的特殊性, 而是引用和对象的区别. 在方法里, 你可以改变传递进来的参数所指向的对象, 但你不可以使引用在退出方法后还指向另一个新的对象...