1.1.1  Java数组是静态的

数组被初始化后,长度不可变。

数组的初始化有两种:

①静态初始化:初始化时由程序员显示指定每个数组元素的初始值,有系统决定数组长度。

②动态初始化:只指定数组长度,系统为数组元素分配初始值。

public class ArrayTest {
	public static void main(String[] args){
		//采用静态初始化方式初始化第1个数组
		String[] books = new String[]{
				"计网",
				"计图",
				"计组",
				"操作系统"
		};
		//采用静态初始化的简化形式初始化第2个数组
		String[] names = {
				"孙悟空",
				"猪八戒",
				"白龙马"
		};
		//采用动态初始化的语法初始化第3个数组
		String[] strArr = new String[5];
		//访问3个数组的长度
		System.out.println("第1个数组的长度:"+ books.length);
		System.out.println("第2个数组的长度:"+names.length);
		System.out.println("第3个数组的长度:"+strArr.length);
	}
}

1.1.2  Java数组一定要初始化吗

始终记住:Java的数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量。

数组变量和数组对象:数组变量只是一个引用变量(类似c语言中的指针),通常存放在栈内存中(也可放在堆内存中);而数组对象就是保存在堆内存中的连续内存空间。对数组进行初始化并不是为了给数组变量执行初始化,而是为了给数组对象执行初始化,也就是为该数组对象分配一块连续的内存空间,这块连续内存空间的长度就是数组的长度。

故:对于Java程序中所有的引用变量都不需要经过所谓的初始化操作,需要进行初始化操作的是该引用变量所引用的对象。

深入理解Java引用类型,可访问博客(牛_牛).NET点击打开链接

1.1.3  基本类型数组的初始化

       数组元素的值直接存储在对应的数组元素中,因此基本类型数组的初始化比较简单:程序直接先为数组分配内存空间,再将数组元素的值存入对应内存里。

       下面程序采用静态初始化的方式初始化了一个基本类型的数组对象。

public class PrimitiveArrayTest {
	public static void main(String[] args){
		//定义一个int[]类型的数组变量
		int[] iArr;
		//静态初始化数组,数组长度为4
		iArr = new int[]{
				2,5,-12,20
		};
		System.out.println("iArr的长度:"+iArr.length);
		System.out.println("iArr的第三个元素:"+iArr[2]);
	}
}


注:iArr存在main栈中,iArr的4个元素的值存在堆内存中。


1.1.4  引用类型数组的初始化

    引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和Java对象)。

    为了说明引用类型数组的运行过程,下面程序先定义了一个Person类,然后定义了一个Person[]数组,并动态初始化了该Person[]数组,再显式为数组的不同数组元素指定值。代码如下:

public class Person {
	//年龄
	public int age;
	//身高
	public double height;
	//定义一个Info方法
	public void info(){
		System.out.println("我的年龄是:"+ age +",我的身高是:" + height);
	}
}
public class ReferenceArrayTest {
	public static void main(String[] args){
		//定义一个students数组变量,其类型是Person[]
		Person[] students;
		//执行动态初始化
		students = new Person[2];
		System.out.println("students所引用的长度是:"+ students.length);
		//创建一个Person实例,并将这个Person实例赋给zhang变量
		Person zhang = new Person();
		//为zhang所引用的Person对象的属性赋值
		zhang.age = 15;
		zhang.height = 158;
		//创建一个Person实例,并将这个Person实例赋给lee变量
		Person lee = new Person();
		//为lee所引用的Person对象的属性赋值
		lee.age = 16;
		lee.height = 161;
		//将zhang变量的值赋给第1个数组元素
		students[0] = zhang;
		//将lee变量的值赋给第2个数组元素
		students[1] = lee;
		//下面两行代码结果一样,因为lee和students[1]指向的是同一个Person实例
		lee.info();
		students[1].info();
	}
}