讲义第04章数组与方法_第1页
讲义第04章数组与方法_第2页
讲义第04章数组与方法_第3页
讲义第04章数组与方法_第4页
讲义第04章数组与方法_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章数组与方法教学目标n 掌握数组的定义及使用方法n 掌握数组的传递n 掌握方法及方法的重载n 掌握使用方法接收和返回一个数组n 掌握Java对数组的操作支持© 2006, ZTE Corporation.s.数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、数组。比如一个班的36名同学的Java成绩、一个公司300名职员的工资、显示在屏幕上的一串50个字符。© 2006, ZTE Corporation.s.数组的优点:Ø 不使用数组定义100个整型变量:inti1;int i2;inti100;。Ø

2、使用数组定义:inti100 。© 2006, ZTE Corporation.s.4.1.1 一维数组的定义及使用一维数组可以存放上千万个数据,并且这些数据的 类型是完全相同的。要使用Java的数组,必须经过两个步骤:(1)数组(2) 分配内存给该数组。这两个步骤的语法如下:形式一:一维数组:数据类型 数组名 = null ;u分配内存给数组:数组名 =new数据类型长度 ;形式二:一维数组:数据类型 数组名= null ;u© 2006, ZTE Corporation.s.Ø 数组的格式里,“数据类型”是数组元素的数据类型,常见的类型有整型、浮点型与字等。&

3、#216; “数组名”是用这组相同数据类型的元素的名称,其命名规则和变量的相同,建议同学们使用有意义的名称为数组命名。Ø 数组后实际上是在栈内存中保存了此数组的名称,接下来便是要在堆内存中配置数组所需的内存,其中“长度”是告诉编译器,所的数组要存放多少个元素,而“new”则是命令编译器根据括号里的长度开辟空间。© 2006, ZTE Corporation.s.及开辟数组空间数组:nintscore = null ;à null表示数据类型的默认值n 为数组开辟空间:score = newint3;© 2006, ZTE Corporation.s.数组

4、的同时分配内存空间数据类型 数组名 = new 数据类型个数intØscore = new int10 ;一个元素个数为10的整型数组score,同时开辟一块内存空间供其使用。Ø 在Java中,由于整数数据类型所占用的空间为4个bytes,而整型数组score可保存的元素有10个,所以上例中占用的内存共有4 * 10 = 40个字节。© 2006, ZTE Corporation.s.数组中元素的表示方法数组里的元素,可以利用下标来完成。Java想要的数组下标编号由0开始,以一个的score10的整形数组为例,score0代表第1个元素,score1代表第2 个元

5、素,score9为数组中第10个元素(也就是最后一个元素) 。© 2006, ZTE Corporation.s.【例4.1】数组的及输出。public class ArrayDemo01 public static void main(String args) int score = null; score = new int3;/数组,但未开辟堆内存空间/ 为数组开辟堆内存空间System.out.println("score0 = " + score0); /分别输出每个元素System.out.println("score1 = " +

6、 score1); /分别输出每个元素System.out.println("score2 = " + score2); /分别输出每个元素for (int x = 0; x < 3; x+) / 使用循环依次输出数组中的全部内容System.out.println("score"+x+" = " + scorex) ;© 2006, ZTE Corporation.s.注意可以发现,对于数组的采用“数组名称下标”的方式,之前一共开辟了三个空间大小的数组,所以下标的取值是02,假设程序中取出的内容超过了这个下标,如“s

7、core3”, 则程序运行的时候会出现以下的错误提示:java.lang.ArrayIndexOutOfBoundsException: 3© 2006, ZTE Corporation.s.【例4.2】为数组中的元素赋值并进行输出。public class ArrayDemo02 public static void main(String args) int score = null; score = new int3;/数组,但未开辟堆内存空间/ 为数组开辟堆内存空间for (int x = 0; x < 3; x+) scorex = x * 2 + 1 ;for (i

8、nt x = 0; x < 3; x+) / 为数组中的每个元素赋值/ 为每一个元素赋值/ 使用循环依次输出数组中的全部内容System.out.println("score"+x+" = " + scorex) ;© 2006, ZTE Corporation.s.代码及内存分析© 2006, ZTE Corporation.s.© 2006, ZTE Corporation.s.© 2006, ZTE Corporation.s.堆栈内存的解释数组操作中,在栈内存中保存的永远是数组的名称,只开辟了栈内存空

9、间数组是永远无法使用的,必须有指向的堆内存才可以使用,要想开辟新的堆内存则必须使用new关键字,之后只是将此堆内存的使用权交给了对应的栈内存空间,而且一个堆内存空间可以同时被多个栈内存空间指向,即:一个人可以有多个名字,人就相当于堆内存,名字就相当于栈内存。© 2006, ZTE Corporation.s.【例4.3】数组的传递(详见4.3)。public class ArrayDemo03 public static void main(String args) intscore01 = null;score01 = new int3;intscore02 = score01;f

10、or (int x = 0; x < 3; x+)/ 为数组中的每个元素赋值score02x = x * 2 + 1 ;/ 为每一个元素赋值for (int x = 0; x < 3; x+) / 使用循环依次输出数组中的全部内容System.out.println("score01"+x+" = " + score01x) ;© 2006, ZTE Corporation.s.取得数组长度要特别注意的是,在Java中取得数组的长度(也就是数组元素的长度)可以利用“数组名称.length”完成,如下面的格式:数组名称.length&

11、#224; 返回一个int型数据【例4.4】 输出数组长度public class ArrayDemo04public static void main(String args)intscore = new int3;System.out.println("数组长度为 " + score.length);© 2006, ZTE Corporation.s.数组的静态初始化n 数组的内容分为动态初始化和静态初始化两种,之前所讲解的全部代码读者可以发现是采用先数组之后为数组中的每个内容赋值的方式完成的。那么也可以通过数组静态初始化在数组容。指定其具体内n 如果想直接在

12、给数组赋,可以利用大括号完成。只要在数组的值即可,如下面的格式:数据类型 数组名 = 格式后面再加上的赋0 ,1 , ,n© 2006, ZTE Corporation.s.【例4.5】数组的静态初始化。publicclassArrayDemo05 public static void main(String args) intscore = 91,92,93,94,95,96;for (int x = 0; x < score.length; x+) System.out.println("score"+x+" = " + scorex

13、) ;© 2006, ZTE Corporation.s.【例4.6】数组应用范例 求出数组中的最大和最小值。public class ArrayDemo06 public static void main(String args) int int intscore = 67,89,87,69,90,100,75,90;max = 0 ;min = 0 ;/ 静态初始化数组/ 定义变量保存最大值/ 定义变量保存最小值max = min = score0 ;/ 把第一个元素的内容赋值给max和minfor (int x = 0; x < score.length; x+) / 循

14、环求出最大和最小后续元素是否比max大/ 如果大,则修改max内容if(scorex>max)/ 依次max = scorex ;if(scorex<min)min = scorex ;/ 依次后续的元素是否比min小/ 如果小,则修改min内容System.out.println("最高成绩:" + max); System.out.println("最低成绩:" + min);/ 输出最大值/ 输出最小值© 2006, ZTE Corporation.s.© 2006, ZTE Corporation.s.【例4.7】

15、对整型数组按照由小到大的顺序进行排列。public class ArrayDemo07 public static void main(String args) int score = 67, 89, 87, 69, 90, 100, 75, 90 ;for (int i = 0; i < score.length-1; i+) for (int j = 0; j < score.length-1-i; j+) /数组/ 循环if (scorej > scorej+1) / 交换位置int temp = scorej; scorej = scorej+1; scorej+1

16、= temp;System.out.println("该数组从小到大排序为:"); for (int i = 0; i < score.length; i+) System.out.print(scorei + "t");System.out.print("n");/ 数组输出© 2006, ZTE Corporation.s.【例4.8】修改例4.7,显示每次的排序结果。public class ArrayDemo08 public static void main(String args) int score =

17、67, 89, 87, 69, 90, 100, 75, 90 ;/数组for (inti = 0; i < score.length-1; i+) booleanflag = true;for (int j = 0; j < score.length-1-i; j+) if (scorej > scorej+1) int temp = scorej; scorej = scorej+1; scorej+1 = temp;flag = false;/ 循环/ 交换位置System.out.print("第"+(i+1)+"次排序结果:"

18、); for (int j = 0; j < score.length; j+) System.out.print(scorej + "t");System.out.print("n");if(flag)break;System.out.print("最终的排序结果:"); for (int i = 0; i < score.length; i+) System.out.print(scorei + "t");/ 数组输出© 2006, ZTE Corporation.s.如果说可以把一维数组

19、当成几何中的线性图形,那么二维数组就相当于是一个表格。二维数组的一维数组类似,内存的分配也一样是用与分配内存的格式如下所示:new这个关键字。其(1) 动态初始化:Ø 数据类型 数组名 ;Ø 数组名 = new 数据类型行的个数列的个数 ;(2) 动态初始化:数据类型 数组名 = new 数据类型行的个数列的个数 ;© 2006, ZTE Corporation.s.二维数组的整型数组score,同时为其开辟一块内存空间Ø int score = new int43 ;Ø 整型数据score可保存的元素有4*3 = 12个,而在Java 中,i

20、nt数据类型所占用的空间为4个字节,因此该整型数组占用的内存共为4*12 = 48个字节© 2006, ZTE Corporation.s.【例4.9】二维数组的定义及使用。public class ArrayDemo09 public static void main(String args) int score = new int43; score01 = 30 ;score10 = 31 ;score22 = 32 ;score31 = 33 ;score11 = 30 ;/并实例化二维数组/ 为数组中的部分内容赋值/ 为数组中的部分内容赋值/ 为数组中的部分内容赋值/ 为数组

21、中的部分内容赋值/ 为数组中的部分内容赋值for (int i = 0; i < score.length; i+) / 外层循环行for(int j=0;j<scorei.length;j+)/ 内层循环列System.out.print(scoreij + "t");System.out.println("") ;/ 换行© 2006, ZTE Corporation.s.二维数组静态初始化Ø 格式:数据类型 数组名 = 第0行,第1行,第n行 ;二维数组:score = 67, 61 , 78, 89, 83 , 9

22、9, 100, 98, 66, 95 ;Øint© 2006, ZTE Corporation.s.【例4.10】使用静态初始化public class ArrayDemo10 一个二维数组。public static void main(String args) / 静态初始化一个二维数组,每行的数组元素个数不一样int score = 67, 61 , 78, 89, 83 , 99, 100, 98, 66, 95 ;for (int i = 0; i < score.length; i+) / 外层循环输出行for (int j = 0; j < sco

23、rei.length; j+) System.out.print(scoreij + "t");System.out.println("");/ 内存循环输出列/ 输出每一个元素/ 换行© 2006, ZTE Corporation.s.方法就是一段可重复调用的代码段,某段长度约100行的代码,要在多例个地方使用此段代码,如果在各个地方都重复编写此部分代码的话,则肯定会比较麻烦,而且此部分代码如果修改的话也比较,所以此时可以将此部分代码定义成一个方法,以供程序反复调用。© 2006, ZTE Corporation.s.方法的定义方法

24、的定义格式:Ø public static 返回值类型 方法名称(类型 参数1,类型 参数2,) 程序语句 ;方法的主体return 表达式 ;Ø 在本节中定义的方法,因为其可以直接使用主方法(main()调用处加上了public static两个关键字。,所以将方法© 2006, ZTE Corporation.s.【例4.11】定义一个方法,在主方法中进行调用。public class MethodDemo01 public static void main(String args) printInfo() ; printInfo() ; printInfo(

25、) ;/ 调用printInfo()方法/ 调用printInfo()方法/ 调用printInfo()方法System.out.println("Hello World!") ;/ 此处由于此方法是由main方法直接调用所以一定要加上public staticpublic static void printInfo() / 此处方法没有返回值char c = 'H','e','l','l','o',',','L','X','H'/

26、 定义一个字符数组for (int x = 0; x < c.length; x+) System.out.print(cx) ;System.out.println("");/ 循环输出/ 换行© 2006, ZTE Corporation.s. printInfo()方法执行流程图当调用printInfo()方法的时候,程序就会跳转到printInfo()方法中执行,当printInfo()方法全部之后就会返回调用处向下继续执行。© 2006, ZTE Corporation.s.注意:方法命名规范要求在之前定义类的时候,曾跟同学们提起过类名规

27、范:“全部单词的首字母必须大写”。那么在定义方法的时候也是有命名规范要求的:“第一个单词的首字母小写,之后每个单词的首字母大写”,那么这就是方法名规范,之前的printInfo()方法也是按此规范定义的。这一点希望读者在日后的开发中一定要养成好的习惯。© 2006, ZTE Corporation.s.【例4.12】有返回值的方法。public class MethodDemo02 public static void main(String args) int one = addOne(10, 20);/ 调用整数的加法操作float two = addTwo(10.3f, 13.

28、3f);/ 调用浮点数的加法操作System.out.println("addOne的计算结果:" + one) ; System.out.println("addTwo的计算结果:" + two) ;/ 定义方法,完成两个整数的加法操作,方法返回一个int型数据public static int addOne(int x, int y) int temp = 0;/ temp为局部变量,只在此方法中有效temp = x + y; return temp;/ 执行加法计算/ 返回计算结果/ 定义方法,完成两个浮点数的加法操作,方法返回一个float型数据

29、public static float addTwo(float x, float y) float temp = 0;/ temp为局部变量,只在此方法中有效temp = x + y;return temp;/ 执行加法计算/ 返回计算结果© 2006, ZTE Corporation.s.方法的重载方法的重载就是方法名称相同,但参数的类型或参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。© 2006, ZTE Corporation.s.【例4.13】验证方法的重载。public class MethodDemo03 public static v

30、oid main(String args) intintone = add(10, 20);two = add(10, 20, 30);/ 调用有两个参数的整型加法/ 调用有三个参数的整型加法/ 调用有两个参数的浮点型加法floatthree = add(10.3f, 13.3f);System.out.println("add(int x, int y)的计算结果:" + one) ; System.out.println("add(int x, int y, int z)的计算结果:" + two); System.out.println("

31、;add(float x, float y)的计算结果:" + three);public static int add(int x, int y) / 定义add方法,完成两个整数相加/ 定义局部变量/ 执行加法计算/ 返回计算结果inttemp = 0;temp = x + y;return temp;public static int add(int x, int y, int z) / 定义add方法,完成三个整数相加/ 定义局部变量/ 执行加法操作/ 返回计算结果inttemp = 0;temp = x + y + z;returntemp;public static fl

32、oat add(float x, float y) / 定义add方法,完成两个浮点数相加float temp = 0; temp = x + y; return temp;/ 定义局部变量/ 执行加法操作/ 返回计算结果© 2006, ZTE Corporation.s.方法重载的调用可以发现add()方法被重载了三次,从而且每次重载时的参数类型或个数都有不同,所以在调用的时候,会根据参数的类型和个数自动进行区分。© 2006, ZTE Corporation.s.提示:System.out.println()方法也属于重载方法对于屏幕打印语句:System.out.pr

33、intln()方法来说可以打印任何的数据:Ø System.out.println(3);Ø System.out.println(33.3);Ø System.out.println('3');Ø System.out.println(true);Ø System.out.println(3 + 3);/ 输出整数/ 输出浮点数/ 输出字符/ 输出型/ 输出计算结果© 2006, ZTE Corporation.s.重载的注意事项方法的重载一定只是在参数上的类型或个数不同,而下面的代码根本不叫方法重载:public

34、static float add(int x, int y) / 返回float型,但参数类型及个数一致float temp = 0; temp = x + y; return temp;public static int add(int x, int y) / 返回int型,但参数类型及个数一致int temp = 0; temp = x + y; return temp;© 2006, ZTE Corporation.s.使用return结束一个方法【例4.14】在java的方法定义中,可以使用return语句直接结束方法,如下所示。public class MethodDemo

35、04 public static void main(String args) System.out.println("1、调用fun()方法之前。") ;fun(10) ;/ 调用fun()方法System.out.println("2、调用fun()方法之后。") ;public static void fun(int x) System.out.println("3、进入fun()方法。") ; if(x=10)return ;/ 结束方法,返回被调用处System.out.println("4、正常fun()方法。&

36、quot;) ;© 2006, ZTE Corporation.s.方法的递归调用递归调用是一种特殊的调用形式,是方法自己调用。© 2006, ZTE Corporation.s.【例4.15】递归调用 数字的累加操作 。public class MethodDemo05 public static void main(String args) System.out.println("计算结果:" + sum(100); / 调用操作public static int sum(int num) / 定义方法用于求和操作if (num = 1) retur

37、n 1;else /是否是加到了最后一个数return num + sum(num - 1);/ 递归调用© 2006, ZTE Corporation.s.注意:尽量避免使用递归调用。递归调用在操作时如果处理不好,则有可能出现内存的溢出,所以对于这种方法调用形式使用时要谨慎。© 2006, ZTE Corporation.s.操作传递和返回的可以是基本数据类型,但是方法中也可用来传递和返回数组。如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组。而且数组属于数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果的。保存下来

38、9; 2006, ZTE Corporation.s.【例4.16】向方法中传递数组。public class MethodDemo06 public static void main(String args) int temp = 1, 3, 5 ; fun(temp);/ 使用静态初始化定义数组/ 传递数组for (int i = 0; i < temp.length; i+) System.out.print(tempi + "、");/ 循环输出public static void fun(int x) / 接收整型数组x0 = 6;/ 修改第一个元素的内容&

39、#169; 2006, ZTE Corporation.s.内存状态© 2006, ZTE Corporation.s.使用方法返回一个数组既然方法可以接收一个数组,那么方法也就可以返回一个数组,则此时,只需要在返回值类型类型即可。处明确的写出返回的数组© 2006, ZTE Corporation.s.【例4.17】向方法中传递数组。public class MethodDemo07 public static void main(String args) int temp = fun();print(temp);/ 通过方法实例化数组/ 向print()方法中传递数组p

40、ublic static void print(int x) / 接收数组for (int i = 0; i < x.length; i+) / 循环输出System.out.print(xi + "、");public static int fun() / 此方法返回一个数组int ss = 1, 3, 5, 7, 9 ; / 定义一个数组return ss;/ 返回数组© 2006, ZTE Corporation.s.【例4.18】调用方法进行数组排序。public class MethodDemo08 public static void main(

41、String args) int score = 67, 89, 87, 69, 90, 100, 75, 90 ;/ 定义整型数组int age = 31, 30, 18, 17, 8, 9, 1, 39 ;sort(score);print(score);/ 定义整型数组/ 数组排序/ 数组打印");System.out.println("n sort(age);print(age);/ 数组排序/ 数组打印public static void sort(int temp) for (int i = 0; i < temp.length-1; i+) for (i

42、nt j = 0; j < temp.length-1-i; j+) if (tempj > tempj+1) int x = tempj; tempj = tempj+1; tempj+1 = x;public static void print(int temp ) for (int i = 0; i < temp.length; i+) System.out.print(tempi + "t");/ 数组排序/ 循环/ 交换位置/ 输出数组内容© 2006, ZTE Corporation.s.传递© 2006, ZTE Corp

43、oration.s.【例4.19】使用Java类库完成数组的排序操作。public class MethodDemo09 public static void main(String args) intscore = 67, 89, 87, 69, 90, 100, 75, 90 ;/ 定义整型数组int age = 31, 30, 18, 17, 8, 9, 1, 39 ;/ 定义整型数组java.util.Arrays.sort(score); print(score); System.out.println("n/ 使用JAVA提供的排序操作/ 输出数组");java

44、.util.Arrays.sort(age); print(age);/ 使用JAVA提供的排序操作public static void print(int temp) / 数组输出for (int i = 0; i < temp.length; i+) System.out.print(tempi + "t");© 2006, ZTE Corporation.s.范例:数组拷贝给定两个数组,可以将其中一个数组的指置的内容拷贝另外一个数组。如果要想完成以上的要求,则可以使用方法,在方法中接收五个参数:“源数组名称、源数组开始点、目标数组名称、目标数组开始点、

45、拷贝长度”,则按照以上的思路完成代码。© 2006, ZTE Corporation.s.【例4.20】数组拷贝。public class MethodDemo10 public static void main(String args) int i1 = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;int i2 = 11, 22, 33, 44, 55, 66, 77, 88, 99 ;copy(i1, 3, i2, 1, 3);/ 源数组/ 目标数组/ 调用拷贝方法print(i2);/ 输出数组/ 参数含义:源数组名称、源数组开始点、目标数组名称、目标数组开始点、拷贝

46、长度public static void copy(int s, int s1, int o, int s2, int len) for (int i = 0; i < len; i+) os2 + i = ss1 + i ;/ 修改目标数组内容public static void print(int temp) / 数组输出for (int i = 0; i < temp.length; i+) System.out.print(tempi + "t");© 2006, ZTE Corporation.s.【例4.21】使用Java类库完成数组的拷贝

47、操作。public class MethodDemo11 public static void main(String args) int i1 = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;/ 源数组int i2 = 11, 22, 33, 44, 55, 66, 77, 88, 99 ;/ 目标数组System.arraycopy(i1, 3, i2, 1, 3);/ JAVA对数组拷贝的支持print(i2);/ 输出数组public static void print(int temp) for (int i = 0; i < temp.length; i+) / 数

48、组输出System.out.print(tempi + "t");© 2006, ZTE Corporation.s.4.4.1 可变参数在调用一个方法的时候,必须根据方法的定义传递指定的参数,但是在JDK 1.5(JAVA SE 5.0)之后产生了 新的概念 可变参数,即:方法中可以接收的参数不再是固定的,而是随着需要传递的,可变参数的定 义格式如下:返回值类型 方法名称(类型参数名称) 向方法中传递可变参数之后,其中的参数是以数组的 形式保存下来的。© 2006, ZTE Corporation.s.【例4.22】使用可变参数定义方法。public class MethodDemo12 public static void main(String args) System.out.print("不传递参数( fun() ):");fun();/ 不传递参数System.out.print(&qu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论