1.Java的数组变量是引用类型的变量——数组变量存在栈中,数组对象存在堆中。
2.Java数组的2种初始化方式
所谓初始化,即在堆中创建数组对象,也就是在内存中为数组对象分配一块连续的内存空间,并为每个数组元素指定初始值。
对于数组变量来说,它并不需要所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。
1)静态初始化
由程序员指定每个元素的初始值,由系统决定长度。
int[] arr = new int[]{1, 2, 3, 4, 5};//静态初始化
int[] arr = {1, 2, 3, 4, 5};//静态初始化的简化形式
2)动态初始化
程序员指定数组长度,系统为每个元素分配初始值(0, 0.0,null,FALSE)。
int[] arr = new int[5];//动态初始化
注:不要同时使用两种初始化方式, int[] arr = new int[5]{1, 2, 3, 4, 5},这种形式是错误的!
3.局部变量必须由程序员赋初值。
4.“基本类型变量的值存储在栈中”这句话是完全错误的。例如:上面的int型arr数组中的每个值都存在堆中。
实际上应该说:所有局部变量都是放在栈里保存的,不管其是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈内存中的;但引用类型变量所引用的对象(包括数组、普通的java对象)则总是存储在堆中的。
From《疯狂JAVA程序员的基本修养》