重走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)
}
}
输出结果为:
[[email protected]
[[email protected]
分析:
- 首先,运行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";