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

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

猜你喜欢

转载自blog.csdn.net/qq_38337799/article/details/82896255