java的参数传递问题

在调用一个有参方法时我们会传递参数,如果方法外我们定义了这个参数,调用的方法内对这个参数做了操作,那么调用方法之后原来的这个参数有没有改变呢?举个栗子。

1,首先方法的参数是基本类型的数据。

public static void main(String[] args) {
        int a = 1;
        int b = 2;

        changeValue(a,b);
        System.out.println(a);
        System.out.println(b);
    }

    /*
    *参数是基本类型
     */
    public static int changeValue(int a,int b){
        a = a + 1;
        b = b + 1;

        return a;
    }

上面这种情况a 还是1,b还是2,为什么没有变呢?因为main方法里面的a和b是main方法里面的,跟changeValue里面的a和b不是一回事,changeValue里面的a和b,他可以叫a和b,也可以叫c和d,随便。所以怎么修改都是在changeValue里面,和main里面的没有关系。其实还涉及到堆和栈的问题,画个图。

main方法时程序的入口,所以程序运行时,main方法首先进入栈,给a, b赋了值,然后就执行了changeValue,这时候穿进去的是1,2,然后在changeValue里面,让a = a +1 ,b =  b +1,完事之后changeValue 这个方法就结束了,他就从栈里面出去了,没他事了,main方法继续往下走,所以,跟他的a和b有啥关系呢,也没有给a和b赋值,所以没变。

2,方法类型是引用类型的时候

我们都知道,引用类型的数据,数据的内容是存在堆内存的,而引用类型的变量名在栈内存中。先举个栗子。

    public static void main(String[] args) {
        int[] arr = {2,3,5};
        System.out.println(arr[1]);
        changeValue(arr);
        System.out.println(arr[1]);
    }

    /*
    *参数是引用类型
     */
    public static void changeValue(int[] arr){
        arr[1] = 6;
    }

此时我们的参数类型是个数组,也就是个引用类型的,那么我们第一次输出的是3,第二次输出的却是个6,为什么?放张图解释一下

首先在main方法里面定义了一个数组arr,他的内容是{2,3,5},这个内容就在堆内存里了,这个arr只是指向堆内存他的内容的地址。当调用changeValue的时候,把arr,也就是指向堆内存内容的地址给了changeValue,这时候在changeValue里面对arr[1]进行赋值,他就会顺着这个地址到堆内存中,改的就是堆内存中这个数组的第二个值,所以当执行完changeValue之后,堆内存的内容已经变了,再输出arr[1]时,就是改变后的6了。

总结:当参数是基本类型时,随便改,改完以前是啥样还是啥样,当是引用变量时就会变了,因为已经把堆内存中内容改了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值