1. 数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。
因此,可以改变一个数组变量所引用的数组,这样可以造成数组长度可变的假象。
2. 数组一定要进行初始化。(不要搅混数组变量跟数组对象!-->看第三条)
不过可以换一个方式来初始化数组,或者说,数组无需初始化。
就是,先初始化一个A数组,然后再把此数组赋值给另一个B数组变量,那么B数组变量就等于有了数组。也就跳过了数组初始化,例子:
String[] A=new String[2];//静态初始化了一个长度为2 的字符串数组
String[] B=null;//定义了一个数组变量B
B=A;
System.out.println(B.length);
结果: 2
其实本质上还是初始化了数组。只是让B变量直接指向了一个已经执行初始化的数组。
3. 数组变量跟数组对象,不要被搞混了。
数组变量只是一个引用变量(有点类似于C语言里的指针);
而数组对象就是保存在堆内存中的连续内存空间。
对数组执行初始化,其实并不是对数组变量执行初始化,而是在堆内存中创建数组对象——也就是为该数组对象分配一块连续的内存空间,这块连续的内存空间的长度就是数组的长度。
对于数组变量来说,它并不需要进行所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。
4. 不管是数组还是其它类型的变量,如果是为局部变量的话,必须由程序员自己赋初始值,即使将它赋为null也行。
5. java数组的初始化方式有两种:静态初始化、动态初始化
例子:
动态初始化: String[] A=new String[2];//初始化时程序员只指定数组长度,由系统为数组元素分配初始值
静态初始化: String[] A=new String[]{"1","2"};//初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
6. 数组变量何时只是数组变量,何时代表数组对象本身?
当数组变量引用数组对象的属性、方法的时候,就代表数组对象。
没有引用就是数组变量。
例子:
String A=new String[2];
System.out.println(A);//此时没有引用数组对象的属性方法,所以A是数组变量!
System.out.println(A.length);//此时调用了数组对象的属性,所以A是数组对象!
结果:
[Ljava.lang.String;@533ded59 //为引用数组对象的地址
2 //数组对象的长度
7. 基本类型数组的初始化
对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此基本类型数组的初始化比较简单:
程序直接为数组分配内存空间,再将数组元素的值存入对应的内存里。
8. 引用类型数组的初始化
引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和java对象)。
9. 基本类型变量的值存储在栈内存中,其实这句话是完全错误的。
应该说:
所有局部变量都是放在栈内存里保存的,不管其是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数组、普通java对象)则总是存储在堆内存中。