第6章 数组、枚举及注解.ppt

上传人:京东小超市 文档编号:5826192 上传时间:2020-08-11 格式:PPT 页数:36 大小:254KB
返回 下载 相关 举报
第6章 数组、枚举及注解.ppt_第1页
第1页 / 共36页
第6章 数组、枚举及注解.ppt_第2页
第2页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第6章 数组、枚举及注解.ppt》由会员分享,可在线阅读,更多相关《第6章 数组、枚举及注解.ppt(36页珍藏版)》请在三一文库上搜索。

1、Java实用教程(第3版 ) 第6章 数组、枚举及注解 T6.1 一维数组 T6.2 多维数组 T6.3 访问数组 T6.5 枚举 T6.6 enum的构造方法 T6.7 使用EnumMap T6.8 注解 T6.9 内置注解 T6.10 元注解 T6.11 综合实例 T6.4 数组实用类Arrays 何 哉 考 嚣 贼 钳 攻 陈 簧 涉 正 沾 滚 祝 朔 襄 血 膨 半 援 莱 贝 掇 互 塔 奏 南 倒 赔 纪 奸 亨 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.1 一维数组 1一维数组的定义 一维数组的定义

2、格式有如下两种: 方式1:; 方式2: ; 其中:可以是Java中任意的数据类型,为用户自定义的 一个合法的变量名,指明该变量是一个数组类型变量。Java在定义数组时并 不为数组元素分配内存,仅为分配一个引用变量的空间。例如下面 的语句: int a; String person; int b100;/ 错误,声明数组时不能指定其长度 2创建一维数组对象 和创建其他Java对象一样,同样使用new关键字创建一维数组对象,格式 为: 数组名 = new 元素类型 元素个数; 例如下面的语句: int Array = new int100;/ 创建一个int型数组,存放100个int类 型的数据

3、绸 辑 亩 叫 奈 肩 宙 藏 腮 结 龚 噶 止 骄 率 艳 樟 唇 蒋 潘 氏 福 杜 茧 慑 颐 雷 立 甥 犯 英 抱 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.1 一维数组 Java虚拟机首先在堆区中为数组分配内存空间,如图6.1所示,创建了一 个包含100个元素的int型数组,数组成员都是int类型,占4个字节,因此整个 数组对象在堆区中占用400个字节。之后,就要给每个数组成员赋予其数据类 型的默认值,int型的默认值是0。 图图6.1 一维维数组组的内存布局 蛇 汹 设 固 栗 扮 映 分 钟 随

4、峭 孤 冤 逝 坠 戚 颅 垦 漆 扼 门 忠 漆 凳 腺 宦 浇 冒 撂 逃 绸 铆 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.1 一维数组 3. 一维数组初始化 定义数组的同时也可对数组元素进行显式初始化,有动态初始化和静态 初始化。静态初始化指的是在定义数组的同时就为数组元素分配空间并赋值 ,它的格式如下: = ,; 或者 = ,; Java编译程序会自动根据个数算出整个数组的长度,并分配相 应的空间,例如下面的语句: int Array = 1,2,3,4; 侥 兼 羞 盎 侩 撼 你 卸 盏 饶 撞 籍

5、蚀 倡 棕 羡 灶 繁 科 涩 取 籽 不 输 释 球 韩 诞 帛 迟 囚 肩 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 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 引用类类型数组组的内存布局 佰 会 跑 以 俏 淆 歌 趁 泼 滦 摈 眷 摔 扯 饥 配

6、潭 派 作 罚 嗓 洪 蒋 站 插 泊 领 泰 合 滋 袍 棺 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 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)

7、; / 或采用匿名数组写法 / 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 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.1 一维数组 【例6.1】 输入一组非0整数到一维数组中,设计一个Java程序,求出这一 组

8、数的平均值,并分别统计出这一组数中正数和负数的个数。 TestAverage.java package 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;j ; 格式2: ; 与一维数组的情形相类似,定义二维数组时不需要给出数组大小。 int a; String names; int b100100;/

9、 错误,声明数组时不能指定其长度 2创建二维数组对象 和创建一维数组一样,创建二维数组同样使用new关键字,格式如下: 数组名 = new 数组元素类型 数组元素个数 数组元素个数; 例如下面的语句: int a = new int2 3;/ 创建一个int型的二维数组 模 矛 哀 牧 陷 敛 锹 坷 练 鸽 退 熟 术 柏 辊 慧 篓 嘎 抢 露 胶 幽 界 郊 摸 喳 匹 摩 苦 连 缠 大 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.2 多维数组 和一维数组一样,若没有对二维数组成员进行显式初始化,则会进行隐

10、式初始化,会根据创建的数组类型初始化对象,内存布局如图6.4所示。 图图6.4 二维维数组组的内存布局 绢 绦 担 桐 吸 撂 坪 瞒 配 捶 挚 踩 漂 昨 恿 肚 盯 耙 别 短 癸 坟 铅 莫 敢 屏 序 预 位 正 憋 啡 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.2 多维数组 3. 二维数组初始化 和一维数组一样,定义二维数组的同时也可对数组成员进行显式初始化 ,有动态初始化和静态初始化。 在下面的语句中,定义String类型数组alphabet的同时初始化数组成员, 即静态初始化。 String alp

11、habet = “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“; 肖 挥 壶 毅 戚 篆 堤 邢 鼠 嗣 晤 墙 袋 舞 园 廊 砷 险 嘻 鸭 黍

12、 媳 议 越 率 桨 殿 数 窿 粱 东 掀 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 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

13、 a, int b) x = a; y = b; 图图6.5 二维维数组组引用类类型的内存布局 棺 寐 斯 歪 逼 条 比 亮 蔡 惶 逊 豁 挫 撮 耪 从 材 占 涸 瘸 剔 垫 寸 眨 屁 搞 欣 讫 坚 贵 蝶 锻 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.2 多维数组 二维数组的动态初始化有两种方式: 方式1: = new ; 例如:int arr = new int35; 方式2:从高维向低维依次进行空间分配,此时分配的数组空间可以是 任意的形状。 (1) 由于二维数组首先是一个一维数组,故先对该一维数

14、组进行空间分 配,也就是说,先对最高维进行空间分配。 = new ; 例如:int c = new int3; (2) 每一个元素又是一个一维数组,故对每一个元素再用new语句进行 空间分配,格式与一维数组相同。例如下面的语句: c0 = new int4; c1 = new int3; c2 = new int5; 槐 堰 卯 逞 血 伪 从 嗣 要 杆 狡 替 喧 自 兼 叉 棉 蛮 蘸 徘 般 义 桥 娱 罪 挨 吴 刁 漏 乙 断 釜 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.2 多维数组 (3)若最终元素

15、是引用类型,则还需对每一个最终元素进行对象的空间分 配。例如下面的语句: 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 P

16、oint(5,5); class Point int x, y; Point(int a, int b) x = a; y = b; 【例6.2】 设计一个Java程序,从低到高将从命令行中读取的一组数字进行升序排 列。 雹 怂 崇 临 旗 萝 毗 度 驳 巧 廷 阻 淖 蔑 愧 盒 描 苏 躺 朔 燎 铭 剐 教 丈 蛮 躁 竣 斌 招 嘿 吩 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.2 多维数组 右击“NumSort.java”,选择“Run As”“Run Configurations”,如图6.6所示 ,

17、选择Main标签页,在“Project”栏中选择“MyProject_06”,在“Main class”栏中 选择“NumSort”, 选择“Arguments”标签页,在“Program argumentds”栏中输入 “12 5 78 45 17 6 8 13 32 14”,然后单击“Run”按钮,运行程序。 图图6.6 对对数值值按从小到大排序 批 甸 假 梯 怕 捉 扭 脾 梗 札 凭 蠕 苦 蓬 貌 逐 根 阑 局 独 添 涝 夕 摸 槛 悍 舜 椎 救 寇 掺 道 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 )

18、6.3 访问数组 数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素 的索引为0,第二个元素的索引为1,依次类推。数组的length属性表示数组的 长度,它的声明形式如下: public final int length; length属性被public和final修饰,因此在程序中可以读取数组的长度, 但不能修改数组的长度。 【例6.3】求出4阶矩阵的最大元素以及其所在的行号和列号。 【例6.4】将一个3 4阶矩阵转置。矩阵转置就是将一个矩阵的行、列互 换。 慨 簇 苫 蛇 易 烘 豫 钥 芬 闹 枣 丁 职 怔 费 侯 失 哆 瞩 兢 悔 精 崭 浇 忙 猎 孔 垒 砖 商 结

19、 昧 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.4 数组实用类:Arrays 6.4.1 复制数组 java.lang.System类提供了一个很有用的静态方法arraycopy()用来复制数 组,其语法格式如下: static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 功能:从指定源数组中复制一个数组,复制从指定的位置开始,复制到 目标数组的指定位置。从 src引用的源数组到dest引用的目标数组,数组

20、组件 的一个子序列被复制下来。被复制的组件的数量等于 length 参数。源数组中 位置在 srcPos 到 srcPos+length-1之间的组件被分别复制到目标数组中的 destPos到destPos+length-1位置。 【例6.5】使用arraycopy()方法把数组的内容复制到另一个数组。 际 诧 庸 炯 锻 痪 兢 测 衍 卢 层 俩 室 蜀 忽 速 耽 闲 沸 婪 睡 况 猾 机 冰 摄 孤 毁 包 仿 茄 备 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.4.2 数组排序 使用内置的排序方法,就可以

21、对任意基本类型数组排序,也可以对任意 的对象数组进行排序,只要该对象实现了Comparable接口或具有相关联的 Comparator。当然,可以对数组按指定的排序方法进行排序。 【例6.6】随机生成10个整数值,并使用内置的排序方法对数组排序。 厢 妨 乖 睦 傅 瘤 揭 杏 轰 锌 积 鹃 统 拇 鸡 拾 淡 蒂 狰 滔 良 芒 彰 煌 奋 打 蹄 蛛 记 去 步 鞍 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.4.3 数组元素的查找 如果数组已经排好序了,就可以使用Array.binarySearch()执行快

22、速查找。 【例6.7】对无序的10个整数值进行排序,再用二叉查找法进行检索。 乒 铣 看 瓤 翱 育 寐 衙 裕 贬 蛛 氯 独 灰 歼 连 豢 吝 签 滁 标 遗 旋 畸 品 担 嚎 搁 下 宝 炸 袄 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.5 枚举 JDK5.0引入了一个新的关键字enum表示枚举类型。定义一个枚举类型很 简单,下面是一个枚举类型的示例。 public enum Season SPRING, SUMMER, AUTUMN, WINTER; 上面创建了一个名为Season的枚举类型,它具有4个

23、成员。由于枚举类型 的实例是常量,因此按照命名习惯它们都用大写字母表示。为了使用enum, 需要创建一个该类型的引用,将其赋值给某个实例。例如下面的语句: Season season = Season. SUMMER; 在创建一个enum的实例后,编译器会自动创建一些有用的方法。 ordinal()方法用来表示某个特定enum常量的声明顺序,values()方法用来按照 enum常量的声明顺序,产生由这些常量值构成的数组。例如下面的代码: for (Season season : Season.values() System.out.println(season+“,ordinal “+sea

24、son.ordinal(); 输出: SPRING, ordinal 0 SUMMER, ordinal 1 AUTUMN, ordinal 2 WINTER, ordinal 3 娱 瘫 员 项 枝 时 炸 缺 本 吱 湃 饮 脆 叶 并 冰 涎 膜 滑 材 陆 泊 胜 彦 悟 摆 戴 刑 枣 捕 颊 硒 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.5 枚举 定义枚举类型本质上就是在定义一个final类型的class,该类从 java.lang.Enum类继承。这些工作由编译器来完成,所以enum象类一样可以具 有

25、自己的成员方法、数据成员、自己的构造方法、自己的初始化代码块,以 及内部类。 【例6.8】用enum模拟交通信号灯。 颁 咳 浦 喻 鹤 啥 捷 花 旬 貌 吧 旭 踏 丛 差 蝉 女 氟 扇 恫 蜘 居 恢 春 咙 勘 池 宰 佑 逃 亮 疑 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.6 enum的构造方法 使用enum定义枚举类型时,实质上定义出来的类继承自 java.lang.Enum 类,而每个枚举的成员其实就是定义的枚举类型的一个实例 。在定义一个枚举类型时,像定义类一样,可以定义枚举类型的构造方法 ,这

26、样在定义枚举类型的成员变量时,利用构造方法进行初始化。在定义 枚举类型时,必须将枚举常量定义在最前面,并以分号“;”与其他成员隔开 。 若enum是public类型,且在类外部定义,则文件名必须与enum名字相 同,且文件中不能再定义其他public类型的类。注意:enum的构造方法必 须是private,否则出错。 【例6.9】在enum中定义enum的构造方法和普通方法。 逆 坛 亮 寥 谆 各 郴 飘 择 椽 留 轩 岗 勃 疼 蛙 棍 罢 吟 些 劈 冯 峻 内 子 蓉 硅 佰 澡 钻 焕 堂 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Ja

27、va实用教程(第3版 ) 6.7 使用EnumMap EnumMap是一种特殊的Map,它要求所有的键(Key)都必须来自同一个 枚举类型。该枚举类型在创建EnumMap时显式或隐式地指定。EnumMap在 内部表示为数组,这种表示形式非常紧凑且高效,所以可以放心地使用enum 实例在EnumMap中进行查找。不过,只能将enum的实例作为键来调用put() 方法,其他操作与使用一般的Map差不多。关于Map对象的详细介绍请参考 第7章的第7.6节。 【例6.10】通过使用EnumMap的键对象来取得值对象。 谱 睡 湖 湖 薄 扑 蹋 贫 此 串 隘 客 云 色 政 写 喉 闺 剂 君 慧

28、品 氛 怎 风 田 钢 酒 范 柜 警 堡 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.8 注解 注解(也称元数据)是众多引入到Java SE5中的重要的语言变化之一。注解 类型的主要目的是,以标准化和结构化的方式来表示信息。这些信息可由自动 化处理工具来读取与处理,也可以增加程序员的理解。因而提供了一种结构化 的,并且具有类型检查能力的新途径,使得程序员能够为代码加入元数据,而 不会导致代码杂乱且难以阅读。注解采用能被Java编译器进行检查、验证的格 式,存储有关程序的额外信息。通过使用注解,可以将这些元数据保存在

29、Java 源代码中,同时,注解的优点还包括:附属文件的自动生成,例如部署描述符 或者bean信息类;测试、日志、事务语义等代码的自动生成。Java语言本身提 供的注解不多,但它提供了一个强大的机制,用于定义自己的注解。程序员更 多的是使用开发环境或开发工具中自定义的注解,这些自定义的注解数量众多 ,功能强大,是程序员的有力工具。 嘎 肤 详 蚤 抄 遗 钳 郝 面 詹 畸 走 嘛 迁 聪 森 埔 憋 浚 辞 漾 艇 听 啸 拄 沮 柜 味 疚 龙 佛 寿 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.9 内置注解 内置

30、注解是指Java语言内部已定义好的注解,可直接使用。Java SE预定 义了三种标准注解(在java.lang包中)和四种元注解(在java.lang.annotation包中) 。定义在java.lang包中的三种标准注解如下: Override:表示当前的方法定义将重写父类中的方法。如果不小心拼写 错误,或者签名对不上重写的方法,编译器就会发出错误提示。 Deprecated:如果使用了用它注解的程序元素,那么编译器会发出警告 信息。 SuppressWarnings:关闭指定的编译器警告信息 annotation并不直接影响代码语义,但是它工作的方式被看作类似程序的 工具或者类库,它会反

31、过来对正在运行的程序语义有所影响。 娩 效 词 咨 纫 究 棍 姿 霸 档 储 糟 戊 迈 前 庚 划 渠 剁 昭 增 走 蒙 笆 名 哲 淌 梦 歇 痪 吱 姨 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.9.1 Override java.lang.Override是J2SE 5.0中标准的annotation类型之一,它告诉编译器 某个方法必须是重写父类中的方法,编译器得知这项信息后,在编译程序时 如果发现该方法并非重写父类中的方法,就会报告错误。该注解只能应用于 方法。 【例6.11】使用Override注解

32、。 现在对Equals()方法加上Override注解,要求编译器必须检查这个方法是 不是重写父类的某个方法,但编译器发现父类Object类中并没有这个方法,所 以它会报告如下错误: OverrideTest.java:8: method does not override a method from its superclass Override 1 error 济 暴 健 己 融 即 背 咐 息 累 关 吼 施 锭 邻 蓬 庇 垃 亏 次 蔬 矮 岛 论 欲 您 史 广 床 粮 逊 孝 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程

33、(第3版 ) 6.9.2 Deprecated java.lang.Deprecated是J2SE 5.0中标准的annotation类型之一,它告诉编译 器某个程序元素已经不建议使用,如果试图使用或重新定义该方法,则发出 警告信息。 【例6.12】使用Deprecated注解。 DeprecatedTest.java package org.annotations; public class DeprecatedTest extends Service Override public void doSomething() System.out.println(“do something in

34、 DeprecatedTest class“); public static void main(String args) DeprecatedTest sub = new DeprecatedTest(); sub.doSomething(); class Service Deprecated public void doSomething() System.out.println(“do something“); 参 断 烯 阵 憎 种 前 唐 烧 肺 池 俄 尖 按 民 是 瑶 陛 贷 徐 陛 辩 恨 爹 陇 群 怖 晕 铰 藩 插 咖 第 6 章 数 组 、 枚 举 及 注 解 第 6

35、 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.9.2 Deprecated 说明:在程序中定义一个Service类,并在其中定义doSomething()方法, 经过一段时间之后,考虑不建议使用这个方法,因而将这个方法注解为 Deprecated,DeprecatedTest类试图在继承这个类后重新定义doSomething()方 法,程序编译时,就会出现如图6.7所示的报告信息。 图图6.7 使用Deprecated注解 赫 拓 胆 会 湍 滤 魄 泡 屁 退 古 叫 痴 肩 武 徒 果 勉 赵 衅 枉 裴 犹 曾 性 琵 傍 恤 傅 闹 斡 寓 第 6 章 数 组

36、 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 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(“hel

37、lo“); 另外一种方法就是使用SuppressWarnings,如下所示: SuppressWarnings (value = “unchecked“) public void f() List list = new ArrayList(); list.add(“hello“); 莎 纲 燥 挞 豪 炭 堰 融 膳 斩 疯 痪 蒂 勉 狈 纱 耙 叉 嚎 包 蜒 踢 赶 痹 若 漳 轻 洋 音 驴 健 祝 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.9.3 SuppressWarnings 要注意的是Suppres

38、sWarnings和前两个注解不一样。前两个注解是没有元 素的。因而可写成:Override 或 Override(),而SuppressWarnings注解有 一个元素,类型为String。按注解定义的约定,单一元素(即只有一个元素) 的名字建议取为value。这样在使用注解时可简化。annotation语法允许在 annotation名后跟括号,括号中是使用逗号分割的“name = value”对,用于为 annotation的成员赋值。例如下面的代码片段: SuppressWarnings(“unchecked“,“deprecation“) public void f() List l

39、ist = new ArrayList(); list.add(“hello“); SuppressWarnings 类型只定义了一个单一的成员,所以只有一个简 单的value = .作为“name = value”对。又由于成员值是一个数组,故使用大 括号来声明数组值。注意:可以在下面的情况中缩写annotation:当annotation 只有单一成员,并且成员命名为“value =”。这时可以省去“value =”。比如将 上面的SuppressWarnings 进行缩写: SuppressWarnings (“unchecked“ , “deprecation“) 如果Suppress

40、Warnings所声明的被禁止警告个数为一个时,可以省去 大括号: SuppressWarnings(“unchecked“) 滔 季 润 窘 葵 窟 避 齿 弃 串 几 染 吮 用 亦 深 裴 皱 蜂 斟 跑 棕 话 训 响 闻 燥 趟 印 壬 座 零 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.9.3 SuppressWarnings 【例6.13】使用SuppressWarnings注解。 SuppressWarningsTest.java package org.annotations; import jav

41、a.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

42、15:24:02 CST 2008 annotation 街 德 拭 嘛 澳 揉 湖 坝 具 僻 愿 这 盅 驯 囱 陀 坊 间 蓖 粕 靳 恳 弗 肤 专 怖 滥 楔 缮 刊 沤 拖 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.10 元注解 6.10.1 自定义注解 注解的强大之处是它不仅可以使Java程序变成自描述的,而且允许程序 员自定义注解。注解类型的定义,是一种特殊的接口定义,只是在interface关 键字前面加了一个符号。编译程序在编译注解定义时,自动将注解从 java.lang.annotation.

43、Annotation接口继承,因而不允许在注解后边再加上 extends子句。要注意:程序员人为地定义一个接口,从Annotation接口继承, 这个不会被编译程序当作注解。因此,注解的定义只能使用interface定义。 在任何可能定义接口的地方,都可以定义注解。接口的修饰符都可以修饰注 解。访问权限范围也一样。例如下面的语句: public interface MyAnnotation 上面的代码是一个最简单的注解。这个注解没有任何元素,也可以理解 为是一个标记注解。当然,也可以定义有元素的注解。例如下面的语句: public interface MyAnnotation public i

44、nt id(); public String value() default “java world”; id和value类似方法定义,value元素有一个缺省值,如果在注解某个方法 时没有给出value值,则该注解的处理器就会使用此元素的默认值。 可以按如下格式使用自定义注解MyAnnotation。 MyAnnotation(id =12, value = “java“) public void f() 狮 命 私 聂 串 望 移 明 贱 发 僚 搭 枚 迟 称 预 隔 噎 频 膏 遣 购 绅 阜 痔 炎 淬 惫 诌 锰 滚 袖 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数

45、组 、 枚 举 及 注 解 Java实用教程(第3版 ) 6.10.2 元注解 1. Target 作为元注解类型的Target,它描述了注解所适用的程序元素的种类。 当一个注解类型没有Target时,则表明该注解可适用于所有程序元素上。 当存在Target时,编译程序将强制实施指定的使用限制。 它将被作为普通的annotation看待。当它修饰一个特定的成员时,它将发 挥其应用的作用。 Target(ElementType.METHOD) interface MyAnnotation MyAnnotation / 不正确,不能为类注解 public class Comment MyAnnot

46、ation / 正确,可以为方法注解 public void method() Target所指的目标就是Java的语言元素如类接口方法等。当然, Target还可以对其他的元素进行限制,如构造方法字段参数等。若只允许 对方法和构造方法进行注解可以写成: Target(ElementType.METHOD,ElementType.CONSTRUCTOR) interface MyAnnotation 贯 吸 帕 精 脱 粮 娥 盾 帮 邵 瓶 障 奄 扶 替 拎 垦 丙 撤 藤 翠 沿 弘 椽 民 屡 翰 恩 喂 跌 端 竣 第 6 章 数 组 、 枚 举 及 注 解 第 6 章 数 组 、

47、枚 举 及 注 解 Java实用教程(第3版 ) 6.10.2 元注解 2. Retention 既然可以自定义注解,当然也就可以读取程序中的注解。annotation 的 Retention定义了该annotation被保留的时间长短:某些annotation仅出现在源 代码中,但被编译器丢弃;而另一些却被编译在 class文件中;编译在class文 件中的annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。 Retention(RetentionPolicy.SOURCE) interface MyAnnotation1 Retention(RetentionPo

48、licy.CLASS) interface MyAnnotation2 Retention(RetentionPolicy.RUNTIME) interface MyAnnotation3 说明:其中第一行代码的作用是不将注解保存在class文件中,也就是说 像“/注释”一样在编译时被过滤掉了,第二行代码的作用是只将注解保存在 class文件中,使用反射读取注解时忽略这些注解,第三行代码的作用是将注 解保存在class文件中,也可以通过反射读取注解。 3. Documented Documented 这个注解和它的名子一样与文档有关。在默认的情况下使 用javadoc或其他的类似工具自动生成文档时,注解将被忽略掉。如果想在文 档中也包含注解,必须使用Documented为文档注解。 查 肄 械 崎 丹 酿 昧 攻 抹 礼 沪 莱 惊 割 搓 凛 筋 男 账 缓 监 旱 式 燎 报 扩 币 廷 具 讳 版 事 第 6

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1