一个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内部运行而已。明白这个后,第一个例子看起来也就不那么难以理解了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值