重走Java基础——(2)JVM内存分析之堆的数组初始化及对象初始化

释放双眼,带上耳机,听听看~!

重走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";

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 间隔 (Spacing)

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索