packagecn.study.array;
/**
*一旦初始化完成,该数组的长度就不可改变,Java语言允许通过数组的length属性来访问数组的长度。
*■数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值是0。
*■数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0。
* ■数组元素的类型是基本类型中的字符类型(char),则数组元素的值是'\u0000'。
* ■数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
* ■数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。
*
* @author Administrator
*
*/
public classArrayTest {
publicstatic void main(String[] args) {
//采用静态初始化方式初始化数组
String[]books = new String[] { "Java", "JavaEE", "Ajax","Xml" };
//采用静态初始化方式初始化数组
String[]names = { "Jobs", "Gates", "lee" };
//采用动态初始化方式初始化数组
String[]strArr = new String[5];
System.out.println("第一个数组books的长度:"+ books.length);
System.out.println("第二个数组names的长度:"+ names.length);
System.out.println("第三个数组strArr的长度:"+ strArr.length);
/**
*Java的数组是静态的,一旦为数组初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而无法改变数组的长度。
*/
books= names;
strArr= names;
/**
*将让books数组变量、strArr数组变量都指向names数组变量所引用的数组,这样做的结果就是books、strArr、
* names这3个变量引用同一个数组对象。
*/
System.out.println("books= names---------------------");
System.out.println("books的数组长度:"+ books.length);
System.out.println("strArr= names---------------------");
System.out.println("strArr的数组长度:"+ strArr.length);
System.out.println("books的第二个元素是:"+ books[1]);
System.out.println("names的第二个元素是:"+ names[1]);
books[1]= "beyond";
System.out.println("books的第二个元素是:"+ books[1]);
System.out.println("names的第二个元素是:"+ names[1]);
}
}
输出结果:
第一个数组books的长度:4
第二个数组names的长度:3
第三个数组strArr的长度:5
books =names---------------------
books的数组长度:3
strArr =names---------------------
strArr的数组长度:3
books的第二个元素是:Gates
names的第二个元素是:Gates
books的第二个元素是:beyond
names的第二个元素是:beyond
此时strArr、names和books数组变量实际上引用同一个数组对象。因此,当访问books数组长度、strArr数组的长度时,将看到输出3。这很容易造成一个假象:books数组的长度从4变成了3。实际上,数组对象本身的长度并没有发生改变,变的是books数组变量。books数组变量原本指向堆内存下面的数组,当执行了books=names;语句之后,books数组将改为指向堆内存中间的数组,而原来books变量所引用的数组的长度依然是4。但不再有任何引用变量引用该数组,因此它将会变成垃圾,等着垃圾回收机制来回收。此时,程序使用books、names和strArr这3个变量时,将会访问同一个数组对象,因此把books数组的第2个元素赋值为“beyond”时,names数组的第2个元素的值也会随之改变。