这个大家自己想一下然后再试运行一下,没准结果会令你大吃一惊。
public static void main(String[] args) {
final String s="aaa";
final String t="bbb";
copyString(s,t);
System.out.println("s:"+s);
System.out.println("t:"+t);
final char[] sc=s.toCharArray();
final char[] tc=t.toCharArray();
copyChar(sc,tc);
System.out.println("s1:"+s);
System.out.println("t1:"+t);
}
private static void copyString(String s,String t){
t=s;
}
private static void copyChar(char[] sc, char[] tc){
for(int i=0;i<sc.length;i++)
tc[i]=sc[i];
}
答案是s:aaa
t:bbb
s1:aaa
t1:bbb
这就意味这两个方法都没起到应有的作用;第一个copyString(String s,String t)方法没变的原因是因为String为final对象,t=s实际是将复制的s对象交给t,等于将新new出的对象交给t引用,对于传入对象没有任何修改;第二个copyChar(char[] sc, char[] tc)方法实际上改变的是char[] tc对象,而没有改变s对象。
下面说一下参数传递
还是有些人问java到底什么情况是值传递什么情况是引用传递,这个问题本身就是
错误的,java本身只有值传递,无论是基本类型还是对象。从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JAVA中,你只能通过在形参上调用方法来修改实参所引用的那个对象,却修改不了实参本身(不能使它引用到另个对象);
基本类型复制值:
int a=10;
int b=12;
copyInt(a,b);
System.out.println("a:"+a);
System.out.println("b:"+b);
private static void copyInt(int s,int t){
t=s;
}
输出仍是a:10 b:12
对象类型复制引用:
char[] sc=s.toCharArray();
char[] tc=t.toCharArray();
copyChar(sc,tc);
for(char s1:sc){
System.out.println("s1:"+s1);
}
for(char t1:tc){
System.out.println("t1:"+t1);
}
private static void copyChar(final char[] sc, char[] tc){
for(int i=0;i<sc.length;i++)
tc[i]=sc[i];
}
输出
s1:a
s1:a
s1:a
t1:a
t1:a
t1:a
至于String对象以及Integer 等包装类,它们本身都是final类型,所以每次给它们赋值都是重新new出对象,不过这一切都在java内部运行而已。明白这个后,第一个
例子看起来也就不那么难以
理解了