java 数组变量与数组对象

时间:2023-02-16 17:51:30
数组是否必须初始化
对于这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,他能够指向实际的数组对象。
所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。

public static void main(String[] args) {
    int [] num1 = new int[]{11,22,33,44,55};
    int [] num2 = num1;
    int [] num3 = new int[]{1,2,3,4,5};
    int [] num4 = null;
    int [] num5 = {};
    
    num1 = num3;
    num3[2] = 0;
    num2[2] = num1[2];
    System.out.println(num1[2]);
    System.out.println(num2[2]);
    System.out.println(num4[0]);//java.lang.NullPointerException
    System.out.println(num5[0]);//java.lang.ArrayIndexOutOfBoundsException: 0
}

1.java的数组变量是引用类型的变量

2.大部分时候,我们把数组变量和数组对象搞混了,数组变量只是一个引用变量(类似C里的指针),通常存放在栈内存中(也可放入堆内存中的);而数组对象就是保存在堆内存中的连续内存空间。对数组执行初始化,其实并不是对数组变量执行初始化,而是要对数组对象执行初始化---也就是为该数组对象分派一块连续的内存空间,这块连续内存空间的长度就是数组的长度。
对于数组变量来说,它并不需要进行所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量了

3. 所有局部变量都是放在栈内存里保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在格子的方法栈区中;但引用类型变量所引用的对象(包括数组,普通java对象)则总是存储在堆内存中。