首先解决数组初始化的问题,数组一定要初始化吗?有些书籍上说使用数组之前必须初始化数组,也就是为数组元素分配内存空间,并指定初始值。但实际上,如果真正掌握了java数组在内存中的分配机制,可以换个方式来初始化数组,或者说,数组无需经过初始化。始终记住,java的数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量,举个例子吧:
public class ArrayTest
{
public static void main(String[] args)
{
//定义、并初始化nums数组
int[] nums = new int[]{3, 5, 20, 12};
//定义一个prices数组变量
int[] prices;
//让prices数组指向nums所引用的数组
prices = nums;
for (int i = 0 ; i < prices.length ; i++ )
{
System.out.println(prices);
}
//将prices数组的第3个元素赋值为34
prices[2] = 34;
//访问nums数组的第3个元素,将看到输出34.
System.out.println("nums数组的第3个元素的值是:" + nums[2]);
}
}
可以看出程序定义了prices数组之后,并为对prices数组进行初始化,如图1:
档程序执行prices = nums之后prices变量将指向nums变量所引用的数组。其实我们说的使用之前初始化是对数组对象初始化,而不是对数组变量初始化。
再说数组的内存分配
对于基本类型的数组就是在堆内存中分配一个连续的内存空间,未初始化前有默认值
byte shot int long的默认值是0;
float 和double是0.0
char是"\u0000"
boolean 是false
引用类型是null;
对于引用类型的内存分配
也举个例子
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变量的值赋给第一个数组元素
students[0] = zhang;
//将lee变量的值赋给第二个数组元素
students[1] = lee;
//下面两行代码的结果完全一样,因为lee和students[1]指向的是同一个Person实例。
lee.info();
students[1].info();
}
内存分配如图2
开始的时候系统为数组分配两个空间默认值是null ,接着new 出两个对象zhang和lee 分别对应着内存中的两块区域。
然后将students[0]赋给zhang,students[1]赋给lee,相当于变量zhang和students[0]指向同一个对象,students[1]和lee也指向同一个对象。
|
-
1.png
(5.13 KB, 下载次数: 76)
1
-
2.png
(10.01 KB, 下载次数: 61)
|