重走Java基础——(2)JVM内存分析之堆的数组初始化及对象初始化
数组初始化
首先还是基于代码来分析:
1
2
3
4
5
6
7
8
9
10
11 1package lee;
2public class Method {
3 public static void main(String[] args) {
4 int[] ages = new int[] {20,30,40};
5 System.out.println();
6 ages = new int[] {40,50,60}
7 System.out.println(ages)
8 }
9}
10
11
1
2
3
4
5 1输出结果为:
2[I@1b6d3586
3[I@4554617c
4
5
分析:
-
首先,运行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。此时的内存图如下所示:
对象的初始化
首先还是基于代码来分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1package lee;
2public class Dog {
3 String name;
4 String color;
5 int age;
6 double weight;
7 public static void main(String[] args) {
8 Dog blackDog = new Dog();
9 blackDog.name = "XiaoHei";
10 balckDog.color = "Yellow";
11 }
12}
13
14
分析:
- 首先,运行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";