暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

探究Java方法参数传递方式的本质

风济海 2021-09-07
1290


初开始接触Java时,可能会被问到过或者见过这个问题:Java方法参数的传递方式到底是值传递还是引用传递?


01

结论


先说结论Java方法参数的传递方式是值传递。


其实要搞清楚Java方法参数的传递方式,需要先搞清楚参数是怎么存储的。


02

参数的存储


JVM内存模型中存在栈和堆,栈是线程私有的,每个线程都有个私有的栈,而堆是所有线程共享的。


每个方法在执行的时候都会创建一个栈帧,栈帧中的局部变量表是用来存储一组变量值的内存空间,用于存放方法参数和方法内部定义的局部变量;所以当我们做如下的代码声明时,是在栈上开辟内存空间存储的。

    int a = 1;
    Person person= null;


    但是,当我们创建对象new Person()时,会在堆中开辟一段内存空间并初始化Person对象。如果把Person对象赋给栈中的person,只是把Person对象地址赋值给person。


    基本类型和引用类型都存在栈中,引用指向的实际对象存在堆中



    03

    验证

    代码示例:

         public static void main(String[] args) {
      int a = 1;
      m1(a);
      System.out.println("main1 a="+a);
      Person person = new Person("fjh");
      m2(person);
      System.out.println("main2 name="+person.getName());
      m3(person);
      System.out.println("main3 name="+person.getName());
      }
      public static void m1(int a1){
      a1 = 2;
      System.out.println("m1 a1="+ a1);
      }
      public static void m2(Person person1){
      person1.setName("zs");
      System.out.println("m1 name="+ person1.getName());
      }
      public static void m3(Person person1){
      person1 = new Person("ls");
      System.out.println("m2 name="+ person1.getName());
      }

      运行结果:

        m1 a1=2
        main1 a=1
        m1 name=zs
        main2 name=zs
        m2 name=ls
        main3 name=zs

        从m1方法执行的结果可以验证出:如果参数传递的是基本类型,是将实参的值复制到方法的形参中,即传递的是原始值的副本,操作副本不会影响原始值。


        从m2方法执行的结果可以验证出:如果参数传递的是引用类型,是将实参的引用拷贝到方法的行参中,即:传递的是实参所引用的对象在堆中的地址值的副本。引用用于访问实际对象,也就意味着对形参进行修改会影响实参。


        m3执行结果图解

        1)执行20行之前

        2)执行20行之后:


        以上分析,可以说明Java方法参数的传递方式是值传递。


        -END-


        如果觉得本文对你有用

        请长按二维码,关注 风济海,顺便点个 在看 

        转发至 朋友圈,是对我最大的支持


        文章转载自风济海,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论