Java基礎 加強課件.ppt
《Java基礎 加強課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《Java基礎 加強課件.ppt(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 Java基 礎 加 強講 師 : 黎 活 明 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 課 程 大 綱l eclipse的 使 用 技 巧l 靜 態(tài) 導 入l 可 變 參 數(shù) 與 for循 環(huán) 增 強l 基 本 數(shù) 據(jù) 類 型 的 自 動 拆 箱 與 裝 箱l 枚 舉l 反 射l JavaBean內(nèi) 省 l beanutils工 具 包l 注 解l 泛 型l 類 加 載 器l 代 理 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育
2、 eclipse的 使 用 技 巧快 捷 鍵 使 用 技 巧 : 快 捷 鍵 的 位 置 : window-preferences-General-Keys:l 最 常 用 eclipse快 捷 鍵l 內(nèi) 容 提 示 Alt+/l 添 加 塊 注 釋 Ctrl+Shift+/l 除 去 塊 注 釋 Ctrl+Shift+l 復 制 行 Ctrl+Alt+向 下 鍵l 更 改 為 大 寫 Ctrl+Shift+Xl 更 改 為 小 寫 Ctrl+Shift+Y l 類 和 方 法 說 明 F2 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 靜 態(tài) 導 入
3、import static語 句 導 入 一 個 類 中 的 某 個 或 所 有 靜 態(tài) 方 法l 語 法 舉 例 : import static java.lang.Math.random;import static java.lang.Math.*; public static void main(String args) System.out.println(random()*100);import static語 句 導 入 一 個 類 中 的 靜 態(tài) 成 員 變 量 l 語 法 舉 例 : public class Constant public static String cont
4、ent = itcast; import static cn.itcast.Constant.content; 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 增 強 for循 環(huán)l 語 法 :for ( type 變 量 名 : 集 合 變 量 名 ) l 注 意 事 項 :迭 代 變 量 必 須 在 ( )中 定 義 !集 合 變 量 可 以 是 數(shù) 組 或 實 現(xiàn) 了 Iterable接 口 的 集 合 類l 舉 例 : public static int add(int x,int .args) int sum = x;for(int arg:ar
5、gs) sum += arg; return sum; 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 可 變 參 數(shù)l 可 變 參 數(shù) 的 特 點 :只 能 出 現(xiàn) 在 參 數(shù) 列 表 的 最 后 ;.位 于 變 量 類 型 和 變 量 名 之 間 , 前 后 有 無 空 格 都 可 以 ;調(diào) 用 可 變 參 數(shù) 的 方 法 時 , 編 譯 器 為 該 可 變 參 數(shù) 隱 含 創(chuàng) 建一 個 數(shù) 組 , 在 方 法 體 中 以 數(shù) 組 的 形 式 訪 問 可 變 參 數(shù) 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育
6、 基 本 數(shù) 據(jù) 類 型 的 自 動 拆 箱 與 裝 箱l 自 動 裝 箱 :Integer num1 = 12;l 自 動 拆 箱 :Int num = new Integer(23);l 基 本 Boolean/Byte/Integer(數(shù) 值 范 圍 : -128至 127)數(shù) 據(jù) 類 型 的 對 象 緩 存 :Integer num1 = 12;Integer num2 = 12;System.out.println(num1 = num2);Integer num3 = 129;Integer num4 = 129;System.out.println(num3 = num4);
7、高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 枚 舉使 用 枚 舉 的 關(guān) 鍵 技 術(shù) 如 下 : 1: enum關(guān) 鍵 字 表 示 枚 舉 類 型 , 它 的 作 用 相 當 于 類 聲 明 中 的 class關(guān) 鍵 字 。 2:枚 舉 類 型 不 能 有 public的 構(gòu) 造 方 法 。 3:所 有 的 枚 舉 值 都 是 public、 static、 final的 , 這 些 修 飾 符 都 是 自 動 加 上 , 無 須 程序 員 手 動 添 加 。 4:枚 舉 之 間 用 “ , ” 分 開 , 最 好 一 個 枚 舉 值 用 分 號 “
8、; ” 。 5:每 一 個 枚 舉 值 是 一 個 枚 舉 類 型 的 實 例 。 6:可 以 在 枚 舉 類 型 定 義 非 枚 舉 值 變 量 , 這 些 變 量 可 以 使 用 任 何 修 飾 符 。 7:變 量 和 方 法 的 定 義 必 須 在 枚 舉 值 后 面 定 義 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 枚 舉 的 高 級 應 用l 枚 舉 就 相 當 于 一 個 類 , 其 中 也 可 以 定 義 構(gòu) 造 方 法 、 成 員 變 量 、 普 通 方 法 和 抽象 方 法 。l 枚 舉 元 素 必 須 位 于 枚 舉 體 中
9、的 最 開 始 部 分 , 枚 舉 元 素 列 表 的 后 要 有 分 號 與 其他 成 員 分 隔 。 把 枚 舉 中 的 成 員 方 法 或 變 量 等 放 在 枚 舉 元 素 的 前 面 , 編 譯 器 報告 錯 誤 。l 帶 構(gòu) 造 方 法 的 枚 舉 構(gòu) 造 方 法 必 須 定 義 成 私 有 的 如 果 有 多 個 構(gòu) 造 方 法 , 該 如 何 選 擇 哪 個 構(gòu) 造 方 法 ? 枚 舉 元 素 MON和 MON( ) 的 效 果 一 樣 , 都 是 調(diào) 用 默 認 的 構(gòu) 造 方 法 。l 帶 方 法 的 枚 舉 定 義 枚 舉 TrafficLamp 實 現(xiàn) 普 通 的 ne
10、xt方 法 實 現(xiàn) 抽 象 的 next方 法 : 每 個 元 素 分 別 是 由 枚 舉 類 的 子 類 來 生 成 的 實 例 對 象 , 這 些 子 類 采 用 類 似 內(nèi) 部 類的 方 式 進 行 定 義 。 增 加 上 表 示 時 間 的 構(gòu) 造 方 法l 枚 舉 只 有 一 個 成 員 時 , 就 可 以 作 為 一 種 單 例 的 實 現(xiàn) 方 式 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 反 射 的 基 石 Class類l Java程 序 中 的 各 個 Java類 屬 于 同 一 類 事 物 , 描 述 這 類 事 物 的 Jav
11、a類 名 就 是 Class。l 對 比 提 問 : 眾 多 的 人 用 一 個 什 么 類 表 示 ? 眾 多 的 Java類 用 一 個 什 么 類 表 示 ? 人 Person Java類 Classl 對 比 提 問 : Person類 代 表 人 , 它 的 實 例 對 象 就 是 張 三 , 李 四 這 樣 一 個 個 具 體 的人 , Class類 代 表 Java類 , 它 的 各 個 實 例 對 象 又 分 別 對 應 什 么 呢 ? 對 應 各 個 類 在 內(nèi) 存 中 的 字 節(jié) 碼 , 例 如 , Person類 的 字 節(jié) 碼 , ArrayList類 的 字 節(jié) 碼
12、, 等 等 。 一 個 類 被 類 加 載 器 加 載 到 內(nèi) 存 中 , 占 用 一 片 存 儲 空 間 , 這 個 空 間 里 面 的 內(nèi) 容 就 是 類 的 字 節(jié) 碼 , 不 同 的類 的 字 節(jié) 碼 是 不 同 的 , 所 以 它 們 在 內(nèi) 存 中 的 內(nèi) 容 是 不 同 的 , 這 一 個 個 的 空 間 可 分 別 用 一 個 個 的 對 象 來表 示 , 這 些 對 象 顯 然 具 有 相 同 的 類 型 , 這 個 類 型 是 什 么 呢 ?l 如 何 得 到 各 個 字 節(jié) 碼 對 應 的 實 例 對 象 ( Class類 型 ) 類 名 .class, 例 如 , Sy
13、stem.class 對 象 .getClass(), 例 如 , new Date().getClass() Class.forName(類 名 ), 例 如 , Class.forName(java.util.Date);l 九 個 預 定 義 Class實 例 對 象 : 參 看 Class.isPrimitive方 法 的 幫 助 Int.class = Integer.TYPEl 數(shù) 組 類 型 的 Class實 例 對 象 Class.isArray()l 總 之 , 只 要 是 在 源 程 序 中 出 現(xiàn) 的 類 型 , 都 有 各 自 的 Class實 例 對 象 , 例 如
14、, int, void 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 反 射 l 反 射 就 是 把 Java類 中 的 各 種 成 分 映 射 成 相 應 的 java類 。 例 如 , 一個 Java類 中 用 一 個 Class類 的 對 象 來 表 示 , 一 個 類 中 的 組 成 部 分 :成 員 變 量 , 方 法 , 構(gòu) 造 方 法 , 包 等 等 信 息 也 用 一 個 個 的 Java類 來表 示 , 就 像 汽 車 是 一 個 類 , 汽 車 中 的 發(fā) 動 機 , 變 速 箱 等 等 也 是 一個 個 的 類 。 表 示 java
15、類 的 Class類 顯 然 要 提 供 一 系 列 的 方 法 , 來獲 得 其 中 的 變 量 , 方 法 , 構(gòu) 造 方 法 , 修 飾 符 , 包 等 信 息 , 這 些 信息 就 是 用 相 應 類 的 實 例 對 象 來 表 示 , 它 們 是 Field、 Method、Contructor、 Package等 等 。 l 一 個 類 中 的 每 個 成 員 都 可 以 用 相 應 的 反 射 API類 的 一 個 實 例 對 象來 表 示 , 通 過 調(diào) 用 Class類 的 方 法 可 以 得 到 這 些 實 例 對 象 后 , 得到 這 些 實 例 對 象 后 有 什 么
16、用 呢 ? 怎 么 用 呢 ? 這 正 是 學 習 和 應 用 反射 的 要 點 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 Constructor類l Constructor類 代 表 某 個 類 中 的 一 個 構(gòu) 造 方 法l 得 到 某 個 類 所 有 的 構(gòu) 造 方 法 :例 子 : Constructor constructors= Class.forName(java.lang.String).getConstructors();l 得 到 某 一 個 構(gòu) 造 方 法 :例 子 : Constructor constructor =
17、Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);/獲 得 方 法 時 要 用 到 類 型l 創(chuàng) 建 實 例 對 象 :通 常 方 式 : String str = new String(new StringBuffer(abc);反 射 方 式 : String str = (String)constructor.newInstance(new StringBuffer(abc);/調(diào) 用 獲 得 的 方 法 時 要 用 到 上 面 相 同 類 型 的 實 例 對 象 l Class.newInstanc
18、e()方 法 :例 子 : String obj = (String)Class.forName(java.lang.String).newInstance();該 方 法 內(nèi) 部 先 得 到 默 認 的 構(gòu) 造 方 法 , 然 后 用 該 構(gòu) 造 方 法 創(chuàng) 建 實 例 對 象 。該 方 法 內(nèi) 部 的 具 體 代 碼 是 怎 樣 寫 的 呢 ? 用 到 了 緩 存 機 制 來 保 存 默 認 構(gòu) 造 方 法 的 實 例對 象 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 Field類l Field類 代 表 某 個 類 中 的 一 個 成 員 變
19、 量l 演 示 用 eclipse自 動 生 成 Java類 的 構(gòu) 造 方 法l 問 題 : 得 到 的 Field對 象 是 對 應 到 類 上 面 的 成 員 變 量 , 還 是 對 應 到對 象 上 的 成 員 變 量 ? 類 只 有 一 個 , 而 該 類 的 實 例 對 象 有 多 個 , 如 果是 與 對 象 關(guān) 聯(lián) , 哪 關(guān) 聯(lián) 的 是 哪 個 對 象 呢 ? 所 以 字 段 fieldX 代 表 的 是x的 定 義 , 而 不 是 具 體 的 x變 量 。l 示 例 代 碼 :ReflectPoint point = new ReflectPoint(1,7);Field
20、y = Class.forName(cn.itcast.corejava.ReflectPoint).getField(y);System.out.println(y.get(point); /Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getField(x);Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getDeclaredField(x);x.setAccessible(true);System.out.println(x.get(point);l 作
21、 業(yè) : 將 任 意 一 個 對 象 中 的 所 有 String類 型 的 成 員 變 量 所 對 應 的 字符 串 內(nèi) 容 中 的 b改 成 a。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 Method類l Method類 代 表 某 個 類 中 的 一 個 成 員 方 法l 得 到 類 中 的 某 一 個 方 法 :例 子 : Method charAt = Class.forName(java.lang.String).getMethod(charAt, int.class);l 調(diào) 用 方 法 :通 常 方 式 : System.out.p
22、rintln(str.charAt(1);反 射 方 式 : System.out.println(charAt.invoke(str, 1); 如 果 傳 遞 給 Method對 象 的 invoke()方 法 的 第 一 個 參 數(shù) 為 null, 這 有 著 什 么 樣 的 意 義 呢 ? 說 明該 Method對 象 對 應 的 是 一 個 靜 態(tài) 方 法 ! l jdk1.4和 jdk1.5的 invoke方 法 的 區(qū) 別 :Jdk1.5: public Object invoke(Object obj,Object. args)Jdk1.4: public Object invo
23、ke(Object obj,Object args), 即 按 jdk1.4的 語 法 ,需 要 將 一 個 數(shù) 組 作 為 參 數(shù) 傳 遞 給 invoke方 法 時 , 數(shù) 組 中 的 每 個 元 素 分 別 對 應 被調(diào) 用 方 法 中 的 一 個 參 數(shù) , 所 以 , 調(diào) 用 charAt方 法 的 代 碼 也 可 以 用 Jdk1.4改 寫 為 charAt.invoke(“str”, new Object1)形 式 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 內(nèi) 省 了 解 JavaBeanl JavaBean是 一 種 特 殊 的
24、Java類 , 主 要 用 于 傳 遞 數(shù) 據(jù) 信 息 , 這 種 java類 中 的 方 法 主 要 用 于 訪 問 私 有 的字 段 , 且 方 法 名 符 合 某 種 命 名 規(guī) 則 。l 如 果 要 在 兩 個 模 塊 之 間 傳 遞 多 個 信 息 , 可 以 將 這 些 信 息 封 裝 到 一 個 JavaBean中 , 這 種 JavaBean的 實例 對 象 通 常 稱 之 為 值 對 象 ( Value Object, 簡 稱 VO) 。 這 些 信 息 在 類 中 用 私 有 字 段 來 存 儲 , 如 果 讀取 或 設 置 這 些 字 段 的 值 , 則 需 要 通 過
25、一 些 相 應 的 方 法 來 訪 問 , 大 家 覺 得 這 些 方 法 的 名 稱 叫 什 么 好 呢 ?JavaBean的 屬 性 是 根 據(jù) 其 中 的 setter和 getter方 法 來 確 定 的 , 而 不 是 根 據(jù) 其 中 的 成 員 變 量 。 如 果 方 法名 為 setId, 中 文 意 思 即 為 設 置 id, 至 于 你 把 它 存 到 哪 個 變 量 上 , 用 管 嗎 ? 如 果 方 法 名 為 getId, 中 文意 思 即 為 獲 取 id, 至 于 你 從 哪 個 變 量 上 取 , 用 管 嗎 ? 去 掉 set前 綴 , 剩 余 部 分 就 是
26、屬 性 名 , 如 果 剩 余部 分 的 第 二 個 字 母 是 小 寫 的 , 則 把 剩 余 部 分 的 首 字 母 改 成 小 的 。 setId()的 屬 性 名 id isLast()的 屬 性 名 last setCPU的 屬 性 名 是 什 么 ?CPU getUPS的 屬 性 名 是 什 么 ? UPS 總 之 , 一 個 類 被 當 作 javaBean使 用 時 , JavaBean的 屬 性 是 根 據(jù) 方 法 名 推 斷 出 來 的 , 它 根 本 看 不 到java類 內(nèi) 部 的 成 員 變 量 。l 一 個 符 合 JavaBean特 點 的 類 可 以 當 作 普
27、 通 類 一 樣 進 行 使 用 , 但 把 它 當 JavaBean用 肯 定 需 要 帶 來 一 些額 外 的 好 處 , 我 們 才 會 去 了 解 和 應 用 JavaBean! 好 處 如 下 : 在 Java EE開 發(fā) 中 , 經(jīng) 常 要 使 用 到 JavaBean。 很 多 環(huán) 境 就 要 求 按 JavaBean方 式 進 行 操 作 , 別人 都 這 么 用 和 要 求 這 么 做 , 那 你 就 沒 什 么 挑 選 的 余 地 ! JDK中 提 供 了 對 JavaBean進 行 操 作 的 一 些 API, 這 套 API就 稱 為 內(nèi) 省 。 如 果 要 你 自 己
28、 去 通 過getX方 法 來 訪 問 私 有 的 x, 怎 么 做 , 有 一 定 難 度 吧 ? 用 內(nèi) 省 這 套 api操 作 JavaBean比 用 普 通 類 的方 式 更 方 便 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 內(nèi) 省 綜 合 案 例PropertyDescriptor propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();for(PropertyDescriptor propertydesc : propertyDes
29、criptors)Method method = propertydesc.getReadMethod();/獲 取 屬 性 的 get方 法 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 Commons-beanutils將 字 符 串 轉(zhuǎn) 換 成 給 定 類 型 的 值ConvertUtils.convert(String value, Class clazz)為 bean中 的 指 定 屬 性 賦 值BeanUtils.copyProperty(form, name, 經(jīng) 濟 );將 指 定 bean中 的 屬 性 值 拷 貝 到 目 標 bean
30、中 同 名 的 屬 性BeanUtils.copyProperties(dest, orig)將 Map中 的 值 拷 貝 到 目 標 bean中 與 key同 名 的 屬 性PersonForm form = new PersonForm();Map properties = new HashMap(); properties.put(id, 56);properties.put(name, liming);BeanUtils.populate(form, properties); 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 了 解 注 解 及 ja
31、va提 供 的 幾 個 基 本 注 解l 先 通 過 SuppressWarnings的 應 用 讓 大 家 直 觀 地 了 解 注 解 : 通 過 System.runFinalizersOnExit(true);的 編 譯 警 告 引 出SuppressWarnings(deprecation) l Deprecated 直 接 在 剛 才 的 類 中 增 加 一 個 方 法 , 并 加 上 Deprecated標 注 , 在 另 外 一 個 類 中 調(diào) 用 這 個 方法 。l Override public boolean equals(Reflect other)方 法 與 HashS
32、et結(jié) 合 講 解 l 總 結(jié) :注 解 相 當 于 一 種 標 記 , 在 程 序 中 加 了 注 解 就 等 于 為 程 序 打 上 了 某 種 標 記 , 沒 加 , 則等 于 沒 有 某 種 標 記 , 以 后 , javac編 譯 器 , 開 發(fā) 工 具 和 其 他 程 序 可 以 用 反 射 來 了 解 你的 類 及 各 種 元 素 上 有 無 何 種 標 記 , 看 你 有 什 么 標 記 , 就 去 干 相 應 的 事 。 標 記 可 以 加在 包 , 類 , 字 段 , 方 法 , 方 法 的 參 數(shù) 以 及 局 部 變 量 上 。看 java.lang包 , 可 看 到 J
33、DK中 提 供 的 最 基 本 的 annotation。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 自 定 義 注 解 及 其 應 用l 定 義 一 個 最 簡 單 的 注 解 : public interface MyAnnotation l 把 它 加 在 某 個 類 上 : MyAnnotation public class AnnotationTestl 用 反 射 進 行 測 試 AnnotationTest的 定 義 上 是 否 有 MyAnnotation l 根 據(jù) 發(fā) 射 測 試 的 問 題 , 引 出 Retention元 注
34、解 的 講 解 , 其 三 種 取 值 :RetetionPolicy.SOURCE、 RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分 別 對 應 : java源 文 件 -class文 件 -內(nèi) 存 中 的字 節(jié) 碼 。 思 考 : Override、 SuppressWarnings和 Deprecated這 三 個 注 解 的 屬 性 值 分 別 是 什么 ?l 演 示 和 講 解 Target元 注 解 Target的 默 認 值 為 任 何 元 素 , 設 置 Target等 于 ElementType.METHOD, 原 來 加 在 類
35、上 的 注解 就 報 錯 了 , 改 為 用 數(shù) 組 方 式 設 置 ElementType.METHOD,ElementType.TYPE就 可 以 了 。 l 元 注 解 以 及 其 枚 舉 屬 性 值 不 用 記 , 只 要 會 看 jdk提 供 那 幾 個 基 本 注 解 的 API幫 助 文 檔 的 定 義 或 其 源 代 碼 , 按 圖 索 驥 即 可 查 到 , 或 者 直 接 看java.lang.annotation包 下 面 的 類 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 為 注 解 增 加 基 本 屬 性l 什 么 是 注
36、 解 的 屬 性 一 個 注 解 相 當 于 一 個 胸 牌 , 如 果 你 胸 前 貼 了 胸 牌 , 就 是 傳 智 播 客 的 學 生 , 否 則 , 就 不 是 。 如 果 還想 區(qū) 分 出 是 傳 智 播 客 哪 個 班 的 學 生 , 這 時 候 可 以 為 胸 牌 在 增 加 一 個 屬 性 來 進 行 區(qū) 分 。 加 了 屬 性 的標 記 效 果 為 : MyAnnotation(color=red)l 定 義 基 本 類 型 的 屬 性 和 應 用 屬 性 : 在 注 解 類 中 增 加 String color(); MyAnnotation(color=red)l 用 反
37、 射 方 式 獲 得 注 解 對 應 的 實 例 對 象 后 , 再 通 過 該 對 象 調(diào) 用 屬 性 對 應 的 方 法 MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class); System.out.println(a.color(); 可 以 認 為 上 面 這 個 MyAnnotation是 MyAnnotaion類 的 一 個 實 例 對 象 l 為 屬 性 指 定 缺 省 值 : String color() default yellow;l value屬 性 :
38、String value() default zxx; 如 果 注 解 中 有 一 個 名 稱 為 value的 屬 性 , 且 你 只 想 設 置 value屬 性 ( 即 其 他 屬 性 都 采 用 默 認 值 或 者你 只 有 一 個 value屬 性 ) , 那 么 可 以 省 略 value=部 分 , 例 如 : MyAnnotation(lhm)。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 為 注 解 增 加 高 級 屬 性l 數(shù) 組 類 型 的 屬 性int arrayAttr() default 1,2,3;MyAnnotation
39、(arrayAttr=2,3,4)如 果 數(shù) 組 屬 性 中 只 有 一 個 元 素 , 這 時 候 屬 性 值 部 分 可 以 省 略 大 括l 枚 舉 類 型 的 屬 性Gender gender() ;MyAnnotation(gender=Gender.MAN)l 注 解 類 型 的 屬 性 :MetaAnnotation annotationAttr() default MetaAnnotation(xxxx);MyAnnotation(annotationAttr=MetaAnnotation(“yyy”) )可 以 認 為 上 面 這 個 MyAnnotation是 MyAnno
40、taion類 的 一 個 實 例 對 象 , 同 樣 的 道 理 ,可 以 認 為 上 面 這 個 MetaAnnotation是 MetaAnnotation類 的 一 個 實 例 對 象 , 調(diào) 用 代碼 如 下 : MetaAnnotation ma = myAnnotation.annotationAttr();System.out.println(ma.value(); 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 體 驗 泛 型l Jdk 1.5以 前 的 集 合 類 中 存 在 什 么 問 題ArrayList collection = n
41、ew ArrayList();collection.add(1);collection.add(1L);collection.add(abc);int i = (Integer)arrayList.get(1);/編 譯 要 強 制 類 型 轉(zhuǎn) 換 且 運 行 時 出 錯 !l Jdk 1.5的 集 合 類 希 望 你 在 定 義 集 合 時 , 明 確 表 示 你 要 向 集 合 中 裝 哪 種 類 型的 數(shù) 據(jù) , 無 法 加 入 指 定 類 型 以 外 的 數(shù) 據(jù)ArrayList collection2 = new ArrayList();collection2.add(1);/*co
42、llection2.add(1L);collection2.add(“abc”);*/這 兩 行 代 碼 編 譯 時 就 報 告 了 語 法 錯 誤 int i2 = collection2.get(0);/不 需 要 再 進 行 類 型 轉(zhuǎn) 換l 泛 型 是 提 供 給 javac編 譯 器 使 用 的 , 可 以 限 定 集 合 中 的 輸 入 類 型 , 讓 編 譯 器擋 住 源 程 序 中 的 非 法 輸 入 , 編 譯 器 編 譯 帶 類 型 說 明 的 集 合 時 會 去 除 掉 “ 類型 ” 信 息 , 使 程 序 運 行 效 率 不 受 影 響 , 對 于 參 數(shù) 化 的 泛
43、型 類 型 , getClass()方 法 的 返 回 值 和 原 始 類 型 完 全 一 樣 。 由 于 編 譯 生 成 的 字 節(jié) 碼 會 去 掉 泛 型 的類 型 信 息 , 只 要 能 跳 過 編 譯 器 , 就 可 以 往 某 個 泛 型 集 合 中 加 入 其 它 類 型 的數(shù) 據(jù) , 例 如 , 用 反 射 得 到 集 合 , 再 調(diào) 用 其 add方 法 即 可 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 了 解 泛 型l ArrayList類 定 義 和 ArrayList類 引 用 中 涉 及 如 下 術(shù) 語 : 整 個 稱 為
44、 ArrayList泛 型 類 型 ArrayList中 的 E稱 為 類 型 參 數(shù) 變 量 整 個 ArrayList稱 為 參 數(shù) 化 的 類 型 ArrayList中 的 Integer稱 為 類 型 參 數(shù) 變 量 的 值 或 實 際 類 型 參 數(shù) ArrayList中 的 念 著 typeof ArrayList稱 為 原 始 類 型l 參 數(shù) 化 類 型 與 原 始 類 型 的 兼 容 性 : 參 數(shù) 化 類 型 可 以 引 用 一 個 原 始 類 型 的 對 象 , 編 譯 報 告 警 告 , 例 如 ,Collection c = new Vector();/可 不 可 以
45、 原 始 類 型 可 以 引 用 一 個 參 數(shù) 化 類 型 的 對 象 , 編 譯 報 告 警 告 , 例 如 ,Collection c = new Vector();/原 來 的 方 法 接 受 一 個 集 合 參 數(shù) , 新 的 類 型 也 要 能 傳 進 去 l 參 數(shù) 化 類 型 不 考 慮 類 型 參 數(shù) 的 繼 承 關(guān) 系 : Vector v = new Vector(); /錯 誤 !/不 寫 沒 錯 , 寫 了 就 是 明 知 故 犯 Vector v = new Vector(); /也 錯 誤 !l 編 譯 器 不 允 許 創(chuàng) 建 類 型 變 量 的 數(shù) 組 。 即
46、在 創(chuàng) 建 數(shù) 組 實 例 時 , 數(shù) 組 的 元 素 不能 使 用 參 數(shù) 化 的 類 型 , 例 如 , 下 面 語 句 有 錯 誤 : Vector vectorList = new Vector10;l 思 考 題 : 下 面 的 代 碼 會 報 錯 誤 嗎 ?Vector v1 = new Vector(); Vector v = v1; 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 泛 型 中 的 ? 通 配 符l 問 題 : 定 義 一 個 方 法 , 該 方 法 用 于 打 印 出 任 意 參 數(shù) 化 類 型 的 集 合 中 的 所 有
47、數(shù) 據(jù) , 該 方 法 如 何 定 義 呢 ?l 錯 誤 方 式 :public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/* cols.add(string);/沒 錯 cols = new HashSet();/會 報 告 錯 誤 ! */l 正 確 方 式 :public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);
48、/cols.add(string);/錯 誤 , 因 為 它 不 知 自 己 未 來 匹 配 就 一 定 是 Stringcols.size();/沒 錯 , 此 方 法 與 類 型 參 數(shù) 沒 有 關(guān) 系 cols = new HashSet();l 總 結(jié) : 使 用 ?通 配 符 可 以 引 用 其 他 各 種 參 數(shù) 化 的 類 型 , ?通 配 符 定 義 的 變 量 主 要 用 作 引 用 , 可 以 調(diào) 用 與 參 數(shù) 化 無關(guān) 的 方 法 , 不 能 調(diào) 用 與 參 數(shù) 化 有 關(guān) 的 方 法 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教
49、育 泛 型 中 的 ? 通 配 符 的 擴 展l 限 定 通 配 符 的 上 邊 界 : 正 確 : Vector x = new Vector();/?號 指 定 的 類 為 Number的子 類 錯 誤 : Vector x = new Vector();在 應 用 泛 型 時 可 以 使 用 extends限 定 符 , 并 且 可 以 用 /?號 指 定 的 類 為 Integer的 父 類 錯 誤 : Vector x = new Vector();l 提 示 : 限 定 通 配 符 總 是 包 括 自 己 。 ?只 能 用 作 引 用 , 不 能 用 它 去 給 其 他 變 量
50、賦 值Vector = new Vector();Vector x = y;上 面 的 代 碼 錯 誤 , 原 理 與 Vector x11 = new Vector();相 似 ,只 能 通 過 強 制 類 型 轉(zhuǎn) 換 方 式 來 賦 值 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 泛 型 集 合 類 的 綜 合 案 例l 能 寫 出 下 面 的 代 碼 即 代 表 掌 握 了 Java的 泛 型 集 合 類 : HashMap hm = new HashMap(); hm.put(zxx,19); hm.put(lis,18); SetMap.
51、Entry mes= hm.entrySet(); for(Map.Entry me : mes) System.out.println(me.getKey() + : + me.getValue(); l 對 在 jsp頁 面 中 也 經(jīng) 常 要 對 Set或 Map集 合 進 行 迭 代 :$entry.key:$entry.value 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 通 過 反 射 獲 得 泛 型 的 參 數(shù) 化 類 型l 示 例 代 碼 :Class GenericalReflection private Vector dates
52、= new Vector(); public void setDates(Vector dates) this.dates = dates; public static void main(String args) Method methodApply = GenericalReflection.class.getDeclaredMethod(applyGeneric, Vector.class); ParameterizedType pType = (ParameterizedType) (methodApply .getGenericParameterTypes()0; System.ou
53、t.println(setDates( + (Class) pType.getRawType().getName() + ) ); l 泛 型 DAO的 應 用 : public abstract class DaoBaseImpl implements DaoBase protected Class clazz;public DaoBaseImpl() Type type = this.getClass().getGenericSuperclass();ParameterizedType pt = (ParameterizedType) type;this.clazz = (Class) p
54、t.getActualTypeArguments()0;System.out.println(clazz = + this.clazz); public class ArticleDaoImpl extends DaoBaseImpl implements ArticleDao 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 類 加 載 器與 普 通 程 序 不 同 的 是 , Java程 序 ( class文 件 ) 并 不 是 本 地 的 可 執(zhí) 行程 序 。 當 運 行 Java程 序 時 , 首 先 運 行 JVM( Java虛 擬 機 ) , 然
55、 后再 把 Java class加 載 到 JVM里 頭 運 行 , 負 責 加 載 Java class的 這部 分 就 叫 做 Class Loader。 中 文 叫 做 類 加 載 器 。l Java虛 擬 機 中 可 以 安 裝 多 個 類 加 載 器 , 系 統(tǒng) 默 認 三 個 主 要 類 加 載器 , 每 個 類 負 責 加 載 特 定 位 置 的 類 :BootStrap,ExtClassLoader,AppClassLoaderl 類 加 載 器 也 是 Java類 , 因 為 其 他 是 java類 的 類 加 載 器 本 身 也 要 被類 加 載 器 加 載 , 顯 然 必
56、 須 有 第 一 個 類 加 載 器 不 是 不 是 java類 , 這正 是 BootStrap。 l Java虛 擬 機 中 的 所 有 類 裝 載 器 采 用 具 有 父 子 關(guān) 系 的 樹 形 結(jié) 構(gòu) 進 行組 織 , 在 實 例 化 每 個 類 裝 載 器 對 象 時 , 需 要 為 其 指 定 一 個 父 級 類裝 載 器 對 象 或 者 默 認 采 用 系 統(tǒng) 類 裝 載 器 為 其 父 級 類 加 載 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 類 裝 載 器一 般 類 加 載 器 的 加 載 過 程 如 下 : l調(diào) 用 find
57、LoadedClass() 來 查 看 是 否 存 在 已 裝 入 的 類 。 2如 果 沒 有 , 那 么 獲 取 class文 件 的 原 始 字 節(jié) 。 ( 通 過 IO從 文 件 系 統(tǒng) , 來 自網(wǎng) 絡 的 字 節(jié) 流 等 ) l如 果 已 有 原 始 字 節(jié) , 調(diào) 用 defineClass() 將 它 們 轉(zhuǎn) 換 成 Class 對 象 。 l如 果 沒 有 原 始 字 節(jié) , 然 后 調(diào) 用 findSystemClass() 查 看 是 否 從 本 地 文 件 系統(tǒng) 獲 取 類l如 果 resolve 參 數(shù) 是 true, 那 么 調(diào) 用 resolveClass() 解
58、 析 Class 對 象 。 l如 果 還 沒 有 類 , 返 回 ClassNotFoundException。 l否 則 , 將 類 返 回 給 調(diào) 用 程 序 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 類 加 載 器 之 間 的 父 子 關(guān) 系 和 管 轄 范 圍 圖BootStrapExtClassLoaderAppClassLoaderItcastClassLoaderMyClassLoaderSystemclassLoader JRE/lib/rt.jarJRE/lib/ext/*.jarCLASSPATH指 定 的所 有 jar或
59、目 錄傳 智 播 客 指 定 的特 殊 目 錄 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 類 加 載 器 的 委 托 機 制l 當 Java虛 擬 機 要 加 載 一 個 類 時 , 到 底 派 出 哪 個 類 加 載 器 去 加 載 呢 ?首 先 當 前 線 程 的 類 加 載 器 去 加 載 線 程 中 的 第 一 個 類 。如 果 類 A中 引 用 了 類 B, Java虛 擬 機 將 使 用 加 載 類 A的 類 裝 載 器 來 加 載 類B。 還 可 以 直 接 調(diào) 用 ClassLoader.loadClass()方 法 來 指 定 某
60、個 類 加 載 器 去 加載 某 個 類 。l 每 個 類 加 載 器 加 載 類 時 , 又 先 委 托 給 其 上 級 類 加 載 器 。當 所 有 祖 宗 類 加 載 器 沒 有 加 載 到 類 , 回 到 發(fā) 起 者 類 加 載 器 , 還 加 載 不 了 ,則 拋 ClassNotFoundException, 不 是 再 去 找 發(fā) 起 者 類 加 載 器 的 兒 子 , 因為 沒 有 getChild方 法 , 即 使 有 , 那 有 多 個 兒 子 , 找 哪 一 個 呢 ?對 著 類 加 載 器 的 層 次 結(jié) 構(gòu) 圖 和 委 托 加 載 原 理 , 解 釋 先 前 將ClassLoaderTest輸 出 成 jre/lib/ext目 錄 下 的 itcast.jar包 中 后 , 運 行 結(jié) 果 為ExtClassLoader的 原 因 。 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 動 態(tài) 代 理 的 工 作 原 理 圖 高 級 軟 件 人 才 實 作 培 訓 專 家 ! 北 京 傳 智 播 客 教 育 結(jié) 束 語 熱 烈 歡 迎 各 軟 件 公 司 到 傳 智播 客 公 司 預 定 和 招 聘 軟 件 開 發(fā)人 才 ! 謝 謝 !
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中西方家庭教育的對比ppt課件
- 《運籌學教程》第五版運籌學6對策論矩陣對策課件
- (部編版)統(tǒng)編版四年級語文下冊第2課《鄉(xiāng)下人家》ppt課件
- 全等三角形1--公開課一等獎ppt課件
- 《會跳舞樹葉娃娃》課件
- 9兒童詩兩首_人教版五年級的語文下冊課件
- 綠色植物是食物之源(我的課件)0
- 河南專版2022春八年級語文下冊第四單元16慶祝奧林匹克運動復興25周年習題課件新人教版
- 全國xx杯說課大賽機械類一等獎作品:鉗工車模的制作說課ppt課件
- 六年級下冊數(shù)學ppt課件-總復習(1)數(shù)的認識-整數(shù)∣北師大版
- 牛頓第二定律優(yōu)秀完整公開課ppt課件
- 調(diào)脂與卒中防治課件
- 點到平面的距離課件
- 聚焦新醫(yī)改形勢下的醫(yī)院發(fā)展戰(zhàn)略
- 四肢血管超聲基礎