压栈:谁在后面进入栈中,就会把之前进入栈中的数据压到脚下。
先进后出
一个对象的内存图
方法区最先有数据,方法区保存的.class相关数据,main方法想运行时需要先进栈(压栈),进来后创建了一个phone对象 对象被赋上地址值0x666对应堆的地址值0x666,堆中保存new出来的对象(凡是new出来的东西都在堆当中),phone对象中有成员变量进入堆中赋上默认值,成员方法进入堆,成员方法被赋上了一个地址值0x333对应方法区中的方法地址值0x333。依次是phone成员变量进栈,改变堆中成员变量的值,成员方法先进入堆的成员方法,堆区找方法区的方法,把成员方法进栈(压栈),方法执行结束后出栈,mian方法结束后出栈
两个对象访问同一个方法的内存图
两个引用指向同一个方法的内存图
使用对象类型作为方法参数
对象类型作为方法的返回值
局部变量和成员变量的生命周期不同:
局部变量在栈中:随着方法进栈而诞生,随着方法出栈而消失
成员变量在堆中:随着对象创建而诞生,随着对象垃圾回收而消失