JAVA语言与编程第6章数组枚举及注解

上传人:沈*** 文档编号:171436496 上传时间:2022-11-26 格式:PPT 页数:36 大小:255.50KB
返回 下载 相关 举报
JAVA语言与编程第6章数组枚举及注解_第1页
第1页 / 共36页
JAVA语言与编程第6章数组枚举及注解_第2页
第2页 / 共36页
JAVA语言与编程第6章数组枚举及注解_第3页
第3页 / 共36页
点击查看更多>>
资源描述
Java实用教程(第3版)第第6章章 数组、枚举及注解数组、枚举及注解T6.1 一维数组一维数组T6.2 多维数组多维数组T6.3 访问数组访问数组T6.5 枚举枚举T6.6 enum的构造方法的构造方法T6.7 使用使用EnumMapT6.8 注解注解T6.9 内置注解内置注解T6.10 元注解元注解T6.11 综合实例综合实例T6.4 数组实用类数组实用类ArraysJava实用教程(第3版)6.1 一维数组一维数组1一维数组的定义一维数组的定义一维数组的定义格式有如下两种:方式1:;方式2:;其中:可以是Java中任意的数据类型,为用户自定义的一个合法的变量名,指明该变量是一个数组类型变量。Java在定义数组时并不为数组元素分配内存,仅为分配一个引用变量的空间。例如下面的语句:int a;String person;int b100;/错误,声明数组时不能指定其长度2创建一维数组对象创建一维数组对象和创建其他Java对象一样,同样使用new关键字创建一维数组对象,格式为:数组名=new 元素类型 元素个数;例如下面的语句:int Array=new int100;/创建一个int型数组,存放100个int类型的数据Java实用教程(第3版)6.1 一维数组一维数组Java虚拟机首先在堆区中为数组分配内存空间,如图6.1所示,创建了一个包含100个元素的int型数组,数组成员都是int类型,占4个字节,因此整个数组对象在堆区中占用400个字节。之后,就要给每个数组成员赋予其数据类型的默认值,int型的默认值是0。图图6.1 一维数组的内存布局一维数组的内存布局Java实用教程(第3版)6.1 一维数组一维数组3.一维数组初始化一维数组初始化定义数组的同时也可对数组元素进行显式初始化,有动态初始化和静态初始化。静态初始化指的是在定义数组的同时就为数组元素分配空间并赋值,它的格式如下:=,;或者 =,;Java编译程序会自动根据个数算出整个数组的长度,并分配相应的空间,例如下面的语句:int Array=1,2,3,4;Java实用教程(第3版)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 引用类型数组的内存布局引用类型数组的内存布局Java实用教程(第3版)6.1 一维数组一维数组动态初始化指的是数组定义与为数组分配空间和赋值的操作分开进行,例如下面的语句: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;Java实用教程(第3版)6.1 一维数组一维数组【例例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+;/负数的个数加一elsep+;/正数的个数加一num=num+arrj;/计算累加和System.out.println(正数的个数+p);System.out.println(负数的个数+k);System.out.println(平均值是+num/i);/计算平均值Java实用教程(第3版)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”按钮,运行程序。程序运行结果:正数的个数8负数的个数2平均值是5图图6.3 计算平均值计算平均值Java实用教程(第3版)6.2 多维数组多维数组如前所述,在Java语言中,多维数组实际上是数组的数组。一个二维数组可以看成是一维数组,其中的每个成员又是一维数组。1二维数组的定义二维数组的定义二维数组的定义格式如下:格式1:;格式2:;与一维数组的情形相类似,定义二维数组时不需要给出数组大小。int a;String names;int b100100;/错误,声明数组时不能指定其长度2创建二维数组对象创建二维数组对象和创建一维数组一样,创建二维数组同样使用new关键字,格式如下:数组名=new 数组元素类型 数组元素个数 数组元素个数;例如下面的语句:int a=new int2 3;/创建一个int型的二维数组Java实用教程(第3版)6.2 多维数组多维数组和一维数组一样,若没有对二维数组成员进行显式初始化,则会进行隐式初始化,会根据创建的数组类型初始化对象,内存布局如图6.4所示。图图6.4 二维数组的内存布局二维数组的内存布局Java实用教程(第3版)6.2 多维数组多维数组3.二维数组初始化二维数组初始化和一维数组一样,定义二维数组的同时也可对数组成员进行显式初始化,有动态初始化和静态初始化。在下面的语句中,定义String类型数组alphabet的同时初始化数组成员,即静态初始化。String alphabet=a,b,c,d,e,f,g,h,i,j,k,l;注意:注意:无论是初始化一维数组还是二维数组,都不能指定其长度。例如下面的语句:String43 alphabet=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;Java实用教程(第3版)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(int a,int b)x=a;y=b;图图6.5 二维数组引用类型的内存布局二维数组引用类型的内存布局 Java实用教程(第3版)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;Java实用教程(第3版)6.2 多维数组多维数组(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 int x,y;Point(int a,int b)x=a;y=b;【例例6.2】设计一个Java程序,从低到高将从命令行中读取的一组数字进行升序排列。Java实用教程(第3版)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.6 对数值按从小到大排序对数值按从小到大排序Java实用教程(第3版)6.3 访问数组访问数组数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素的索引为0,第二个元素的索引为1,依次类推。数组的length属性表示数组的长度,它的声明形式如下:public final int length;length属性被public和final修饰,因此在程序中可以读取数组的长度,但不能修改数组的长度。【例例6.3】求出4阶矩阵的最大元素以及其所在的行号和列号。【例例6.4】将一个3 4阶矩阵转置。矩阵转置就是将一个矩阵的行、列互换。Java实用教程(第3版)6.4 数组实用类数组实用类:Arrays6.4.1 复制数组复制数组java.lang.System类提供了一个很有用的静态方法arraycopy()用来复制数组,其语法格式如下: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()方法把数组的内容复制到另一个数组。Java实用教程(第3版)6.4.2 数组排序数组排序使用内置的排序方法,就可以对任意基本类型数组排序,也可以对任意的对象数组进行排序,只要该对象实现了Comparable接口或具有相关联的Comparator。当然,可以对数组按指定的排序方法进行排序。【例例6.6】随机生成10个整数值,并使用内置的排序方法对数组排序。Java实用教程(第3版)6.4.3 数组元素的查找数组元素的查找如果数组已经排好序了,就可以使用Array.binarySearch()执行快速查找。【例例6.7】对无序的10个整数值进行排序,再用二叉查找法进行检索。Java实用教程(第3版)6.5 枚举枚举JDK5.0引入了一个新的关键字enum表示枚举类型。定义一个枚举类型很简单,下面是一个枚举类型的示例。public enum Season SPRING,SUMMER,AUTUMN,WINTER;上面创建了一个名为Season的枚举类型,它具有4个成员。由于枚举类型的实例是常量,因此按照命名习惯它们都用大写字母表示。为了使用enum,需要创建一个该类型的引用,将其赋值给某个实例。例如下面的语句:Season season=Season.SUMMER;在创建一个enum的实例后,编译器会自动创建一些有用的方法。ordinal()方法用来表示某个特定enum常量的声明顺序,values()方法用来按照enum常量的声明顺序,产生由这些常量值构成的数组。例如下面的代码:for(Season season:Season.values()System.out.println(season+,ordinal+season.ordinal();输出:SPRING,ordinal 0SUMMER,ordinal 1AUTUMN,ordinal 2WINTER,ordinal 3Java实用教程(第3版)6.5 枚举枚举定义枚举类型本质上就是在定义一个final类型的class,该类从java.lang.Enum类继承。这些工作由编译器来完成,所以enum象类一样可以具有自己的成员方法、数据成员、自己的构造方法、自己的初始化代码块,以及内部类。【例例6.8】用enum模拟交通信号灯。Java实用教程(第3版)6.6 enum的构造方法的构造方法使用enum定义枚举类型时,实质上定义出来的类继承自 java.lang.Enum 类,而每个枚举的成员其实就是定义的枚举类型的一个实例。在定义一个枚举类型时,像定义类一样,可以定义枚举类型的构造方法,这样在定义枚举类型的成员变量时,利用构造方法进行初始化。在定义枚举类型时,必须将枚举常量定义在最前面,并以分号“;”与其他成员隔开。若enum是public类型,且在类外部定义,则文件名必须与enum名字相同,且文件中不能再定义其他public类型的类。注意:enum的构造方法必须是private,否则出错。【例例6.9】在enum中定义enum的构造方法和普通方法。Java实用教程(第3版)6.7 使用使用EnumMapEnumMap是一种特殊的Map,它要求所有的键(Key)都必须来自同一个枚举类型。该枚举类型在创建EnumMap时显式或隐式地指定。EnumMap在内部表示为数组,这种表示形式非常紧凑且高效,所以可以放心地使用enum实例在EnumMap中进行查找。不过,只能将enum的实例作为键来调用put()方法,其他操作与使用一般的Map差不多。关于Map对象的详细介绍请参考第7章的第7.6节。【例例6.10】通过使用EnumMap的键对象来取得值对象。Java实用教程(第3版)6.8 注解注解注解(也称元数据)是众多引入到Java SE5中的重要的语言变化之一。注解类型的主要目的是,以标准化和结构化的方式来表示信息。这些信息可由自动化处理工具来读取与处理,也可以增加程序员的理解。因而提供了一种结构化的,并且具有类型检查能力的新途径,使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。注解采用能被Java编译器进行检查、验证的格式,存储有关程序的额外信息。通过使用注解,可以将这些元数据保存在Java源代码中,同时,注解的优点还包括:附属文件的自动生成,例如部署描述符或者bean信息类;测试、日志、事务语义等代码的自动生成。Java语言本身提供的注解不多,但它提供了一个强大的机制,用于定义自己的注解。程序员更多的是使用开发环境或开发工具中自定义的注解,这些自定义的注解数量众多,功能强大,是程序员的有力工具。Java实用教程(第3版)6.9 内置注解内置注解内置注解是指Java语言内部已定义好的注解,可直接使用。Java SE预定义了三种标准注解(在java.lang包中)和四种元注解(在java.lang.annotation包中)。定义在java.lang包中的三种标准注解如下:Override:表示当前的方法定义将重写父类中的方法。如果不小心拼写错误,或者签名对不上重写的方法,编译器就会发出错误提示。Deprecated:如果使用了用它注解的程序元素,那么编译器会发出警告信息。SuppressWarnings:关闭指定的编译器警告信息annotation并不直接影响代码语义,但是它工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。Java实用教程(第3版)6.9.1 Overridejava.lang.Override是J2SE 5.0中标准的annotation类型之一,它告诉编译器某个方法必须是重写父类中的方法,编译器得知这项信息后,在编译程序时如果发现该方法并非重写父类中的方法,就会报告错误。该注解只能应用于方法。【例例6.11】使用Override注解。现在对Equals()方法加上Override注解,要求编译器必须检查这个方法是不是重写父类的某个方法,但编译器发现父类Object类中并没有这个方法,所以它会报告如下错误:OverrideTest.java:8:method does not override a method from its superclassOverride1 errorJava实用教程(第3版)6.9.2 Deprecatedjava.lang.Deprecated是J2SE 5.0中标准的annotation类型之一,它告诉编译器某个程序元素已经不建议使用,如果试图使用或重新定义该方法,则发出警告信息。【例例6.12】使用Deprecated注解。DeprecatedTest.javapackage org.annotations;public class DeprecatedTest extends Service Overridepublic void doSomething()System.out.println(do something in DeprecatedTest class);public static void main(String args)DeprecatedTest sub=new DeprecatedTest();sub.doSomething();class Service Deprecatedpublic void doSomething()System.out.println(do something);Java实用教程(第3版)6.9.2 Deprecated说明说明:在程序中定义一个Service类,并在其中定义doSomething()方法,经过一段时间之后,考虑不建议使用这个方法,因而将这个方法注解为Deprecated,DeprecatedTest类试图在继承这个类后重新定义doSomething()方法,程序编译时,就会出现如图6.7所示的报告信息。图图6.7 使用使用Deprecated注解注解Java实用教程(第3版)6.9.3 SuppressWarnings下面的方法f()中定义了一个ArrayList类,但同时会出现警告信息。public void f()List list=new ArrayList();list.add(hello);警告信息表示List类必须使用泛型才是安全的,才可以进行类型检查。如果想不显示这个警告信息有两种方法。一个是将这个方法进行如下改写:public void f()List list=new ArrayList();list.add(hello);另外一种方法就是使用SuppressWarnings,如下所示:SuppressWarnings(value=unchecked)public void f()List list=new ArrayList();list.add(hello);Java实用教程(第3版)6.9.3 SuppressWarnings要注意的是SuppressWarnings和前两个注解不一样。前两个注解是没有元素的。因而可写成:Override 或 Override(),而SuppressWarnings注解有一个元素,类型为String。按注解定义的约定,单一元素(即只有一个元素)的名字建议取为value。这样在使用注解时可简化。annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的“name=value”对,用于为annotation的成员赋值。例如下面的代码片段:SuppressWarnings(unchecked,deprecation)public void f()List list=new ArrayList();list.add(hello);SuppressWarnings 类型只定义了一个单一的成员,所以只有一个简单的value=.作为“name=value”对。又由于成员值是一个数组,故使用大括号来声明数组值。注意:可以在下面的情况中缩写annotation:当annotation只有单一成员,并且成员命名为“value=”。这时可以省去“value=”。比如将上面的SuppressWarnings 进行缩写:SuppressWarnings(unchecked,deprecation)如果SuppressWarnings所声明的被禁止警告个数为一个时,可以省去大括号:SuppressWarnings(unchecked)Java实用教程(第3版)6.9.3 SuppressWarnings【例例6.13】使用SuppressWarnings注解。SuppressWarningsTest.javapackage org.annotations;import java.util.*;public class SuppressWarningsTest SuppressWarnings(unchecked)public static void main(String args)Map map=new TreeMap();map.put(hello,new Date();System.out.println(map.get(hello);List list=new ArrayList();list.add(annotation);System.out.println(list);程序运行结果:Thu Dec 04 15:24:02 CST 2008annotationJava实用教程(第3版)6.10 元注解元注解6.10.1 自定义注解自定义注解注解的强大之处是它不仅可以使Java程序变成自描述的,而且允许程序员自定义注解。注解类型的定义,是一种特殊的接口定义,只是在interface关键字前面加了一个符号。编译程序在编译注解定义时,自动将注解从java.lang.annotation.Annotation接口继承,因而不允许在注解后边再加上extends子句。要注意:程序员人为地定义一个接口,从Annotation接口继承,这个不会被编译程序当作注解。因此,注解的定义只能使用interface定义。在任何可能定义接口的地方,都可以定义注解。接口的修饰符都可以修饰注解。访问权限范围也一样。例如下面的语句:public interface MyAnnotation 上面的代码是一个最简单的注解。这个注解没有任何元素,也可以理解为是一个标记注解。当然,也可以定义有元素的注解。例如下面的语句:public interface MyAnnotation public int id();public String value()default“java world”;id和value类似方法定义,value元素有一个缺省值,如果在注解某个方法时没有给出value值,则该注解的处理器就会使用此元素的默认值。可以按如下格式使用自定义注解MyAnnotation。MyAnnotation(id=12,value=java)public void f()Java实用教程(第3版)6.10.2 元注解元注解1.Target作为元注解类型的Target,它描述了注解所适用的程序元素的种类。当一个注解类型没有Target时,则表明该注解可适用于所有程序元素上。当存在Target时,编译程序将强制实施指定的使用限制。它将被作为普通的annotation看待。当它修饰一个特定的成员时,它将发挥其应用的作用。Target(ElementType.METHOD)interface MyAnnotation MyAnnotation/不正确,不能为类注解public class Comment MyAnnotation /正确,可以为方法注解public void method()Target所指的目标就是Java的语言元素如类接口方法等。当然,Target还可以对其他的元素进行限制,如构造方法字段参数等。若只允许对方法和构造方法进行注解可以写成:Target(ElementType.METHOD,ElementType.CONSTRUCTOR)interface MyAnnotation Java实用教程(第3版)6.10.2 元注解元注解2.Retention既然可以自定义注解,当然也就可以读取程序中的注解。annotation 的Retention定义了该annotation被保留的时间长短:某些annotation仅出现在源代码中,但被编译器丢弃;而另一些却被编译在 class文件中;编译在class文件中的annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。Retention(RetentionPolicy.SOURCE)interface MyAnnotation1 Retention(RetentionPolicy.CLASS)interface MyAnnotation2 Retention(RetentionPolicy.RUNTIME)interface MyAnnotation3 说明:说明:其中第一行代码的作用是不将注解保存在class文件中,也就是说像“/注释”一样在编译时被过滤掉了,第二行代码的作用是只将注解保存在class文件中,使用反射读取注解时忽略这些注解,第三行代码的作用是将注解保存在class文件中,也可以通过反射读取注解。3.DocumentedDocumented 这个注解和它的名子一样与文档有关。在默认的情况下使用javadoc或其他的类似工具自动生成文档时,注解将被忽略掉。如果想在文档中也包含注解,必须使用Documented为文档注解。Java实用教程(第3版)6.10.2 元注解元注解4.InheritedInherited也是一个标记型标记,表示注解类型会被自动继承。如果一个使用了Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。Inherited interface MyAnnotation MyAnnotationpublic class ParentClass public class ChildClass extends ParentClass 在以上代码中,ChildClass和ParentClass一样都已被MyAnnotation注解了。【例例6.14】使用JDK的元注解读取MyTest类的信息。Java实用教程(第3版)6.11 综合实例综合实例【例例6.15】设计一个Java程序,打印n阶螺旋矩阵。例如当n=3时,则:1 2 38 9 47 6 5思路:思路:数据的存储采用二维矩阵,数据存储的方向使用枚举常量左、右、上、下来表示。【例例6.16】找二维数组中的马鞍点。马鞍点:为本行中最小、但本列中最大的点。假设二维数组中没有重复数据。思路思路:首先从二维数组的第一行寻找每一行的最小值,找到后,记下该行的最小值在数组中的列号,由这个列号再判断它是否是本列中的最大的点。如果是,则找到了马鞍点。如果不是,则继续按照上述方法查找,直到找到马鞍点。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


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

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


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