Java里的堆和栈是相对比较抽象的一个概念,对于初学者而言,堆和栈的概念要比类、方法、变量这些概念难懂一些,以下是我整理的关于Java中堆和栈的一点拙见,希望对您有用。
我把堆和栈理解为两个宿舍,其中栈是军官宿舍,堆是士兵宿舍,军官有其统领的士兵,堆中的士兵供栈中的军官调遣。
所谓栈中的军官,其本质是堆空间的访问地址,通过这个访问地址,能访问到堆中不同的部队。
public class TuanZhang {
String qibinglian;
String jingweiyuan;
TuanZhang laoli = new TuanZhang();
}
在上面的这段代码中,定义了一个团长类,团长这个类具有骑兵连跟警卫员这两个属性,团长可以调遣这两个属性,当我们实例化一个团长类的对象老李,JVM做了两件事:
1.在栈内存中保存了老李这个地址,这个地址对应着堆内存中,老李的警卫员和骑兵连。
2.new 关键字,在堆内存中开辟了一块空间,存老李的骑兵连 和 警卫员,如图所示。
图中老李指向了属于他的部队所在。
public class TuanZhang {
String qibinglian;
String heshang;
public static void main(String[] args) {
TuanZhang laoli = new TuanZhang();
TuanZhang dingwei = null;
dingwei = laoli; //让老丁具有和老李一样的指挥权
}
}
在这段代码中,实例化了两个对象,所不同的是,老李的部队是由new 关键字创建出来的,丁伟的部队实际就是老李的部队,并没有额外在堆内存中开辟新的空间,所以可以理解为一个团里有两个团长,他们都有调遣部队的权力,如下图所示。
这里无论是老李 还是 丁伟,对这两个属性的操作都将保存下来,两个团长操作的是一支部队。
总结:栈内存里保存的是引用对象,对内存中保存着基础变量。