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();
}
}