java-package与import 机制

上传人:f****u 文档编号:128293809 上传时间:2020-04-20 格式:PDF 页数:36 大小:524.93KB
返回 下载 相关 举报
java-package与import 机制_第1页
第1页 / 共36页
java-package与import 机制_第2页
第2页 / 共36页
java-package与import 机制_第3页
第3页 / 共36页
java-package与import 机制_第4页
第4页 / 共36页
java-package与import 机制_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《java-package与import 机制》由会员分享,可在线阅读,更多相关《java-package与import 机制(36页珍藏版)》请在金锄头文库上搜索。

1、第五章第五章 package 與與 import 機制機制 所謂的定律 也不過是目前尚未被人推翻的假設罷了 前言前言 許多對 Java 程式設計有興趣的初學者 多半到書店買一本 Java 程式設計 的 入 門 書 開 始 他 的Java程 式 設 計 之 旅 首 先 他 可 能 會 到 下載最新版本的 Java 2 SDK 將它安裝在自己的電 腦上 然後依照書本的指示 用文字編輯器輸入一個名為 HelloWorld java 的 Java 應用程式原始碼檔 熟悉 Java 的朋友當然可以順利通過編譯並成功地執 行 Java 應用程式 但是對初學者來說 當他鍵入 javac HelloWorld

2、 java 之後可能會編譯成功 產生 HelloWorld class 但是 接下來當他輸入 java HelloWorld 時 卻可能發現 java exe 跑出惱人的訊息 Exception in thread main java lang NoClassDefFoundError HelloWorld 如果是一位對命令列模式 console 沒有太多概念的初學者 可能連編譯這 一步都無法跨過 編譯時螢幕上會出現一大堆讓人不知如何下手的的錯誤訊息 因為這個進入 Java 程式設計領域的重大門檻 不知澆熄了多少 Java 初學 者的熱情 連簡單一個 Hello World 的 Java 程式

3、 想看到其執行結果都不是一 件簡單的事情了 想當然書本裡頭五花八門的程式設計議題都不再有意義 這兩 個門檻不知道阻礙了多少人學習 Java 程式設計 本章上半部分將假設您是一位第一次使用本章上半部分將假設您是一位第一次使用 Java 的朋友 所以內容的編排都 是為了要打破這進入門檻 讓大家可以快快樂樂地學習 的朋友 所以內容的編排都 是為了要打破這進入門檻 讓大家可以快快樂樂地學習 Java 程式設計 而下半 部分就稍微複雜了點 如果您希望深入了解運作細節 那麼您可以繼續看完後半 部分 沒興趣的話略過也無妨 程式設計 而下半 部分就稍微複雜了點 如果您希望深入了解運作細節 那麼您可以繼續看完後

4、半 部分 沒興趣的話略過也無妨 如果您曾試著使用 JBuilder 這種威力強大的開 發工具 您一定也會發現如果對於 Java 的 package 與 import 機制沒有妥善 的瞭解 那麼開發程式的時候一大堆的錯誤訊息一樣也會搞的您心煩意亂 希望 看完本篇之後 可以讓您更輕鬆駕馭像 JBuilder 這種高階開發工具 初探初探 package 與與 import 機制機制 進入 Java 程式設計領域的第一個門檻 就是要了解 Java 的 package 與 import 機制 每一位學習 Java 的人都必須對這個機制有切確的了解 底下我 們將假設您剛裝好 Java 2 SDK 於 d

5、jdk1 3 0 01 目錄之中 注意注意 package 與與 import 機制不會因為您用了新版的機制不會因為您用了新版的 JDK 而改變 如果您用的是而改變 如果您用的是 JDK 1 4 x 甚 至是以後更新版本的 甚 至是以後更新版本的 Java 2 SDK 都會產生與本章相同的結果 都會產生與本章相同的結果 並沒有修改任 何的環境變數 接著我們在 D 磁碟機根目錄底下新增一個名為 my 的空目錄 d my 並以這個空目錄作為我們討論的起始點 討論一討論一 首先 請您將目錄切換到 d my 底下 請先試著在命令列中輸入 java 或 javac 您的螢幕上可能會輸出錯誤訊息如下 這是

6、因為系統不知道到哪裡去找 java exe 或 javac exe 的緣故 所以您可以試 著輸入指令 path d jdk1 3 0 01 bin 然後您再重新輸入 java 或 javac 就會看到以下畫面 請注意 以上說明只是為了強調 path 環境變數的使用 事實上 幾乎大多 數版本的 JDK 都會於安裝時主動在 system32 底下複製 一份 java exe 而 system32 通常又是 Windows 預設 path 環境變數中的其中一個路徑 所以一般的情況下 都會發生可以執行 java exe 卻不能執行 javac exe 的情形 這小小的差異會產生微妙的差別 如果您閱讀過

7、本書第一章 他們之間的差異對您來說已經非常清楚 接下來 請您在 d my 目錄下新增兩個檔案 分別是 A java public class A public static void main String args B b1 new B b1 print B java public class B public void print System out println package test 接著請您在命令列輸入 javac A java 如果您的程式輸入無誤 那麼您就會在 d my 中看到產生了兩個類別檔 分別 是 A class 與 B class 請注意 javac exe 是我們

8、所謂的 Java 編譯器 它具有類似 make 的能力 舉例來說 我們的 A java 中用到了 B 這個類別 所以編譯器會自動幫您編譯 B java 反過來說 如果您輸入的指令是javac B java 由於 B java 中並沒有用 到類別 A 所以編譯器並不會自動幫您編譯 A java 編譯成功之後 請輸入指令 java A 您會看螢幕上成功地輸出 package test 在此推薦您一個非常好用的選項 verbose 您可以在 javac exe 或 java exe 中使用此選項 他可以讓您更了解編譯和執行過程中 JVM 所做的每件事情 如 果您在編譯的時候使用 verbose 選項

9、 結果如下 從這個選項 您可以發現 由於編譯器採用了 JDK 所在目錄底下那套 JRE 的緣 故 所以編譯時使用 lib rt jar 裡頭已經編譯好的核心類別函式 庫 第一章的時候我們提過 Java 編譯器也是用 Java 寫成的 您可以試著讓 javac exe使用其他JRE所在路徑之下的rt jar來進行編譯嗎 留給大家做個小 測驗 當您執行 Java 程式時 使用 verbose 選項的結果如下 省略 您可以發現 由於 java exe 根據預設的邏輯而選擇使用了 JDK 所在目錄底下那 套 JRE 來執行程式 所以執行時所載入的核心類別都是使用 lib rt jar 裡頭那些 您一定

10、覺得上述討論一的內容很簡單 您也可以做到 所以接下來我們要更 進一步 探究更複雜的機制 討論二討論二 請先刪除討論一中所產生的類別檔 接著修改您的兩個原始碼 使其內容為 A java import edu nctu public class A public static void main String args B b1 new B b1 print B java package edu nctu public class B public void print System out println package test 接著請您在命令列輸入 javac A java 如果您的程式輸入

11、無誤 那麼您會看到螢幕上出現了許多錯誤訊息 主要的錯誤 在於 A java 1 package edu nctu does not exist 意思是說找不到 edu nctu 這個 package 其他兩個錯誤都是因為第一個錯誤 所衍生 可是不對呀 按照 Java 的語法 既然 B 類別屬於 edu nctu 所以我們在 B java 之中一開始就使用 package edu nctu 而 A 類別用到了 B 類別 所以我們也在 A java 開頭加上了 import edu nctu 所以這段程式在理論上應該不會發生編譯錯誤才是 為了解決這個問題 請您在 d my 目錄下建立一個名為 ed

12、u 的目錄 在 edu 目 錄 下 再 建 立 一 個 名 為 nctu 的 子 目 錄 然 後 將 B java 移 至移 至 d my edu nctu 目錄下 請重新執行 javac verbose A java 如果操作無誤 那麼您的螢幕上會顯示底下訊息 注意 如果您在 d my 底下仍保有原本的 B java 則會產生底下錯誤訊息 從這個輸出您可以發現 編譯器總是先到 A java 本身所在的路徑中尋找 B java 雖然編譯器找到了 B java 可是比對過其 package 宣告之後 認為 它應該位於 edu nctu 目錄下 不該在此目錄下 因此產生錯誤訊息 這個動 作在本章後

13、面會有更詳細的解釋 不管如何 這次終於編譯成功了 您會在 d my 目錄下找到 A class 也會在 d my edu nctu 目錄下找到編譯過的 B class 編譯成功之後 請輸入指令 java A 您會看到螢幕上輸出 package test 程式順利地執行了 接這著咱們做個測試 請將 d my edu nctu 目錄下的 B class 移除 重新執行 java A 螢幕上會輸出錯誤訊息 意思是說 java exe 無法在 edu nctu 這個目錄下找到 B class 完成了這 個實驗之後 請將剛剛移除的 B class 還原 以便往後的討論 到此處 我們得到了兩個重要的結論

14、結論一 如果您的類別屬於某個 package 那麼您就應該將它至於該 package 所對應 的相對路徑之下 舉例來說 如果您有個類別叫做 C 屬於 xyz pqr abc 套件 那麼您就必須建立一個三層的目錄 xyz pqr abr 然後將 C java 或是 C class 放置到這個目錄下 才能讓 javac exe 或是 java exe 順利執行 其實這裡少說了一個重點 就是這個新建的目錄應該從哪裡開始 一定要從 d my 底下開始建立嗎 請大家將這個問題保留在心裡 我們將在底下的討論 之中為大家說明 結論二 當您使用 javac exe 編譯的時候 類別原始碼的位置一定要根據結論一

15、所說來 放置 如果該原始碼出現在不該出現的地方 如上述測試中 B java 同時存在 d my 與 d my edu nctu 之下 除了很容易造成混淆不清 而且有時候抓 不出編譯為何發生錯誤 因為 javac exe 輸出的錯誤訊息根本無法改善問題 在我們做進一步測試討論前 請再做一個測試 請將 d my edu nctu 目 錄下的 B class 複製到 d my 目錄中 執行指令 java A 您應當還是會看到螢幕上輸出 package test 但是此時如果您重新使用編譯指令 javac A java 重新編譯 A 類別 螢幕上會出現 bad class file B class c

16、lass file contains wrong class edu nctu B 的錯誤訊息 最 後 請 您 刪 掉 d my 底 下 剛 剛 複 製 過 來 的 B class 也 刪 除 d my edu nctu 目 錄 中 的 B java 也 就 是 讓 整 個 系 統 中 只 剩 下 d my edu nctu 目錄中擁有 B class 然後再使用指令 javac A java 您一定會發現 除了可以通過編譯之外 也可以順利地執行 在測試中 我們又得到了兩個結論 結論三 編譯時 如果程式裡用到其他的類別 不需要該類別的原始碼也一樣能夠通過編 譯 結論四 當您使用 javac exe 編譯程式卻又沒有該類別的原始碼時 類別檔放置的位置 應該根據結論一所說的方式放置 如果類別檔出現在不該出現的地方 如上述測 試中 B class 同時存在 d my 與 d my edu nctu 之下 有很大的可能性會 造成難以的編譯錯誤 雖然上述的測試中 使用 java exe 執行 Java 程式時 類別檔亂放不會造成執行錯誤 但是還是建議您儘量不要這樣做 除了沒有意義 之外 這種做法

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号