首先要理解的是,局部变量存储在堆栈中,这些变量没有使用它们的默认值显式初始化。实例变量存储在堆中,默认情况下使用默认值进行初始化。
而且,在堆上也创建对象,无论实例引用变量是否保存其引用,还是本地引用变量。
现在,发生的是,当您将数组引用声明为局部变量时,并使用数组初始化:
int[] in = new int[5];
数组引用(in)存储在堆栈中,为数组分配一个内存,能够在堆上保存5个整数元素(记住,对象是在堆上创建的)。然后,在堆上分配用于存储整数值的5个连续的存储单元(size = 5)。并且数组对象上的每个索引依次保存对这些内存位置的引用。然后数组引用指向该数组。因此,由于5个整数值的内存在Heap上分配,所以它们被初始化为其默认值。
而且,当您声明数组引用时,也不要用任何数组对象初始化它:
int[] in;
数组引用是在Stack上创建的(因为它是一个局部变量),但是默认情况下它不会被初始化为数组,并且与实例变量一样也不会变为null。
所以,当您使用数组声明和初始化的第一种方法时,这是分配的方式:
“Your array reference”
“on stack”
| | “Array object on Heap”
+—-+
| in |———-> ([0, 0, 0, 0, 0])
+—-+
“Stack” “Heap”
版权声明:本文为weixin_39588209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。