在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]};
    }
}

按行存储 java数组 数组在java中储存在堆中_引用变量