一个面试题引发的思考(Java的值传递)

不多说,直接上题:

public static void main(String[] args) { 
    String str = new String("abc");
    char[] ch = {'a','b','c'};
    swap(str,ch);
    System.out.print(str+" ");
    System.out.print(ch[0]);}

    public static void swap(String a,char[] b){
        a = "gbc";
        b[0] = 'g';
    }
}

先说答案:abc , g。也就是说str的值未变,ch的元素被改变了。为什么呢?

首先强调一点!!!Java中方法的参数传递方式只有一种:值传递! 所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响

做两个测试:

测试一:

    public static void main(String args[]){
        String str="good";
        char[] ch={'a','b','c'};
        swap(str,ch);
        System.out.println("after swap str="+str);
        System.out.println("after swap ch[0]="+ch[0]);

    }

    public static void swap(String str,char[] ch){
        System.out.println("before swap str="+str);
        System.out.println("before swap ch="+ch);
        System.out.println("before swap ch[0]="+ch[0]);
        str="changed";
        ch[0]='g';
    }

结果:

这里写图片描述

在测试一中,我们把ch这个数组作为参数传递过去,打印可知,传过来的是一串地址信息,请注意,虽然它是地址,但它仍然是个,只不过是个地址值!!!所以它是值传递!!!而传过来的数组ch的第一个元素是“a”。经过swap()操作后,ch的第一个元素变成了“g”。
而整个过程下来,str的值是没有改变的。

测试二:

    public static void main(String args[]){
        String str="good";
        char[] ch={'a','b','c'};
        swap(str,ch[0]);
        System.out.println("after swap str="+str);
        System.out.println("after swap ch[0]="+ch[0]);

    }

    public static void change(String str,char ch){
        System.out.println("before swap str="+str);
        System.out.println("before swap ch[0]="+ch);
        str="changed";
        ch='g';
    }

结果:

这里写图片描述

在测试二中,我们把ch[0]这个数组元素作为参数传递过去,打印可知,传过来的是个普通字符,请注意,它也是个,只不过是个字符值!!!所以它也是值传递!!!经过swap()操作后,ch的第一个元素还是“a”。
而整个过程下来,str的值没有改变的。

所以说,java的参数传递只有一种类型:值传递!!!只不过它包括普通数据类型的值传递(传递的就是8大基本数据类型),和引用数据类型的值传递(数组,对象等引用类型数据,传输的是地址值)。

普通类型的参数传递的示意图(下方):

main()和swap()各自有一个栈来存储数据,不涉及堆存储,所以swap()中的操作并不会影响main()中的数值。

这里写图片描述

引用类型的参数传递示意图(下方):

引用类型的不同之处就在于它将“引用”存在栈中,将“数据”存在堆中。进行参数传递时,传递的又是一个地址值,所以swap()接到这个地址时就会指向地址所代表的堆,也就是和main()指向同一个堆,所以swap()改变数据,main()中的数据自然跟着改变,因为它们的栈不同,但堆却相同。

这里写图片描述

啰里啰唆讲了这么多,个人总结就是一句话:参数是普通数据类型的话,在方法中改变数值不会对main()中的数值造成影响;参数是引用类型的话,在方法中改变数值会对main()中的数值有影响。

如果我讲的大家还是不明白,可以参考《疯狂Java讲义》的“方法的参数传递机制”那部分,讲的比较清晰。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值