在Java中,数组是一种典型的引用变量。创建的数组名为引用变量名,定义在栈区,指向堆区中的数组元素,其值为堆区数组地址。而数组实际元素存储在堆区。此外,Java本质上没有二维数组的概念,二维乃至多维数组本质上都是一维数组的扩展。此时,一维数组的每个元素都是一个引用变量,指向一个新的数组。下面看代码:
/**
* Created by lcg on 2019/8/7.
* Java中的数组(一维数组)其实都是引用变量
* 变量存储了堆内存中的数组实际值地址
*/
public class Loop {
public static void main(String[] args) {
// 定义一维数组,由于类型已指定,所以其值都被初始化为0
// 此时的testArray为一个引用变量,指向了堆内存中的地址
int[] testArray = new int[4];
// 如果输出testArray,则其值为堆内存中的引用地址
System.out.println(testArray);
/** Java中其实没有二维数组,二维乃至三维数组其实是在一维数组上的扩展
* 一维数组中的每个元素都是一个堆内存中的引用变量,变量存储了指向新数组对象的地址
*/
// 此时,myAray指向了堆内存上一块长度为4的内存地址
int[][] myArray = new int[4][];
// myArray,则其值为堆内存中的引用地址,未被初始化,输出的话其值为null不为0
System.out.println(myArray);
// myArray[0]这个引用变量指向了一个长度为2的一维数组,此时myArray[0]中存储的值为指向新数组的地址
// 如果输出的话,输出值为新数组的地址
myArray[0] = new int[2];
for (int i = 0; i < myArray.length; i++) {
System.out.println(myArray[i]);
}
/**
* 另外一种简化写法,其实实现过程与上述描述相同
*/
int[][] simpleArray= new int[][] {new int[3], new int[4]};
}
}