数组底层的内存分配情况:

Java的数组变量是一种引用类型的变量,创建一个数组变量之后储存在main栈内存,每个数组变量不是数组本身而是指向堆内存中的数组对象
image.pngimage.png
1.要改变一个数组变量,可以改变数组变量指向的堆内存中的数组对象,也就是地址发生了改变,与赋值的数组变量共享地址,造成长度改变的假象,实际上数组一旦创建之后是不可改变长度的
2.此时没有任何引用变量指向这两个数组,会变成垃圾,等待java垃圾回收机制回收
image.pngimage.png
创建pieces数组的数组变量还没有指向任何有效的内存,这个时候并不能使用,nums赋值给pieces之后,两个变量引用同一个数组对象这个时候pieces可以正常使用
image.pngimage.png

数组变量和数组对象的区别:

数组变量只是一个引用变量(有点类似于C语言里的指针),通常存放在栈内存中(也可被放入堆内存中的);而数组对象就是保存在堆内存中的连续内存空间。对数组执行初始化,其实并不是对数组变量执行初始化,而是要对数组对象执行初始化——也就是为该数组对象分配一块连续的内存空间,这块连续内存空间的长度就是数组的长度
对于Java程序中所有的引用变量,它们都不需要经过所谓的初始化操作,需要进行初始化操作的是该引用变量所引用的对象。比如,数组变量不需要进行初始化操作,而数组对象本身需要进行初始化;对象的引用变量也不需要进行初始化,而对象本身才需要进行初始化

动态初始化时数组分配的初始值:

image.png

引用对象和对象本身的存储情况:

所有的局部变量都是放在栈内存中保存的,不管是基本类型的变量,还是引用类型的变量都是存储在自己的方法栈区中,但是引用类型变量所引用的对象(包括数组.普通Java对象)都是存储在堆内存中,且堆内存中的对象都不能够被直接访问,只能通过引用变量访问,档程序通过引用变量访问属性或者调用方法的时候该引用变量就会用它引用的对象替换
main方法声明的变量都属于局部变量,因此它们都被保存在main方法栈中;但数组元素则作为数组对象的一部分,总是保存在堆内存中,不管它们是基本类型的数组元素,还是引用类型的数组元素。
image.png

引用数据类型的初始化:

image.png
image.pngimage.pngimage.png
多维数组内存分配情况:
image.png
image.pngimage.pngimage.png
image.pngimage.pngimage.png