Java中方法传参机制常见陷阱(从最底层讲述)

首先说明,Java中分为值传递机制与引用传递机制。不懂的小伙伴可以查看以下文章

Java中基本数据类型赋值机制与数组的赋值机制

Java对象中的方法调用机制

首先我们回顾以下Java中jvm的虚拟内存存储机制,其中包括栈,堆和方法区

  1. 栈:一般存放基本数据类型。
  2. 堆:用于存放对象。
  3. 方法区:常量池(常量,比如字符串等),类加载信息。

 而当我们更改时,如果调用的方法仅仅涉及独立方法栈(即运行方法时独立开辟的栈)时,除了return值可以将其结果保存下来之外,其他都不会将更改的结果保存,是因为方法栈在中的方法在运行结束后,就立即释放掉。其保存子啊方法栈中所有的信息都会释放掉,但是如果方法栈云运行的数据信息更改到堆或者方法区时,就可以永久保存。

查看以下的例子:可以发现在运行过程中num1[0]=200;  num2[0]=100;这两个语句的运行结果100,200是保存在堆中,即使方法执行完毕释放,也没有影响到堆中的结果。

import java.util.Arrays;

/**
 * @author 张硕硕
 */
public class Test {

    public static void main(String []args){
        int []a={10,20};
        int []b={30,40};
        Test test=new Test();
        test.exchangeSum(a,b);
        System.out.println(Arrays.toString(a)+Arrays.toString(b));
    }
    public void exchangeSum(int[] num1, int []num2){
        System.out.println(Arrays.toString(num1)+Arrays.toString(num2));
        num1[0]=200;
        num2[0]=100;
        System.out.println(Arrays.toString(num1)+Arrays.toString(num2));
    }
}

 最后我们来观察以下这个例子:可以发现a数组与b数组的交换只是在栈中的独立方法栈中运行的,exchansum函数结束之后,该栈被立即释放掉。虽然a数组与b数组的地址发生了交换,但是这些改变仅仅在方法栈中运行,并没有传回到堆或者main栈,所以改变并不会被记录。

import java.util.Arrays;

public class Test {

    public static void main(String []args){
        int []a={10,20};
        int []b={30,40};
        Test test=new Test();
        test.exchangeSum(a,b);
        System.out.println(Arrays.toString(a)+Arrays.toString(b));
    }
    public void exchangeSum(int[] num1, int []num2){
        System.out.println(Arrays.toString(num1)+Arrays.toString(num2));
        int []temp=num1;
        num1=num2;
        num2=temp;
        System.out.println(Arrays.toString(num1)+Arrays.toString(num2));
    }
}

我们再来运行一段代码,发现函数的作用是将对象置空,这样输出t.name会发生报错,但是结果却是正常的输出,其原因是因为这个过程仅仅在独立方法栈中运行,并没有影响到main中的作用。

import java.util.Arrays;

public class Test {
        String name="你好";
    public static void main(String []args){
        Test t=new Test();
        t.exchangeSum(t);
        System.out.println(t.name);
    }
    public void exchangeSum(Test test){
       test=null;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值