形参会影响实参吗

形参

所谓形参,就是形式参数,在你没有调用它的时候他是没有值的。

实参

可以理解为你创建的变量就是实参,有具体的值。就算你不赋值他也会有默认的初始值。

形参会不会影响实参?

答案是:会!
但是并不是全部都会影响
形参不会影响基本数据类型的实参

public static void changeNumber(int num) {
        num = 10;
        System.out.println("执行change方法时" + num);
    }


    public static void main(String[] args) {
        /*基本数据类型*/
        int num = 1;
        System.out.println("执行方法前:" + num);
        changeNumber(num);
        System.out.println("执行方法后:" + num);
    }

输出结果

执行方法前:1
执行change方法时10
执行方法后:1

结果显示基本数据类型时,形参并不会影响实参。
形参可以影响引用类型的实参

    public static void main(String[] args) {
        /*引用数据类型*/
        StringBuffer stringBuffer = new StringBuffer("abc");
        System.out.println("执行方法前:"+stringBuffer);
        changeString(stringBuffer);
        System.out.println("执行方法后:"+stringBuffer);
    }


    public static void changeStringBuffer(StringBuffer stringBuffer){
        stringBuffer.append("def");
        System.out.println("执行方法时:"+stringBuffer);
    }

输出结果

执行方法前:abc
执行方法时:abcdef
执行方法后:abcdef

形参影响了引用类型的实参!
下一个例子!

public static void main(String[] args) {  
        /*引用数据类型*/
        String string = "abc";
        System.out.println("执行方法前"+string);
        changeString(string);
        System.out.println("执行方法后"+string);
    }
    public static void changeString(String string) {
        string = string.concat("def");
        System.out.println("执行方法时" + string);

    }

执行结果:

执行方法前abc
执行方法时abcdef
执行方法后abc

形参没有影响引用类型的实参?
那么什么情况下才会有 形参影响实参呢?
这就要考虑到底是怎么改变的。
首先要知道引用数据类型,变量存储的只是一个地址值!
形参只有在执行的时候才会创建一个临时的空间存储这个形式参数,方法结束这个形式参数的生命周期就结束了。那么形式参数影响实参的时机就肯定是在这个生命周期内!
一步一步考虑,调用方法的时候需要将实参传入方法,让形参暂时有一个值,因为是引用数据类型,所以形参此时存储的是和实参一样的地址值。
此时形式参数进行一系列的操作都是对堆空间中的同一个内容进行操作的,所以如果形式参数对堆空间的值修改了,那么实参再查看堆空间里面的数据的时候就是已经被改变过了的数据。这就是为什么StringBuffer受到了形参的影响的原因。
那么为什么String就没有受到影响呢?
changeString()方法种,执行的是String的concat方法。

    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }

这是String类中的concat方法,怎么处理的不用看明白,直接看他的返回值

return new String(buf, true);

new是干嘛的?创建了新的对象啊!创建对象就是再堆空间新开辟空间了呀!
这就意味着此时形参存储的地址值现在已经不再是最开始实参给他的地址值了,不管他在怎么操作都是对一个新的堆空间地址中的数据进行操作,原来的实参的堆空间的数据没有发生过改变,所以方法结束后,实参的内容并没有发生改变。
总结来说就是形参影响引用数据类型的实参,要看地址值是不是发生了改变,如果形参的地址值发生了改变,那么形参就不会影响实参,如果形参的地址值没有发生改变,那他就会影响实参。

总结

形参并不会影响基本数据类型的实参。
形参只有在存储的地址值不发生变化的时候才会影响实参。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值