手機(jī)技術(shù)交流

          funabmol

          關(guān)于Java包導(dǎo)入的一個(gè)奇怪問(wèn)題(轉(zhuǎn)貼至 孫鑫)

          這篇文章起源于程序員之家論壇(http://www.sunxin.org)上的一個(gè)網(wǎng)友的提問(wèn),我對(duì)他的問(wèn)題做了回答。具體網(wǎng)址:http://www.sunxin.org/bbs/dispbbs.asp?boardID=6&ID=12289&page=1

          我感覺(jué)這個(gè)問(wèn)題的答案對(duì)Java的初學(xué)者來(lái)說(shuō),會(huì)有一定的幫助,所以將問(wèn)題和答案整理成文。

          問(wèn)題

          首先新建一個(gè)目錄存放Java源文件,或者直接在某個(gè)盤符下放置程序,例如:D:",然后按照下面的步驟進(jìn)行實(shí)驗(yàn)(本實(shí)驗(yàn)在D:"目錄下操作)。

          Step1:編寫程序World.java,代碼如下:

          package a;

          public class World

          {

              public World()

              {

              System.out.println(", World!");

              }

          }

          Step2:編寫Hello.java,代碼如下:

          import a.World;

          public class Hello

          {

              public static void main(String[] args)

              {

                  System.out.print("Hello");

                  World world = new World();

              }

          }

          Step3:將兩個(gè)程序保存到你所建的目錄下,在這里,我們將它們保存到D:"下。

          Step4:編譯這兩個(gè)Java源文件

                 先編譯World.java,執(zhí)行javac -d . World.java,在D盤生成目錄a,及其中的World.class。接下來(lái)編譯Hello.java,執(zhí)行javac Hello.java,在D盤上生成Hello.class。

          Step5:運(yùn)行Hello

                 執(zhí)行java Hello,輸出Hello, World!目前一切正常。

          Step6:修改Hello.java

          將第1行的語(yǔ)句“import a.World;”改為“import a.*;”,重新編譯Hello.java,出現(xiàn)下面的錯(cuò)誤提示:

          錯(cuò)誤的類文件: ."World.java

          文件不包含類 World

          請(qǐng)刪除該文件或確保該文件位于正確的類路徑子目錄中。

                  World world = new World();

                  ^

          Step7:根據(jù)錯(cuò)誤提示進(jìn)行下列操作

          按照錯(cuò)誤提示,刪除 World.java 或者將 World.java 放到其他地方,則程序成功編譯運(yùn)行。

          問(wèn)題:

          請(qǐng)問(wèn)為何會(huì)出現(xiàn)Step6中的錯(cuò)誤呢?使用 import a.*;”導(dǎo)入a下所有類和接口,和使用“import a.World;”導(dǎo)入a包中具體的類,為何會(huì)產(chǎn)生上述的差異呢?

          回答

          當(dāng)你導(dǎo)入一個(gè)包中所有的類時(shí),javac在編譯時(shí)并不確定你要使用的World類是a包中的類,還是其他包中的類,它會(huì)根據(jù)你機(jī)器上的CLASSPATH環(huán)境變量的值去查找類,通常我們?cè)?/span>CLASSPATH中會(huì)設(shè)置一個(gè)點(diǎn)(.),表示當(dāng)前目錄,如果沒(méi)有CLASSPATH環(huán)境變量,那么在JDK1.4之后,默認(rèn)也是查找當(dāng)前目錄。javac在按照文件名(不包括后綴)來(lái)查找類,于是找到World.java,而這個(gè)文件根本不是字節(jié)碼文件,當(dāng)然就報(bào)錯(cuò)了。當(dāng)你導(dǎo)入一個(gè)具體的類時(shí),javac在分析源文件時(shí)就知道了你程序中用的類是a.World,那么它就在CLASSPATH環(huán)境變量下查找a目錄下的World類,正好有,于是正確執(zhí)行。

          為了幫助讀者對(duì)這個(gè)問(wèn)題加深理解,我給大家設(shè)計(jì)了下面的操作步驟(本文是在D盤上操作):

          1)將a目錄剪切到C:"下;
          2)再次執(zhí)行javac Hello.java,你會(huì)看到同樣的錯(cuò)誤。也就是證實(shí)了在出錯(cuò)之前,javac還沒(méi)有去查找a包中的類(對(duì)于包是否存在的驗(yàn)證已經(jīng)進(jìn)行)。
          3)執(zhí)行set classpath=c:"。由于你明確地設(shè)置了CLASSPATH環(huán)境變量的值,并且沒(méi)有包含點(diǎn)(.),因此javac不會(huì)再查找當(dāng)前的目錄。
          4)再次執(zhí)行javac Hello.java,你會(huì)發(fā)現(xiàn)成功執(zhí)行。

          這里面還有一個(gè)有趣的現(xiàn)象,如果我們將a目錄下的World.class刪除,替換為World.java,那么在編譯Hello.java時(shí),World也會(huì)被自動(dòng)編譯。

          posted on 2007-11-27 13:52 smart 閱讀(421) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: 關(guān)于Java包導(dǎo)入的一個(gè)奇怪問(wèn)題(轉(zhuǎn)貼至 孫鑫) 2007-11-27 21:57 隔葉黃鶯

          長(zhǎng)見(jiàn)識(shí),但未必長(zhǎng)知識(shí)。  回復(fù)  更多評(píng)論   



          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 霍山县| 农安县| 青浦区| 三台县| 平远县| 南昌县| 巫溪县| 莱阳市| 兴文县| 都匀市| 油尖旺区| 高邮市| 招远市| 安阳市| 泰顺县| 营山县| 霞浦县| 枣庄市| 瑞安市| 道真| 新竹县| 山丹县| 吴旗县| 米易县| 巴林右旗| 唐海县| 百色市| 镇赉县| 巴塘县| 旅游| 湘乡市| 海原县| 天台县| 蓝山县| 勐海县| 沙雅县| 都兰县| 铁岭县| 宾阳县| 河源市| 平乐县|