重走Java基础——(2)JVM内存分析之堆的数组初始化及对象初始化
数组初始化
首先还是基于代码来分析:
package lee;
public class Method {
public static void main(String[] args) {
int[] ages = new int[] {20,30,40};
System.out.println();
ages = new int[] {40,50,60}
System.out.println(ages)
}
}
输出结果为:
[I@1b6d3586
[I@4554617c
分析:
- 首先,运行main方法,创建一个
main
方法的栈帧,里面存放了int [] ages
,将该栈帧入栈。 - 注意代码:
int ages = new int[]{20,30,40};
,等式左侧声明一个int类型的数组ages
,等式的右侧是在堆中初始化数组new int[]{20,30,40}
,并且把初始化的地址赋值给ages
变量。此时堆中存放的是数组对象,而栈中存放的是数组对象的一个引用变量ages
,并且该变量的值等于堆中数组对象的一个存放地址。 - 此时的内存图如下:
- 程序继续运行
ages = new int[]{40,50,60};
指的是在堆中初始化了一个新数组,把数组的地址重新赋值给了ages
。此时的内存图如下所示:
对象的初始化
首先还是基于代码来分析:
package lee;
public class Dog {
String name;
String color;
int age;
double weight;
public static void main(String[] args) {
Dog blackDog = new Dog();
blackDog.name = "XiaoHei";
balckDog.color = "Yellow";
}
}
分析:
- 首先,运行main方法,创建一个
main
方法的栈帧,里面存放了Dog blackDog
的引用变量,将该栈帧入栈。 - 注意代码:
Dog blackDog = new Dog();
,等式左侧声明一个引用类型(Dog类)的变量blackDog
,等式的右侧是在堆中初始化对象new Dog()
,并且把初始化的地址赋值给blackDog
变量。此时堆中存放的是Dog
对象,而栈中存放的是Dog
对象的一个引用变量black
,并且该变量的值等于堆中数组对象的一个存放地址。此时Dog
对象进行初始化,其属性值为默认初始化的值。如age
默认为0; - 之后,对其属性进行赋值。
blackDog.name = "XiaoHei"; balckDog.color = "Yellow";