面向对象的程序设计java张白一第三版第6章

上传人:e****s 文档编号:243733841 上传时间:2024-09-29 格式:PPT 页数:101 大小:1.30MB
返回 下载 相关 举报
面向对象的程序设计java张白一第三版第6章_第1页
第1页 / 共101页
面向对象的程序设计java张白一第三版第6章_第2页
第2页 / 共101页
面向对象的程序设计java张白一第三版第6章_第3页
第3页 / 共101页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,第6章 数组,第6章 数组,6.1 一维数组,6.2 一维数组引用举例,6.3 二维数组,6.4 二维数组的引用,6.1 一 维 数 组,只有一个下标的数组称为一维数组,它是数组的基本形式。建立一维数组通常包括声明数组、创建数组对象和初始化数组三步。,6.1.1 一维数组的声明,声明一维数组就是要确定数组名(引用数组对象的变量名)、数组的维数和数组元素的数据类型。一维数组的声明格式如下:,类型标识符 数组名 ;,或,类型标识符 数组名;,说明:(1) 类型标识符:是指数组元素的数据类型,它可以是Java的基本类型和引用类型。(2) 数组名:是数组对象的引用变量名,这个名称应遵从Java标识符定义规则。(3) 数组的维数:数组的维数是用方括号“ ”的个数来确定的。对于一维数组来说,只需要一对方括号。例如:,int abc; /声明名为abc的一维整型数组double example2; /*声明名为example2 的双精度型一维数组*/,注意:声明一维数组时,系统只为数组对象的引用变量在内存的变量存储区中分配存储空间,但并未创建具体的数组对象,所以,这个变量的值为null。它们的内存分配情况如图所示。,图6.1 数组名的内存分配,6.1.2 创建一维数组对象,创建一维数组对象主要包括三个方面的工作:一是为数组对象在对象存储区中分配存储空间;二是对数组对象进行初始化;三是将新创建的数组对象与已声明的引用数组对象的变量(即数组名)关联起来。一维数组对象的创建可以通过直接指定数组元素初始值的方式完成,也可以用new操作符完成。,1直接指定初值的方式创建数组对象,用直接指定初值的方式创建数组对象是在声明一个数组的同时创建数组对象。具体做法是将数组元素的初值依次写入赋值号后的一对花括号内,各个元素值间用逗号分隔,给这个数组的所有元素赋上初始值;初始值的个数也就确定了数组的长度。例如:,int a1=23,9,38,8,65;,这条语句声明数组名为a1(a1也称为引用数组对象的变量名,本书称它为a1数组);数组元素的数据类型为整型(int,占4个字节),共有5个初始值,故数组元素的个数为5。这样一个语句为Java分配存储空间提供了所需要的全部信息,系统可为这个数组对象分配5*4=20个字节的连续存储空间。a1数组的值是a1关联的数组对象的首地址,如图所示。数组对象的元素由a1引用,经过初始化后,使a10=23,a11=-9,a12=38,a13=8,a14=65,如图所示。注意:Java中的数组元素下标从0开始。,图6.2 a1关联对象示意图,图6.3 a1数组的初始化,2用关键字new创建数组对象,用关键字new创建数组对象,并按照Java提供的数据成员默认初始化原则(见第4章)对数组元素赋初值。用关键字new来创建数组对象有两种方式。(1) 先声明数组,再创建数组对象。这实际上由两条语句构成,格式如下:类型标识符 数组名 ;数组名=new 类型标识符数组长度;,其中,第一条语句是数组的声明语句;第二条语句是创建数组对象,并初始化。应该注意的是:两条语句中的数组名、类型标识符必须一致。数组长度通常是整型常量,用以指明数组元素的个数。例如:int a ;a=new int9;定义a数组对象有9个元素,并按照Java提供的数据成员默认初始化原则进行初始化,如图所示。,图6.4 用new创建数组对象并初始化,(2) 在声明数组的同时用new关键字创建数组对象,并初始化。这种初始化实际上是将上面所述的两条语句合并为一条语句。其格式如下:,类型标识符 数组名 =new 类型标识符数组长度;,或,类型标识符 数组名=new 类型标识符数组长度;,例如:,int a=new int10;,6.1.3 一维数组的引用,当数组经过初始化后,就可通过数组名与下标来引用数组中的每一个元素。一维数组元素的引用格式如下:,数组名数组下标,其中,数组名是与数组对象关联的引用变量;数组下标是指元素在数组中的位置,数组下标的取值范围是0(数组长度1),下标值可以是整数型常量或整数型变量表达式。例如,在有了“int a=new int10;”声明语句后,下面的两条赋值语句是合法的:,a3=25;a3+6=90;,但,a10=8;,是错误的。这是因为Java为了保证安全性,要对引用时的数组元素进行下标是否越界的检查。这里的a数组在初始化时确定其长度为10,下标从0开始到9正好10个元素,因此,不存在下标为10的数组元素a10。,6.2 一维数组引用举例,一维数组是数组的最基本形式,其应用非常广泛,下面举例予以说明。,6.2.1 测定数组的长度,在Java语言中,数组也是一种对象。数组经初始化后就确定了它的长度(数组元素的个数),Java用一个数据成员length来保存数组的长度值。,【示例程序C6_1.java】 数组的声明、初始化和其长度的测定。,public class C6_1 public static void main(String arg) int i; double a1; /放在引用变量后面声明 char a2; /放在引用变量前面声明 a1=new double8; /创建a1数组,数组元素个数为8,类型为double型 a2=new char8; /创建a2数组,数组元素个数为8,类型为char型 int a3=new int8; /创建a3数组,数组元素个数为8,类型为int型 byte a4=new byte8; /创建a4数组,数组元素个数为8,类型为byte型 char a5=A,B,C,D,E,F,H,I; /创建a5数组,直接指定初值,/下面各句测定各数组的长度 System.out.println(“a1.length=”+a1.length); System.out.println(“a2.length=”+a2.length); System.out.println(“a3.length=”+a3.length); System.out.println(“a4.length=”+a4.length); System.out.println(“a5.length=”+a5.length); /以下各句引用数组中的每一个元素,为各元素赋值,for(i=0;i8;i+),a1i=100.0+i;,a3i=i;,a2i=(char)(i+97); /,显式强制类型转换,将整型数转换为字符型,/,下面各句打印各数组元素,System.out.println(“ta1ta2ta3ta4ta5”);,System.out.println(“tdoubletchartinttbytetchar”);,for(i=0;i8;i+),System.out.println(“t”+a1i+“t”+a2i+“t”+ a3i+“t”+a4i+“t”+a5i);,该程序的运行结果如下:,a1.length=8a2.length=8a3.length=8a4.length=8a5.length=8,6.2.2 数组下标的灵活使用,我们在本章开头提出的计算30名学生平均成绩问题的关键是一般的变量标识符中没有可变的东西,而数组作为一组变量的代表者其下标可以使用变量。实际上,我们在示例程序中已经用到了数组下标的这一特性。下面再通过几个例子来说明数组下标的灵活使用。,【示例程序C6_2.java】 用数组求解Fibonacci数列的前20项,即使用数组下标表达式求解数学上的迭代问题。,public class C6_2 public static void main(String args) int i; int f=new int20; /创建f数组,使其可存储20个整型数据 f0=1;f1=1; for(i=2;i20;i+) fi=fi-2+fi-1; /数组元素的下标使用循环变量 for(i=0;i20;i+) if(i%5=0)System.out.println(“n”);,System.out.print(“t”+fi);, ,该程序的运行结果如下:,在日常生活中,人们几乎每天都要进行“查找”。例如,在 号码簿中查找某单位或某人的 号码;在字典中查阅某个词的读音和含义等。查找的关键问题是如何快速地找到待查的内容。例如,查字典的关键是如何快速地确定待查之字在字典中的哪一页。对于浩如烟海的计算机中的数据,有相当多的数据是以数组的形式组织与存放的。以数组的形式组织和存放数据的数据结构被称为顺序表。对于顺序表的查找,人们已经发明了许多种算法,典型的有顺序查找和二分(折半、对分)查找。,顺序查找是将待查值与顺序表(数组)中的每个元素逐一比较,直至查找成功或到达数组的最后一个元素时还未找到。这种查找的效率相对较低。二分查找是在一个有序表(数据是按其值由小到大或由大到小依次存放的,这里我们以值由小到大排列为例)中,每次都将待查值与中间的那个元素比较,若相等则查找成功;否则,调整查找范围,若中间那个元素的值小于待查值,则在表的后一半中查找,若中间那个元素的值大于待查值,则在表的前一半中查找;如此循环,每次只与一半中的一个元素比较,可使查找效率大大提高。,【示例程序C6_3.java】 设数组中的数值是由小到大存放的,编写二分查找程序。,import .*;class FindSearch int binarySearch(int arr,int searchValue) int low=0; / low是第一个数组元素的下标 int high=arr.length-1;/ high是最后一个数组元素的下标 int mid=(low+high)/2;/ mid是中间那个数组元素的下标 while(low=high & arrmid!=searchValue), if( arrmidhigh) mid=-1; return mid; / mid是数组元素下标,若为-1,则表示不存在要查的元素 ,public class C6_3 public static void main(String args)throws IOException BufferedReader keyin=new BufferedReader(new ); int i,search,mid; String c1; int arr=2,4,7,18,25,34,56,68,89; (打印原始数据); for(i=0;iarr.length;i+) ( +arri); System.out.println(n); (请输入要查找的整数);,c1=(); search=Integer.parseInt(c1); /取出字符串转换为整型数赋给search FindSearch p1=new FindSearch(); mid=p1.binarySearch(arr,search); if(mid=-1) (“没找到!”); else (“所查整数在数组中的位置下标是:”+mid); ,该程序的运行结果如下:,打印原始数据 2 4 7 18 25 34 56 68 89请输入要查找的整数 68所查整数在数组中的位置下标是:7,这个程序的查找过程及其查找元素的位置(数组下标)的变化如图所示。在这个程序中,为了让读者能从键盘输入“整数”(这里对整数二字加引号是因为Java把键盘的任何输入都当成字符流来处理),使用了尚未学到的输入/输出流语句:,BufferedReader keyin=new BufferedReader(new );,图6.5 二分查找的比较与下标调整过程,关于输入/输出流的知识请参阅第14章“文件和流”,这里只简要说明如下:Java语言中的输入/输出有三种状态:标准输入状态、标准输出状态和标准错误状态。在Java内输入一个字符串需使用readLine()方法。要使用readLine()方法,必须在InputStreamReader内建立BufferedReader对象。InputStreamReader用来建立一个使用预设字符编码的InputStreamReader对象。)表示InputStreamReader对象是由建立的。BufferedReader用来建立一个固定内存大小的字符输入缓冲流。,6.2.3 数组名之间的赋值,Java语言允许两个类型相同但数组名不同(指向不同的对象)的数组相互赋值。赋值的结果是两个类型相同的数组名指向同一数组对象。,【示例程序C6_4.java】 编程实现两个数组名之间的赋值。,public class C6_4 public static void main(String arg) int i; int a1=2,5,8,25,36;,int a3=90,3,9; System.out.println(a1.length=+a1.length); System.out.println(a3.length=+a3.length); a3=a1; /赋值的结果是a3指向a1指向的数组,而a3先前指向的含有3个元素的/数组由于没有指向而消失 System.out.print(a1:); for(i=0;ia1.length;i+) ( +a1i); System.out.println(n); System.out.println(a3.length=+a3.length); System.out.print(a3:); for(i=0;ia3.length;i+),(“ ”+a3i); System.out.println(“n”); ,该程序的运行结果如下:,a1.length=5a3.length=3a1: 2 5 8 25 36a3.length=5a3: 2 5 8 25 36,6.2.4 向成员方法传递数组元素,向成员方法传递数组元素也就是用数组元素作为成员方法的实参。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此,数组元素可以作为成员方法的实参。若数组元素的数据是基本数据类型,则数组元素作为成员方法的实参与用变量作为实参一样,都是单向值传递,即只能由数组元素传递给形参,程序中对形参的任何修改并不改变数组元素的值。,【示例程序C6_5.java】 数组元素作为成员方法的实参(数据是基本数据类型),在成员方法中改变形参x和y的值,方法调用结束后实参数组元素的值没有改变。,class Ff int aa(int x, int y) /定义方法aa,有两个整型形参x和y int z;,x=x+4; y=y+2; z=x*y; return z;,public class C6_5 public static void main(String args), int arr=6,8,9; /声明并初始化数组arr int len=, k; Ff p1=new Ff(); k=p1.aa(arr0,arr1); /数组元素arr0和arr1作为方法aa的实参,System.out.println(“k=”+k);,for(int i=0;ilen;i+),System.out.print(“ ”+arri); /,循环输出数组元素的值,System.out.println(“n”);,该程序的运行结果如下:,k=1006 8 9,6.2.5 向成员方法传递数组名,在定义成员方法时可以用数组名作为它的形参,并指定它的数据类型。在这种情况下引用该成员方法时,必须用具有相同数据类型的数组名作为成员方法对应位置的实参,即向成员方法传递数组名。更应强调的是:数组名作为成员方法的实参时,是把实参数组对象的起始地址传递给形参数组名,即两个数组名共同引用同一对象。因此,在成员方法中对形参数组名指向的各元素值的修改,都会使实参数组名指向的各元素的值也发生同样的变化。这种参数的传递方式被称为“双向地址传递”。,【示例程序C6_6.java】 两个数组相加,将结果存入第二个数组中。class Add1Class, void add(int arA,int arB), int i;,int len=arA.length;,for(i=0;ilen;i+),arBi=arAi+arBi;,public class C6_6 public static void main(String args), int i; int arX=1,3,7,6; int arY=78,0,42,5; int len=; Add1 Class p1=new Add1Class(); ( arX的原始数据); /打印X数组 for(i=0;ilen;i+) ( +arXi); System.out.println(n arY的原始数据); /打印Y数组,for(i=0;ilen;i+),System.out.print( +arYi);,p1.add(arX,arY); / p1,引用对象的,add,方法计算两个数组之和,System.out.println(n,再次输出,arX); /,再次打印,X,数组,for(i=0;ilen;i+),System.out.print( +arXi);,System.out.println(n,再次输出,arY); /,再次打印,Y,数组,for(i=0;ilen;i+),System.out.print( +arYi);,System.out.println(n);,该程序的运行结果如下:,arX,的原始数据,1 3 7 6,arY,的原始数据,78 0 42 5,再次输出,arX,1 3 7 6,再次输出arY 79 3 49 11,从程序的执行结果可以看出,arY数组引用的对象的属性值在引用成员方法add前后是不同的。这是因为成员方法add中的形参arB数组与实参arY数组共同引用同一个对象的存储单元,因此,在成员方法add中对形参arB数组的各数组元素的修改,也就是对实参arY数组的各数组元素的修改。这一过程如图所示。在Java语言中,数组是一种对象,数组名是对象的引用变量,数组名作为成员方法的实参时,是把实参数组对象的起始地址连同它所占据的存储空间传递给形参数组名,使形参数组名与实参数组名共指向同一对象,实参数组的长度也就是形参数组的长度,因此,不论该实参数组的长度如何,只要其数据类型相同,都可以引用同一个成员方法。,图6.6 数组名用作实参的“双向地址传递”,【示例程序C6_7.java】 有s1和s2两个一维数组,s1数组中存放8名学生的成绩,s2数组中存放5名学生的成绩,分别求出这两组学生的平均成绩。,public class C6_7 static double average(double ascore) double aaver=0; for(int i=0;iascore.length;i+) aaver=aaver+ascorei; aaver=; return aaver; ,public static void main(String arg) double aver1,aver2; double s1=90,56,86.5,87,99,67.5,65,80; double s2=70,90,87,99,67; System.out.println(s1.length=+s1.length); aver1=average(s1);/数组名s1作为average成员方法的实参 System.out.println(aver1=+aver1); System.out.println(s2.length=+s2.length); aver2=average(s2); /数组名s2作为average成员方法的实参 System.out.println(aver2=+aver2); ,该程序的运行结果如下:,s1.length=8aver1=78.875s2.length=5aver2=82.6,在这个程序中,尽管两个数组对象的长度不同(分别为8和5),但其数据类型相同,因此,可以作为同一个成员方法(计算平均成绩)的实参。,6.2.6 数组元素排序,排序是把一组数据按照值的递增(由小到大,也称为升序)或递减(由大到小,也称为降序)的次序重新排列的过程,它是数据处理中极其常用的运算。利用数组的顺序存储特点,可方便地实现排序。排序算法有多种,这里只讨论较易理解的冒泡排序和选择排序两种,且要求排序结果为升序。,冒泡排序的关键点是从后向前对相邻的两个数组元素进行比较,若后面元素的值小于前面元素的值,则让这两个元素交换位置;否则,不进行交换。依次进行下去,第一趟排序可将数组中值最小的元素移至下标为0的位置。对于有n个元素的数组,循环执行n-1趟扫描便可完成排序。当然,也可以从前向后对相邻的两个数组元素进行比较,但此时是将大数向后移。与小者前移的冒泡法相对应,将这种大者后移的排序称为下沉法。图演示了有6个元素的数组实施冒泡法排序(小数前移)的前两趟比较与交换过程。可以看出,第一趟排序后最小数12已移到了下标为0的正确位置;第二趟排序后次小数17移到了下标为1的正确位置。,图6.7 用冒泡法对6个数据进行排序的两趟扫描中比较与交换的过程,【示例程序C6_8.java】 用冒泡法对8个数从小到大进行排序。,import ;import ;import ;class SortClass /类定义开始 void sort(int arr) /开始定义冒泡排序方法sort int i,k,temp;,int len=arr.length;,for(i=0;ii;k-),if( arrkarrk-1) temp=arrk-1; arrk-1=arrk; arrk=temp; /if块结束,同时使内循环for(k)和外循环for(i)结束 /sort方法结束 /类SortClass定义结束public class C6_8 public static void main(String args)throws IOException BufferedReader keyin=new BufferedReader(new );,int i; String c1; int arr=new int8; int len=; ( 请从键盘输入8个整数,一行只输入一个数 ); for(i=0;ilen;i+) c1=(); /用于读取一个字符串 arri=Integer.parseInt(c1); /将字符串类型c1转换成整数类型 /打印原始数据 (原始数据:);,for(i=0;ilen;i+) ( +arri); System.out.println(n); SortClass p1=new SortClass(); p1.sort(arr); /实参为数组名 (冒泡法排序的结果:);,for(i=0;ilen;i+),System.out.print( +arri);,System.out.println(n); ,该程序的运行结果如下:,请从键盘输入8个整数,一行只输入一个数234 (其余输入从略)原始数据: 2 34 0 9 -1 -6 45 23冒泡法排序的结果: -6 -1 0 2 9 23 34 45,冒泡法排序相对比较容易理解,但排序过程中元素的交换次数较多,特殊情况下每次比较都要进行交换。例如,若要将以降序排列的数据9、8、7、6、5、4排列成4、5、6、7、8、9,就需要每次进行交换。而选择法排序每执行一次外循环只进行一次数组元素的交换,可使交换的次数大大减少。选择法排序的基本思想是首先从待排序的n个数中找出最小的一个与arr10 对换;再将arr11到arr1n中的最小数与arr11对换,依此类推。每比较一轮,找出待排序数中最小的一个数进行交换,共进行n-1次交换便可完成排序。图演示了这一过程。,图6.8 选择法排序的交换过程,【示例程序C6_9.java】 选择法排序。,class SelectSort static void sort(int arr1) /成员方法的形参是数组 int i,j,k,t; int len=arr1.length; for(i=0;ilen-1;i+) /外循环开始 k=i; for(j=i+1;jlen;j+) if( arr1ji) t=arr1i; /在外循环实施交换,可减少交换次数 arr1i=arr1k; arr1k=t; / if(ki)结束 /外循环for(i)结束 /成员方法sort定义毕public class C6_9 extends SelectSort public static void main(String args) int arr=78,70,2,5,-98,7,10,-1; int len=;,SelectSort.sort(arr); /数组名作为成员方法的实参 (“选择法排序的结果:”); System.out.println(“length=”+);,for(int i=0;ilen;i+),System.out.print(“ ”+arri); /,数组,arr,的值已在方法调用中被改变了,System.out.println(“n”);,该程序的运行结果如下:,选择法排序的结果: -98 -1 2 5 7 10 70 78,6.2.7 对象数组,前面讨论的数组的数据类型都是简单的基本类型,即数组元素是简单数据类型。但实际问题中往往需要把不同类型的数据组合成一个有机的整体(对象),以便于引用。例如,一名学生的姓名、性别、年龄和各科学习成绩等都与这名学生紧密相关,而一个班(乃至更多)的学生又都具有这些属性,如表所示。这种数据结构在过去的结构化程序设计中被称为记录或结构体,而在面向对象的程序设计中把每一个学生看做一个对象。这样,一张学生成绩表就是由多个对象组成的。,表6.1 学生成绩表,如果一个类有若干个对象,我们可以把这一系列具有相同类型的对象用一个数组来存放。这种数组称为对象数组。数组名的值是第一个元素的首地址。每一个元素的值是引用对象的首地址。下面举例说明。,【示例程序C6_10.java】 设有若干名学生,每个学生有姓名、性别和成绩三个属性,要求将每个学生作为一个对象,建立获取对象名字的成员方法getName和获取对象性别的成员方法getSex,以及输出对象的全部数据成员的成员方法studPrint。,class Student private String name; private char sex; private double score;Student(String cname, char csex, double cscore) name=cname;sex=csex;score=cscore;String getName()return name;char getSex()return sex;,void studPrint() System.out.println(“Name: ”+name+“tSex: ”+sex+“tScore: ”+score);public class C6_10 public static void main(String args)String mname; char msex; int len; Student st1=new Student3; /声明对象数组,用new为每一个对象分配存储空间,st10=new Student(“li”,F,89); st11=new Student(“he”,M,90); st12=new Student(“zhang”,M,78); len=3;/对象数组元素的引用for(int i=0;ilen;i+) st1i.studPrint();mname=st11.getName(); msex=st11.getSex();System.out.println(“Name 1:”+mname+“tSex:”+msex);,该程序的运行结果如下:,Name: liSex: FScore: 89.0Name: heSex: MScore: 90.0Name: zhang Sex: M Score: 78.0Name 1:he Sex:M,st1对象数组是具有3个数组元素的数组,而每个元素的值都是一个引用变量,通过引用变量指向创建的对象,如图所示。对象数组st1的内存分配如图所示。数据成员name属于String对象的引用变量,详细介绍请看第7章。,图6.9 st1对象数组的示意图,图6.10 st1对象数组的内存分配,6.3 二 维 数 组,日常生活中处理的许多数据,从逻辑上看是由若干行、若干列组成的。例如,矩阵、行列式、二维表格等。图给出了一个简单的矩阵。为适应存放这样一类数据,人们设计出了一种如图所示的数据结构二维数组。,图6.11 矩阵,图6.12 二维数组,这里要注意的是:Java中只有一维数组,不存在称为“二维数组”的明确结构。然而对一个一维数组而言,其数组元素可以是数组,这就是概念上的二维数组在Java中的实现方法。也就是说,在Java语言中,把二维数组实际上看成是其每个数组元素是一个一维数组的一维数组。其实,这里面的最根本原因是计算机存储器的编址是一维的,即存储单元的编号从0开始一直连续编到最后一个最大的编号。因此,如果把图所示的矩阵用图所示的二维数组表示,则在计算机中的存放形式如图所示。在图中,每一行都被看成一个数组元素,三行的数组被看成只有三个数组元素,只不过这三个元素又是由三个元素组成的。,图6.13 二维数组在Java中的实现,6.3.1 二维数组的声明,声明二维数组与声明一维数组类似,也是为数组(引用数组对象的变量)命名、确定数组的维数和指定数组元素的数据类型。只不过声明二维数组时需要给出两对方括号,其格式如下:,类型说明符 数组名 ;,或,类型说明符 数组名;,例如,声明数组名为arr的二维整型数组:,int arr ;,或,int arr;,其中,类型说明符可以是Java的基本类型和引用类型;数组名是用户遵循标识符命名规则给出的一个标识符;两个方括号中,前面的方括号表示行,后面的方括号表示列。注意:声明二维数组时,系统只为二维数组对象的引用变量在内存的变量存储区中分配存储空间,但并未创建具体的数组对象,所以,这个变量的值为null。,6.3.2 创建二维数组对象,与创建一维数组一样,创建二维数组对象主要包括三个方面的工作:一是为数组对象在对象存储区中分配存储空间;二是对数组对象进行初始化;三是将新创建的数组对象与已声明的引用数组对象的变量(即数组名)关联起来。二维数组对象的创建同样可以通过直接指定数组元素初始值的方式完成,也可以用new操作符完成。,1用new操作符创建二维数组对象,用new操作符来创建数组对象,并根据Java提供的数据成员默认初始化原则,对数组元素赋初值。用new操作符创建数组对象有两种方式:(1) 先声明数组,再创建数组对象。在数组已经声明以后,可用下述两种格式中的任意一种来初始化二维数组。,数组名=new 类型说明符数组长度 ;,或,数组名=new 类型说明符数组长度数组长度;,其中,对数组名、类型说明符和数组长度的要求与一维数组一致。例如:,int arra ; /声明二维数组arra=new int34;/创建二维数组对象,初始化二维数组,上述两条语句声明并创建了一个3行4列的arra数组。也就是说arra数组有3个元素,而每一个元素又都是长度为4的一维数组,实际上共有12个元素。这里的语句:,arra=new int34;,实际上相当于下述4条语句:,arra=new int3;/创建一个有3个元素的数组,且每个元素也是一个数组arra0=new int4;/创建arra0元素的数组,它有4个元素arra1=new int4;/创建arra1元素的数组,它有4个元素arra2=new int4;/创建arra2元素的数组,它有4个元素,也等价于:,arra=new int3;for(int i=0;i3;i+) arrai=new int4;,也就是说,在初始化二维数组时也可以只指定数组的行数而不给出数组的列数,每一行的长度由二维数组引用时决定。但是,不能只指定列数而不指定行数。上述语句的作用如图所示。,图6.14 语句“arra=new int34;”的作用,(2) 在声明数组时创建数组对象。其格式如下:,类型说明符 数组名=new 类型说明符数组长度;,或,类型说明符 数组名 =new 类型说明符数组长度数组长度;,例如:,int arr=new int4 ;int arr =new int43;,但是,不指定行数而指定列数是错误的。例如,下面的初始化是错误的:,int arr=new int4;,2直接指定初值的方式创建二维数组对象,用直接指定初值的方式创建二维数组对象,是在数组声明的同时创建数组对象。将数组元素的初值依次写入赋值号后的一对花括号内的花括号内。例如:,int arr1=3,-9,6,8,0,1,11,9,8 ;,声明并创建了二维数组对象,arr1数组有3个元素,每个元素又都是有3个元素的一维数组。用指定初值的方式创建数组对象时,各子数组元素的个数可以不同。例如:int arr1=3,-9,8,0,1,10,11,9,8 ;,等价于:,int arr1=new int3;int arr10=3,-9;int arr11=8,0,1;int arr12=10,11,9,8;,6.4 二维数组的引用,由于二维数组是数组元素为一维数组的一维数组,因此,二维数组的引用与一维数组类似,只是要注意每一个行元素本身是一个一维数组。下面通过几个具体应用实例来说明。,6.4.1 测定数组的长度及数组赋值,与一维数组一样,也可以用.length成员方法测定二维数组的长度,即元素的个数。只不过使用“数组名.length”的形式测定的是数组的行数,而使用“数组名i.length”的形式测定的是该行的列数。例如,若有如下的初始化语句:,int arr1=3,-9,8,0,1,10,11,9,8 ;,则的返回值是3,表示arr1数组有3行或3个一维数组元素。而arr12.length的返回值是4,表示arr12的长度为4,即(第3个一维数组元素)有4个元素。,【示例程序C6_11.java】 在程序中测定数组的长度。,public class C6_11 public static void main(String arg) int i,j; int len1=new int2; int len2=new int2; int a1=1,4,8,9,3,2,2; int a2=90,3,9,12; System.out.println(a1.length=+a1.length);,for(i=0;i2;i+) len1i=a1i.length; /将a1数组的元素i的长度赋给len1i,System.out.println(a1.length=+len1i);,for(i=0;i2;i+), for(j=0;jlen1i;j+),( +a1ij); System.out.println(n); System.out.println(a2.length=+a2.length); for(i=0;i2;i+) len2i=a2i.length; /将a2数组的元素i的长度赋给len2i System.out.println(a2.length=+len2i); ,/打印a2数组对象的值 for(i=0;i2;i+) for(j=0;jlen2i;j+) ( +a2ij); System.out.println(n); a2=a1; /将a1数组赋给a2,说明a2指向a1指向的数组对象 System.out.println(a1.length=+a1.length); for(i=0;i2;i+) len1i=a1i.length; /将a1数组的元素i的长度赋给len1i System.out.println(a1.length=+len1i); ,/打印a1数组的对象的值 for(i=0;i2;i+) for(j=0;jlen1i;j+) ( +a1ij); System.out.println(n); System.out.println(a2.length=+a2.length); for(i=0;i2;i+) len2i=a2i.length; /将a2数组的元素i的长度赋给len2i System.out.println(a2.length=+len2i); ,/打印a2数组的对象的值 for(i=0;i2;i+) for(j=0;jlen2i;j+) ( +a2ij); System.out.println(n); System.out.println(n); ,该程序的运行结果如下:,6.4.2 数组名作为成员方法的参数 与一维数组类似,二维数组的数组名也可以作为参数传递给成员方法。下面通过两个实例说明这个问题。,【示例程序C6_12.java】 在矩阵(用二维数组表示)中查找最大数。,class Maxvalue int maxvl(int arr1),int i,k,max;,int len=arr1.length,len1;,max=arr100;,for(i=0;i=len-1;i+), len1=arr1i.length;,for(k=0;kmax) max=arr1ik; return max; public class C6_12 public static void main(String args) int maxx; int arr=1,3,7,6,78,0,42,5,-98,7,10,-1; Maxvalue p1=new Maxvalue();,maxx=p1.maxvl(arr); System.out.println(“max=”+maxx); ,该程序的运行结果如下:,max=78,【示例程序C6_13.java】 两个矩阵相加。,class AddClass void add(int arA,int arB,int arC
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!