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


    转自:

     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方法执行的结果可以验证出
       当参数传递的是引用类型,是将实参的引用拷贝到方法的行参中
     即:传递的是实参所引用的对象在堆中的地址值的副本
       引用用于访问实际对象,也就意味着对形参进行修改会影响实参。
  • 相关阅读:
    【iDRAC】突破错误信息壁垒,利用iDRAC提高效率
    力扣(2024.06.12)
    TS(五):装饰器
    怎么用java把多个list合并成一个?
    python语法糖-推导式
    【leetcode top100】两数相加。无重复字符的最长子串,盛水最多的容器,三数之和
    CSS阶详细解析一
    Java带图片的excel数据导入
    【WPF】单例软件实现自重启
    谈一谈MySQL 的索引机制以及优化建议
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/125616280