2.4 数组对象
在Java语言体系中,数组被归为对象处理。数组数据类型是一种简单的复合数据类型,数组是有序数据的集合,其中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标唯一地确定数组中的元素,有一维数组和多维数组。
2.4.1 一维数组的声明和创建
数组变量的声明和创建数组实例与类变量的声明和创建对象是一样的,声明一维数组变量的语法格式为:
modifer为声明数组的属性,属性有protected、public、private。
type(类型)是声明数组的数据类型,数据类型包括基本数据类型和复合数据类型。
arrayName为数组的名称。
数组变量的声明可以在类中的任何地方使用。
声明数组变量并不为该变量分配计算机内存,与创建对象一样,数组也需要通过new运算符动态地创建分配内存,创建数组对象的语法格式为:
arrayLength为要创建数组的长度,其合法的取值范围是非0的正整数,或为运算结果为非0正整数的表达式,它表示数组中有arrayLength个元素。
由于创建数组对象是赋值操作,所以该语法格式只能在方法体中使用。
在数组对象的创建过程中,关键字new为数组在计算机中动态分配与数组长度、数组数据类型相匹配的内存空间。
Java运行系统在创建数组对象时首先建立数组的下标引用,确定数组每个元素的使用,然后要对数组中所有的元素进行初始化工作,数组元素的初始化分为动态和静态两种,使用关键字new创建的数组对象其初始化是动态进行的,一旦数组被创建并分配了适当的内存空间,则数组中的所有元素都初始化为type类型的默认值。
当创建了数组对象后即可引用数组的每一个元素,其引用数组元素的语法格式为:
index为数组的下标值,index是一个正整数类型的有效数值,起始值为0,它是用于唯一指定数组元素的数值,合法的下标取值范围是从0到数组的长度(arrayLength)减1。
数组中的每一个元素的使用与其他非数组变量的使用是一样的,在表达式等语句中就是一个变量,数组名arrayName后的方括号中index指定引用的数组元素,index可以是一个不小于0的正整数数值,也可以是运算结果为有效正整数的表达式。
【示例2-13】 创建一个数组名为n、具有10个元素的整数类型数组。创建后int类型默认的初始值是0,当该数组需要赋予其他初始值时,可再为数组中每个元素赋予一个数值,其程序代码为:
声明数组变量和创建数组对象可以合二为一,其语法格式为:
该语法格式为同时声明并创建数组对象,等号两边的数据类型要一致,该语法格式可以在类中的任何地方使用。
【示例2-14】 创建一个数组名为s和b,s是具有10个元素的复合数据类型的数组对象,b是基本数据类型的数组对象,并在类的构造方法中为s和b数组对象的前两个元素赋予初始值。复合数据类型为String(字符串)类型,在Java体系中字符串是被当作对象处理的,程序代码为:
在Java体系中还可以创建数组时静态地为数组元素赋予初始值,其语法格式为:
value0~valueN是为arrayName数组名的数组元素赋予的初始值,初始值之间用分隔符“,”逗号分开,value0为数组第1个元素赋值,value1为数组第2个元素赋值,依次类推。该语法格式为数组元素赋值同时也创建了N+1(数组长度)个数组元素,该数组的下标是从0到N。该语法格式可以在类中的任何地方使用。
【示例2-15】 演示使用静态方式为数组元素赋予初始值并同时创建了数组对象。其程序代码为:
在Java体系中,数组被视为一个简单的对象,所以数组对象有它的成员变量和方法,数组对象的成员变量为length,该变量是int类型的,指示了数组的长度,使用length变量可以查看到该数组有多少个元素。
【示例2-16】 通过数组对象变量length查看数组长度。
当数组对象不被使用时,为数组变量赋予null值则可清除该数组变量。
【示例2-17】 清除数组变量的Java程序。
2.4.2 多维数组的声明和创建
在Java体系中不允许指定数组的维数,多维数组被当作数组的数组来处理,多维数组的声明、创建和使用规则基本与一维数组的声明、创建和使用相同,多维数组在一维数组的基础上只是每维数组的每一个元素也是一个数组而已,如此类推产生多维数组。
声明二维数组变量的语法格式为:
创建数组对象的语法格式为:
arrayLength0是确定第一维数组的长度,arrayLength1是确定第二维数组的长度。
同时声明并创建二维数组对象的语法格式为:
引用二维数组元素的语法格式为:
index0是第一维数组的下标值,index2是第二维数组的下标值。
【示例2-18】 创建一个二维数组对象,其数组名为m,第一维数组有10个元素,每个元素又是一个具有20个元素的数组。动态创建和为数组重新初始化的程序代码为:
【示例2-19】 用静态方式为二维数组元素赋予初始值并同时创建数组对象。
在上述程序中,m是一个有3个元素的数组对象,而每个元素又是有2个元素的数组对象,因此,数组m是一个3×2的二维数组对象,同理,s是一个2×2的二维数组对象。
与一维数组对象查看数组长度相同,通过数组对象的成员变量length可以查看多维数组中每维数组的长度。
【示例2-20】 通过二维数组对象变量length查看每维数组长度。
该程序输出的结果是m数组的长度为3,m数组中元素也是一个数组,长度为2。
同声明和创建二维数组对象一样,声明和创建N维数组对象的语法格式为:
例如创建一个三维数组对象的程序示例为:
另外,多维数组还可以分别动态创建每一维的数组对象,而且每一维数组是可以创建不等长度的,即每个数组元素都是占用独立存储空间的,分别创建多维数组时需要从第一维开始创建,然后再顺序创建二维、三维等数组对象。
【示例2-21】 为创建多维数组对象的Java程序。
2.4.3 数组的应用
【示例2-22】 计算一组数据平均值。当需要完成计算一组数据的总和或平均值等操作时,使用一维数组是最方便的。其程序代码如下:
【示例2-23】 数组元素的排序。对一组数据的排序应用一维数组是最合适的,下面是一个数组元素排序的程序。数组array的初始值是一个无序的整数序列,方法sort()将该数组序列按从小到大顺序排序,排序的方法为当数组元素n大于数组元素n+1,即前面的数大于后面的数时,将两个数组元素中的数据相互交换,让小的数据向前移动,大的数据向后移动,直到遍历完整个数组元素,即没有可交换的数组元素数据时,排序结束。在main()方法中调用排序方法sort(),然后将有序数组元素中的数据输出显示。排序程序代码为:
【示例2-24】 数组作为一个简单对象,也可以作为一个方法的返回类型使用。例如将上述程序排序方法作为一个ArraySort类的固有方法,当输入参数为一个数组时,该方法返回一个将输入数组按从小到大排列的有序数组。其程序代码为:
【示例2-25】 数组的另一个应用是表示矩阵,下面是一个3×2矩阵(二维数组a)与一个4×3矩阵(二维数组b)相乘的程序示例,两矩阵相乘的结果放到一个4×2矩阵(二维数组c)中。其程序代码为:
MatrixMultiply程序输出显示结果为: