面试题答案
一键面试堆内存存储的数据类型
- 对象实例:所有通过
new
关键字创建的对象都存储在堆内存中。例如String str = new String("Hello");
,这里new String("Hello")
所创建的字符串对象就存放在堆内存。 - 数组:无论是基本数据类型数组还是对象数组,数组本身都在堆内存中。如
int[] arr = new int[5];
,arr
所指向的数组对象在堆内存。
栈内存存储的数据类型
- 局部变量:方法内部定义的变量,包括基本数据类型变量和对象引用变量。例如在方法
public void test() { int num = 10; String str; }
中,num
和str
存储在栈内存,num
存储具体值10
,str
存储对象引用(此时为空)。 - 方法调用的上下文:包括方法的参数、返回值、方法执行过程中的中间计算结果等。
对象在堆内存和栈内存之间的交互
- 对象创建过程
- 当执行类似
Object obj = new Object();
语句时:- 首先,在栈内存中为变量
obj
分配空间,obj
是一个对象引用变量。 - 然后,在堆内存中为
Object
类的实例分配空间,并初始化该对象。 - 最后,将堆内存中对象的地址赋值给栈内存中的
obj
引用变量,这样栈内存中的obj
就可以指向堆内存中的Object
对象实例。
- 首先,在栈内存中为变量
- 当执行类似
- 方法调用过程
- 假设定义一个类
MyClass
,有方法public void myMethod() { /* 方法体 */ }
,并执行MyClass myObj = new MyClass(); myObj.myMethod();
。 - 当调用
myObj.myMethod()
时:- 先在栈内存中创建一个新的栈帧,用于存储
myMethod
方法的局部变量、参数(如果有)、返回值等信息。 - 通过栈内存中
myObj
引用找到堆内存中的MyClass
对象实例,然后执行该对象实例上的myMethod
方法。 - 方法执行完毕后,栈内存中的该栈帧被销毁。
- 先在栈内存中创建一个新的栈帧,用于存储
- 假设定义一个类