一个java面试题(关于传参)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一个java面试题(关于传参)

一个java面试题(关于传参)

 2013/7/10 18:35:26  fatasy3  程序员俱乐部  我要评论(0)
  • 摘要:这个大家自己想一下然后再试运行一下,没准结果会令你大吃一惊。publicstaticvoidmain(String[]args){finalStrings="aaa";finalStringt="bbb";copyString(s,t);System.out.println("s:"+s);System.out.println("t:"+t);finalchar[]sc=s.toCharArray();finalchar[]tc=t.toCharArray();copyChar(sc,tc)
  • 标签:面试 JAVA面试题 Java面试 Java 一个 面试题
这个大家自己想一下然后再试运行一下,没准结果会令你大吃一惊。
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内部运行而已。明白这个后,第一个例子看起来也就不那么难以理解
发表评论
用户名: 匿名