Java方法参数传递的底层分析

戚薇 Java教程 发布时间:2022-06-19 20:00:08 阅读数:15610 1 Java方法
下文笔者讲述java方法参数传递,到底传递了何种东西的详细简介说明,如下所示
在java的学习中,我们经常被问及一个问题,
 调用java的参数时,
 java是进行的值传递,还是进行的引用传递呢?
----------------------------------------------
笔者先告诉大家,java方法中的参数进行的值传递
  (基础类型传入的是实际值,引用类型传入的指向引用类型的内存地址)
那么可能有人会问:有些传递的对象,
   在方法里面改变了值,外面也会发生变化,
   这是为什么呢?下文笔者将一一道来,如下所示
----------------------------------------------

首先笔者会讲述java参数存储

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

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

如果我们创建对象时,user=new User()时,则会在堆上开辟内存空间,初始化User对象
然后再将User对象的地址赋值给user 

从以上的存储方式,我们可以看出:
基本类型和引用类型都存在栈中
  引用指向的实际对象存在堆中
   public static void main(String[] args) {
        int a = 88;
        m1(a);
        System.out.println("main1 a="+a);

        User user = new User("java265");
        m2(user);

        System.out.println("main2 name="+user.getName());
        m3(user);
        System.out.println("main3 name="+user.getName());
    }

    public static void m1(int a1){
        a1 = 8;
        System.out.println("m1 a1="+ a1);
    }

    public static void m2(user user1){
        user1.setName("jjjjj");
        System.out.println("m1 name="+ user1.getName());
    }

    public static void m3(user user1){
        user1 = new user("555");
        System.out.println("m2 name="+ user1.getName());
    }

运行结果:

m1 a1=8
main1 a=88

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

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

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202206/3770.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者