在说明数组时,也可以不直接指出数组中元素的个数(即数组长度)。数组说明之后尚不能立即被访问,因为还没有为数组元素分配内存空间。如果试图在说明后直接给数组中的任一元素赋值,编译器将提示数组变量没有初始化。为此,需要使用new操作来构造数组,即在数组说明之后为数组元素分配内存空间,同时对数组元素进行初始化。其格式如下:
用new关键字为一个数组分配内存空间后,系统将为每个数组元素都赋予一个初值,这个初值取决于数组的类型。所有数值型数组元素的初值为0,字符型数组元素的初值为一个不可见的ISO控制符(u000),布尔型数组元素的初值为false,字符串数组和所有其他对象数组在构造时元素的初值为null。在实际应用中,用户应根据具体情况来对数组元素重新进行赋值。数组一旦创建之后,就不能再改变其长度。
3.8.2数组的初始化
数组初始化就是为数组元素指定初始值。通常在构造数组时,Java会使每个数组元素初始化为一个默认值。但在许多情况下,并不希望数组的初值为默认值,此时,就需要用赋值语句来对数组进行初始化。
数组的初始化方式有两种:一种方式是像初始化简单类型一样自动初始化数组,即在说明数组的同时进行初始化,另一种方式是在声明之后再构造数组,然后为每个元素赋值。
例如:
int x[ ]={0,1,2,3,4,5,6,7,8};
上述语句创建了数组x ,并且为数组的每个元素赋值,即初始化(见图3-2)。x[0]=0,x[1]=1,x[2]=2,x[3]=3,x [4]=4,x[5]=5,x[6]=6,x[7]=7,x[8]=8。
又如创建一个字符串数组month,包含一年中各个月份的名称。语句如下。
String month[]={“January”, “February”, “March”, “April”, “May”, “June”, “July”, “Angust”, “September”, “October”, “November”, “December”};
由此可知,month[0]为“January”。
由上可见,数组初始化可由花括号“{}”括起的一串由逗号分隔的表达式组成,逗号(,)分隔数组元素中的值。在语句中不必明确指明数组的长度,因为它已经体现在所给出的数据元素个数之中了,系统会自动根据所给的元素个数为数组分配一定的内存空间,如上例中数组x 的长度自动设置为9。应该注意的是,“{}”里的每一个数组元素的数据类型必须是相同的。
3.8.3数组元素的引用
一个数组被定义,用new语句为它分配了内存空间后,就可以在程序中像使用任何变量一样来使用数组元素,即可以在任何允许使用变量的地方使用数组元素。数组元素的表示方式为:
数组名[下标]
其中下标为非负的整型常数或表达式,其数据类型只能为byte,short,int, 而不能为long。如x.[3],x.( i为整型),x.[i*5]等。下标的取值范围从0开始,一直到数组的长度减1。
Java在对数组元素操作时会对数组下标进行越界检查,以保证安全性。若在Java程序中超出了对数组下标的使用范围(例如,数组的最大下标为8,但是在程序中存取了下标为9或-4的元素,则在运行此程序时将出现数组越界的错误提示信息。
在Java中,对于每个数组都有一个属性length,表明其长度(即该数组可以容纳的元素的个数),由程序自动计算。例如,x.length表明了数组x的长度。