一、Java数组是静态的,数组一旦被初始化过后,其内存空间和数组大小是不可变的。
数组的初始化有两种方式,静态初始化和动态初始化。
(1)静态初始化:初始化时由程序员显示的指定数组每个元素的值,其数组大小由系统确定。
//采用第一种静态初始化的方式
String[] name =new String[]{"张三","李四"};
//采用第二种静态初始化的方式
String[] names ={"张三","李四"};
(2)动态初始化:由程序员确定数组的大小,其数组每项的值有系统确定。
String[] a =new String[5];
注意:不要同时使用静态和动态的方式初始化数组,即不要指定了数组的大小,又指定了数组每项元素的值。
二、Java数组在使用时不一定要初始化
Java数组变量是一种引用型变量,数组变量并不是数组本身,而是指向堆内存中的数组对象本身。
因此数组使用时并不一定要初始化,举例如下:
int[] nums =new int[]{1,2,3};
int[] prices ;
prices =nums;
在声明了数组prices后,直接将nums数组赋给prices,这样数组便没有初始化也能使用。这便是引用型变量,其本质是将prices和nums指向了堆内存中同一块连续的内存空间。
所有局部变量(不管是基本类型变量还是引用类型变量)都是存储在其方法的栈内存中的,但引用型变量所引用的对象(包括数组,普通的JAVA对象)都是存储在堆内存中的。
三、没有多维数组
如果已有的类型是int,在int后加[],便成为一个int类型的数组,如果以 int[] 后再加[]得到 int[][] 类型数组,所以所谓多维数组只不过是一维数组叠加而已。
public class Test{
public static void main(String args[]){
int a[][][]= new int[3][2][];
for (int i=0;i<a[0].length;i++){
System.out.println(a[0][i]);
}
a[0][0]=new int[2];
a[0][0][1]=6;
for(int i=0;i<a[0][0].length;i++){
System.out.println(a[0][0][i]);
}
}
}
两个问题:
(1)在Java中,声明并创建数组的过程中,内存是如何分配的?
(2)在基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别吗?