zoukankan      html  css  js  c++  java
  • 记录6--Java栈堆

    class Person {
     
        int age;
     
    }
     
     
    public class LearnHeap {
     
     
        public static void main(String args[]){
     
            int a=18;
            Person person = new Person();
            person.age =18;
     
            change(a,person);
            System.out.println("a="+ a+",and person.age = "+person.age);
     
        }
     
        static void change(int a1, Person person){
     
            a1 = 20;
            person.age= 2020;
            System.out.println("a1="+ a1+",and age1 = "+person);//输出地址
     
        }
     
    }

    以上程序内存加载的执行步骤:

    第1步 —— main()函数是程序入口,JVM先执行,首先将main方法压入栈中,在栈内存中开辟一个空间,存放int类型变量a,同时附值18。
          在堆中分配一片区域,用来存放和创建Person对象,这片内存区域会有属于自己的内存地址,假设是1001,然后给成员变量赋值,age=18
          执行结束后,构造防范弾栈,Person创建完成,将Person的内存地址1001赋值给person(此处person小写,是引用变量类型

    第2步 —— JVM执行change()函数,在栈内存中又开辟一个新的空间,存放int类型变量a和对象Person中person
         此时main空间与change空间并存,同时运行,互不影响

    第3步 —— change()方法执行,将a赋值为20,person对象的堆中年龄age赋值为2020

    第4步 —— change()执行完毕,变量a立即释放,空间消失。但是main()函数空间仍存在,main中的变量a仍然存在,不受影响。而person在堆中对应的地址,所指的age已经赋值=2020

    小结:如果a()方法中的基本类型(int, short, long, byte, float, double, boolean, char)变量x传入b()方法中,并在b()中进行了修改,则a()方法中的x的值保持不变 
    如果a()方法中的引用类型        变量x传入b()方法中,并在b()中进行了修改,则a()方法中的x的值与b()保持一致

  • 相关阅读:
    获取配置文件
    微服务项目(1)
    string,stringbuffer,stringbuilder区别?
    异常
    IDEA结合Maven的profile构建不同开发环境(SpringBoot)
    出现org.springframework.beans.factory.NoSuchBeanDefinitionException 的解决思路
    Spring中的@Transactional(rollbackFor = Exception.class)属性详解
    Ubuntu安装飞鸽传输
    shell 创建带参数的命令方法
    python查询mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/zhuimingzhenbai/p/12238053.html
Copyright © 2011-2022 走看看