面试问的一个问题
定义一个类:
public class A{
public int i=1;
public static void mian(String args[]){
A a=new A();
}
}
运行这个类时,java虚拟机在堆和栈中各保存了哪些数据?求大神解答。
我的回答是在栈中保存了变量i 和 1,及实例化类A的引用a, 在堆中保存了类A的一个对象,从面试官的反应,我应该没答对。
i和a指向的对象在堆上,引用a在栈上。
如果觉得有些绕,记住一点,只有函数中的局部变量才放在堆栈上。这个局部变量如果是对象,那么引用在堆栈上,对象本身在堆上,如果局部变量是int double等,那么它放在堆栈上。
除此之外,对象的成员变量、静态成员等全部都在堆上。
1.加载class文件到class内容区域,加载静态方法和静态变量到静态区(同时加载的)
2.调用main方法到栈内存
3.在栈内存中为a变量(A对象的引用)开辟空间
4.在堆内存为A对象申请空间
5.给成员变量进行默认初始化(此时 i=0),同时有一个方法标记,在方法区中创建一个A的方法区,将A的方法区的地址0x01给方法标记
6.给成员变量进行显示初始化(此时 i=1)
7.将A对象的地址值给变量a
根据你的问题,栈中保存了A对象的引用(即变量A),堆中报存了A对象