首先更正楼上的答案,String s = "ASD";和String s = new String("ASD");的效果是一样的。这两种方式的区别就是在对内存中开辟地址,和字符串池中取值。一个是编译时,一个是运行时。但是其效果都是一样的,因为看看String类的源码就晓得了,String 类是一个final类。并且内部实现其实是个char[]数组所以方法传递的其实只是s的一个副本,方法修改的也只是副本的值而已。我把你的代码改了改,你再看看结果 发现数组也没有改变。这就说明了一个问题,这个方法传递的其实也是数组的一个副本,但是它们指向了同一个地址。所以方法修改的只是把副本的指向改变了,并没有真正改变数组的值。String内部也是一个char[]数组.所以也可以得出同样的结论。
public class TestProblem1 {
public static void main(String[] args) {
int[] a={2,5,3,9,8,1,6};
int k = 10;
String s = "as";
TestProblem1 t1 = new TestProblem1();
t1.print(a, k, s);
t1.selectionSort(a, k, s);
t1.print(a, k, s);
}
public void selectionSort(int[] b,int k,String s){
b = new int[] {1,2,3,4,5,6};
k = 10;
s = "assssssssss";
}
public void print(int[] a,int k,String s){
for(int i=0;i<a.length;i++){
System.out.print(a[i]);
}
System.out.println();
System.out.println(k);
System.out.println(s);
}
}
我先扔出我的结论:
基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。
对象和引用型变量被当作参数传递给方法时,是引用传递。在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。 |