1 、栈、堆、方法区
栈:方法调用以及变量的生存空间,线程私有,生命周期和线程一致。方法和局部变量还有引用变量都在栈中。
堆:对象的生存空间。线程共享,主要是存放对象实例、数组。多个线程私有的分配缓冲区可以位于物理上不连续的空间,但是逻辑上要连续。
方法区: 属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2、实例变量与局部变量
实例变量:声明在类中而不是方法里。实例变量都存在对象所属的堆空间上。
局部变量:被声明在方法中,生命周期直至方法弹栈。
引用变量:对象的引用。
注意:要明确引用变量和实例变量的差别。
如果实例变量是个其他对象,保存的也是引用。
3、对象的创建和构造函数
1、对象创建分为3部分:声明引用变量,创建对象,连接对象和引用。
2、创建某个对象不仅会取得所有实例变量所需的空间还会包括一路下来继承的东西,即继承下来的构造函数都会执行。执行顺序为栈出顺序即栈顶先执行。super()可以将父类构造函数放在栈顶。
注意:将super()放在首位就在于要创建实例要执行父类构造,我们没调用super()编译器会帮我们调用。如果从·某个构造函数调用重载另一个的构造函数可以使用this。
4、对象的存活
对象的生命周期·完全看引用是否存在,引用死了对象也殉情了。
(1) 局部变量只活在声明该变量的方法中,方法弹栈变量就消失了。
(2)实例变量与对象同在,只要引用还在对象就不会消失。
(3)引用变量只有在处于它的范围内才能被引用。
对象的消失
(1)引用离开了它的范围
void ins(){
Life a = new Life();//方法弹栈对象消失
}
(2)引用被赋值到其它对象
Life b = new Life();
b = new Life():
(3)将引用赋值为null
Life c = new Life();
c = null;