堆 heap
对象都是存储在堆中,可以随时调用
栈 stack
特殊的线性存储结构,后进先出 first in larst out。
方法调用及变量生存空间
局部变量和实例变量
局部变量
局部变量又称为栈变量,存储在栈中
方法存储在方法栈中,方法中的变量为局部变量,方法执行完成后,局部变量随着方法一起被垃圾回收,所以方法执行完成后,局部变量不可以访问
public void func1(){
int i = 0;
func2();
}
public void func2(){
int j = 1;
func3(j)
}
public void func3(int a){
int b = a;
}
局部变量中的引用类型,引用类型变量存储的是对象在堆中的地址,所以引用变量的值也是存储在栈中的(在没有初始化前,引用变量的值为null,实例对象后new ,会在堆中开辟一个空间存储这个对象),而对象仍然是存在堆中,当这个方法调用结束后,这个引用变量随着方法被一起出栈销毁,而引用变量指向的对象会被java虚拟机判断为可回收的状态,等待垃圾回收。
实例变量
实例变量就是对象的属性,和对象共存亡,存储在堆中
age就是People的实例变量,当实例一个People时
People people = new People();
people存放在堆中,age也属于其中
当people被垃圾回收,age也被回收
public class People{
int age=1;
Dog dog= new Dog;
}
实例变量中的引用类型,引用类型的值也是存在这个对象中的,也就是堆。而引用类型所指的对象会重新开辟一块堆内存存储(引用类型变量未赋值时是null,基本类型也有默认值,int 0,Boolean false)。
如何让堆中存储的对象变成可回收状态
- 将这个引用类型变量赋值null,上一个对象变成可回收
- 将这个引用类型变量重新赋值,上一个对象变成可回收
- 局部变量所在的方法块执行完成,被弹出栈