JAVA语言与编程第6章数组、枚举及注解.ppt
《JAVA语言与编程第6章数组、枚举及注解.ppt》由会员分享,可在线阅读,更多相关《JAVA语言与编程第6章数组、枚举及注解.ppt(36页珍藏版)》请在三一办公上搜索。
1、第6章 数组、枚举及注解,6.1 一维数组,6.2 多维数组,6.3 访问数组,6.5 枚举,6.6 enum的构造方法,6.7 使用EnumMap,6.8 注解,6.9 内置注解,6.10 元注解,6.11 综合实例,6.4 数组实用类Arrays,6.1 一维数组,1一维数组的定义一维数组的定义格式有如下两种:方式1:;方式2:;其中:可以是Java中任意的数据类型,为用户自定义的一个合法的变量名,指明该变量是一个数组类型变量。Java在定义数组时并不为数组元素分配内存,仅为分配一个引用变量的空间。例如下面的语句:int a;String person;int b100;/错误,声明数组时
2、不能指定其长度2创建一维数组对象和创建其他Java对象一样,同样使用new关键字创建一维数组对象,格式为:数组名=new 元素类型 元素个数;例如下面的语句:int Array=new int100;/创建一个int型数组,存放100个int类型的数据,6.1 一维数组,Java虚拟机首先在堆区中为数组分配内存空间,如图6.1所示,创建了一个包含100个元素的int型数组,数组成员都是int类型,占4个字节,因此整个数组对象在堆区中占用400个字节。之后,就要给每个数组成员赋予其数据类型的默认值,int型的默认值是0。,图6.1 一维数组的内存布局,6.1 一维数组,3.一维数组初始化定义数组
3、的同时也可对数组元素进行显式初始化,有动态初始化和静态初始化。静态初始化指的是在定义数组的同时就为数组元素分配空间并赋值,它的格式如下:=,;或者=,;Java编译程序会自动根据个数算出整个数组的长度,并分配相应的空间,例如下面的语句:int Array=1,2,3,4;,6.1 一维数组,数组成员是引用类型的也可静态初始化,如图6.2所示。Point pa=new Point(1,4),new Point(3,9),new Point(15,18);class Point int x,y;Point(int a,int b)x=a;y=b;,图6.2 引用类型数组的内存布局,6.1 一维数组
4、,动态初始化指的是数组定义与为数组分配空间和赋值的操作分开进行,例如下面的语句:int a=new int3;a0=1;a1=5;a2=9;同样,数组成员是引用类型的也可动态初始化,例如下面的语句:Point pa=new Point3;pa0=new Point(1,4);pa1=new Point(3,9);pa2=new Point(15,18);/或采用匿名数组写法/Point pa=new Point(1,4),new Point(3,9),new Point(15,18);class Point int x,y;Point(int a,int b)x=a;y=b;,6.1 一维数组
5、,【例6.1】输入一组非0整数到一维数组中,设计一个Java程序,求出这一组数的平均值,并分别统计出这一组数中正数和负数的个数。TestAverage.javapackage org.arrays;public class TestAverage public static void main(String args)int i=args.length;/获取命令行参数的长度int arr=new int10;int num=0;int k=0;int p=0;for(int j=0;ji;j+)arrj=Integer.parseInt(argsj);if(arrj 0)k+;/负数的个数加
6、一elsep+;/正数的个数加一num=num+arrj;/计算累加和(正数的个数+p);(负数的个数+k);(平均值是+num/i);/计算平均值,6.1 一维数组,右击“TestAverage.java”,选择“Run As”“Run Configurations”,如图6.3所示,选择Main标签页,在“Project”栏中选择“MyProject_06”,在“Main class”栏中选择“Recurrence”,选择“Arguments”标签页,在“Program argumentds”栏中输入“3 8 4-5 6 7 8-4 11 12”,然后单击“Run”按钮,运行程序。程序运行
7、结果:正数的个数8负数的个数2平均值是5,图6.3 计算平均值,6.2 多维数组,如前所述,在Java语言中,多维数组实际上是数组的数组。一个二维数组可以看成是一维数组,其中的每个成员又是一维数组。1二维数组的定义二维数组的定义格式如下:格式1:;格式2:;与一维数组的情形相类似,定义二维数组时不需要给出数组大小。int a;String names;int b100100;/错误,声明数组时不能指定其长度2创建二维数组对象和创建一维数组一样,创建二维数组同样使用new关键字,格式如下:数组名=new 数组元素类型 数组元素个数 数组元素个数;例如下面的语句:int a=new int2 3;
8、/创建一个int型的二维数组,6.2 多维数组,和一维数组一样,若没有对二维数组成员进行显式初始化,则会进行隐式初始化,会根据创建的数组类型初始化对象,内存布局如图6.4所示。,图6.4 二维数组的内存布局,6.2 多维数组,3.二维数组初始化和一维数组一样,定义二维数组的同时也可对数组成员进行显式初始化,有动态初始化和静态初始化。在下面的语句中,定义String类型数组alphabet的同时初始化数组成员,即静态初始化。String alphabet=a,b,c,d,e,f,g,h,i,j,k,l;注意:无论是初始化一维数组还是二维数组,都不能指定其长度。例如下面的语句:String43 a
9、lphabet=a,b,c,d,e,f,g,h,i,j,k,l;/错误二维数组的第二维的长度可以各不相同,例如下面的语句:String alphabet=a,b,c,d,e,f,g,h,i,j,k;,6.2 多维数组,和一维数组一样,二维数组成员是引用类型的,也可静态初始化。下面的代码片段创建的引用类型的二维数组的内存布局如图6.5所示。Point pt=new Point(1,2),new Point(3,4),new Point(5,6),new Point(7,8),new Point(9,10),new Point(11,12);class Point int x,y;Point(in
10、t a,int b)x=a;y=b;,图6.5 二维数组引用类型的内存布局,6.2 多维数组,二维数组的动态初始化有两种方式:方式1:=new;例如:int arr=new int35;方式2:从高维向低维依次进行空间分配,此时分配的数组空间可以是任意的形状。(1)由于二维数组首先是一个一维数组,故先对该一维数组进行空间分配,也就是说,先对最高维进行空间分配。=new;例如:int c=new int3;(2)每一个元素又是一个一维数组,故对每一个元素再用new语句进行空间分配,格式与一维数组相同。例如下面的语句:c0=new int4;c1=new int3;c2=new int5;,6.2
11、 多维数组,(3)若最终元素是引用类型,则还需对每一个最终元素进行对象的空间分配。例如下面的语句:Point p;/定义一个二维数组的引用变量p=new Point3;/先作为一维数组,进行最高维空间的分配p0=new Point2;/每一个元素又是一个一维数组,再进行一维数组空间分配p1=new Point1;p2=new Point2;p00=new Point(1,1);p01=new Point(2,2);/最后对每一个元素进行Point对象空间的分配p10=new Point(3,3);p20=new Point(4,4);p21=new Point(5,5);class Point
12、 int x,y;Point(int a,int b)x=a;y=b;【例6.2】设计一个Java程序,从低到高将从命令行中读取的一组数字进行升序排列。,6.2 多维数组,右击“NumSort.java”,选择“Run As”“Run Configurations”,如图6.6所示,选择Main标签页,在“Project”栏中选择“MyProject_06”,在“Main class”栏中选择“NumSort”,选择“Arguments”标签页,在“Program argumentds”栏中输入“12 5 78 45 17 6 8 13 32 14”,然后单击“Run”按钮,运行程序。,图6.
13、6 对数值按从小到大排序,6.3 访问数组,数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素的索引为0,第二个元素的索引为1,依次类推。数组的length属性表示数组的长度,它的声明形式如下:public final int length;length属性被public和final修饰,因此在程序中可以读取数组的长度,但不能修改数组的长度。【例6.3】求出4阶矩阵的最大元素以及其所在的行号和列号。【例6.4】将一个3 4阶矩阵转置。矩阵转置就是将一个矩阵的行、列互换。,6.4 数组实用类:Arrays,6.4.1 复制数组类提供了一个很有用的静态方法arraycopy()用来复制
14、数组,其语法格式如下:static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)功能:从指定源数组中复制一个数组,复制从指定的位置开始,复制到目标数组的指定位置。从 src引用的源数组到dest引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的数量等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。【例6.5】使用arraycopy()方法把数组的内容复制到另
15、一个数组。,6.4.2 数组排序,使用内置的排序方法,就可以对任意基本类型数组排序,也可以对任意的对象数组进行排序,只要该对象实现了Comparable接口或具有相关联的Comparator。当然,可以对数组按指定的排序方法进行排序。【例6.6】随机生成10个整数值,并使用内置的排序方法对数组排序。,6.4.3 数组元素的查找,如果数组已经排好序了,就可以使用Array.binarySearch()执行快速查找。【例6.7】对无序的10个整数值进行排序,再用二叉查找法进行检索。,6.5 枚举,JDK5.0引入了一个新的关键字enum表示枚举类型。定义一个枚举类型很简单,下面是一个枚举类型的示例
16、。public enum Season SPRING,SUMMER,AUTUMN,WINTER;上面创建了一个名为Season的枚举类型,它具有4个成员。由于枚举类型的实例是常量,因此按照命名习惯它们都用大写字母表示。为了使用enum,需要创建一个该类型的引用,将其赋值给某个实例。例如下面的语句:Season season=Season.SUMMER;在创建一个enum的实例后,编译器会自动创建一些有用的方法。ordinal()方法用来表示某个特定enum常量的声明顺序,values()方法用来按照enum常量的声明顺序,产生由这些常量值构成的数组。例如下面的代码:for(Season sea
17、son:Season.values()System.out.println(season+,ordinal+season.ordinal();输出:SPRING,ordinal 0SUMMER,ordinal 1AUTUMN,ordinal 2WINTER,ordinal 3,6.5 枚举,定义枚举类型本质上就是在定义一个final类型的class,该类从类继承。这些工作由编译器来完成,所以enum象类一样可以具有自己的成员方法、数据成员、自己的构造方法、自己的初始化代码块,以及内部类。【例6.8】用enum模拟交通信号灯。,6.6 enum的构造方法,使用enum定义枚举类型时,实质上定义出
18、来的类继承自 类,而每个枚举的成员其实就是定义的枚举类型的一个实例。在定义一个枚举类型时,像定义类一样,可以定义枚举类型的构造方法,这样在定义枚举类型的成员变量时,利用构造方法进行初始化。在定义枚举类型时,必须将枚举常量定义在最前面,并以分号“;”与其他成员隔开。若enum是public类型,且在类外部定义,则文件名必须与enum名字相同,且文件中不能再定义其他public类型的类。注意:enum的构造方法必须是private,否则出错。【例6.9】在enum中定义enum的构造方法和普通方法。,6.7 使用EnumMap,EnumMap是一种特殊的Map,它要求所有的键(Key)都必须来自同
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 语言 编程 数组 枚举 注解
链接地址:https://www.31ppt.com/p-6510152.html