记录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()保持一致

原文地址:https://www.cnblogs.com/zhuimingzhenbai/p/12238053.html