執(zhí)手麥田的咖啡空間  
          專注于Java的學(xué)習(xí)研究
          公告
          • 于喧鬧網(wǎng)界之中,尋一處僻靜之所,與三二好友,品程序、論思想,其樂(lè)何融融!
            執(zhí)手麥田的咖啡館——在這里關(guān)注JAVA的學(xué)習(xí)研究
          日歷
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          留言簿(2)

          隨筆分類(13)

          隨筆檔案(13)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

           

           

          1,什么都別說(shuō),先跟著我來(lái)做一把
          我們先找一個(gè)目錄,比如C:\myjob
          然后我們建立兩個(gè)目錄,一個(gè)叫做src,一個(gè)叫做bin
          C:\myjob>md src
          C:\myjob>md bin
          C:\myjob>dir
           驅(qū)動(dòng)器 C 中的卷是 LIGHTNING
           卷的序列號(hào)是 3DD1-83D9
           C:\myjob 的目錄
          2005-12-25  14:33    <DIR>          .
          2005-12-25  14:33    <DIR>          ..
          2005-12-25  14:34    <DIR>          src
          2005-12-25  14:34    <DIR>          bin
                         0 個(gè)文件              0 字節(jié)
                         4 個(gè)目錄    305,123,328 可用字節(jié)
          C:\myjob>
          然后我們?cè)趕rc目錄中去寫程序
          C:\myjob>cd src
          C:\myjob\src>
          我們寫這么4個(gè)java文件
          ////A.java
          package com.lightning;
          public class A{
          {System.out.println("com.lightning.A");}
          }
          ////B.java
          package com.lightning;
          public class B{
          {System.out.println("com.lightning.B");}
          }
          ////C.java
          package com;
          public class C{
          {System.out.println("com.C");}
          }

          ////Test.java
          package net.test;
          import com.lightning.*;
          import com.*;
          public class Test{
          public static void main(String[] args)
          {
                  new A();new B();new C();
                  System.out.println("net.test.Test");
          }
          }
          寫好之后就是這樣

          C:\myjob\src>dir
           驅(qū)動(dòng)器 C 中的卷是 LIGHTNING
           卷的序列號(hào)是 3DD1-83D9

           C:\myjob\src 的目錄

          2005-12-25  14:34    <DIR>          .
          2005-12-25  14:34    <DIR>          ..
          2005-12-25  14:39                86 A.java
          2005-12-25  14:40                86 B.java
          2005-12-25  14:42               194 Test.java
          2005-12-25  14:43                68 C.java
                         4 個(gè)文件            434 字節(jié)
                         2 個(gè)目錄    305,106,944 可用字節(jié)

          然后我們建立com目錄,com\lightning\目錄,net\test\目錄
          C:\myjob\src>md com
          C:\myjob\src>md com\lightning
          C:\myjob\src>md net\test\
          我們將Test.java放入net\test\中去
          將A.java,B.java放入com\lightning\中去
          將C.java放入com\中去
          C:\myjob\src>move Test.java net\test\
          C:\myjob\src>move A.java com\lightning\
          C:\myjob\src>move B.java com\lightning\
          C:\myjob\src>move C.java com\

          然后我們?cè)赾:\myjobs中發(fā)令:
          C:\myjob\src>cd ..
          C:\myjob>javac -sourcepath src -d bin src\net\test\Test.java
          然后我們看看bin目錄中多了什么
          C:\myjob>dir bin /s
           驅(qū)動(dòng)器 C 中的卷是 LIGHTNING
           卷的序列號(hào)是 3DD1-83D9

           C:\myjob\bin 的目錄

          2005-12-25  14:34    <DIR>          .
          2005-12-25  14:34    <DIR>          ..
          2005-12-25  14:46    <DIR>          net
          2005-12-25  14:46    <DIR>          com
                         0 個(gè)文件              0 字節(jié)

           C:\myjob\bin\net 的目錄

          2005-12-25  14:46    <DIR>          .
          2005-12-25  14:46    <DIR>          ..
          2005-12-25  14:46    <DIR>          test
                         0 個(gè)文件              0 字節(jié)

           C:\myjob\bin\net\test 的目錄

          2005-12-25  14:46    <DIR>          .
          2005-12-25  14:46    <DIR>          ..
          2005-12-25  14:46               520 Test.class
                         1 個(gè)文件            520 字節(jié)

           C:\myjob\bin\com 的目錄

          2005-12-25  14:46    <DIR>          .
          2005-12-25  14:46    <DIR>          ..
          2005-12-25  14:46    <DIR>          lightning
          2005-12-25  14:46               338 C.class
                         1 個(gè)文件            338 字節(jié)

           C:\myjob\bin\com\lightning 的目錄

          2005-12-25  14:46    <DIR>          .
          2005-12-25  14:46    <DIR>          ..
          2005-12-25  14:46               354 A.class
          2005-12-25  14:46               354 B.class
                         2 個(gè)文件            708 字節(jié)

               所列文件總數(shù):
                         4 個(gè)文件          1,566 字節(jié)
                        14 個(gè)目錄    305,057,792 可用字節(jié)

          然后我們執(zhí)行,同樣在c:\myjobs\下發(fā)令
          C:\myjob>java -cp bin net.test.Test
          com.lightning.A
          com.lightning.B
          com.C
          net.test.Test

          2,從實(shí)踐到理論

          剛才我用一個(gè)非常簡(jiǎn)單但是非常完整的例子給大家演示了java的package機(jī)制。
          為什么以前腦海里面那么簡(jiǎn)單的javac會(huì)搞得這么復(fù)雜呢?

          實(shí)際上它本就這么復(fù)雜,
          并不是一個(gè).java,一行javac一個(gè)當(dāng)前目錄中的class這么簡(jiǎn)單。

          首先我要打破一些東西,然后才好建立一些東西。
          javac并非只是給一個(gè).java編譯一個(gè)class的。javac自帶有make機(jī)制,也就是說(shuō),如果在
          javac的參數(shù)中java文件使用到的任何類,javac首先會(huì)去找尋這個(gè)類的class文件存在與否
          ,如果不存在,就會(huì)在sourcepath中找尋源代碼文件來(lái)編譯。

          什么是sourcepath呢?sourcepath是javac的一個(gè)參數(shù),如果你不加指定,那么sourcepath
          就是classpath。

          比如我們裝好jdk之后,我說(shuō)過(guò)不要設(shè)定classpath環(huán)境變量,因?yàn)榇蟛糠秩艘坏┰O(shè)定了
          classpath,不是多此一舉把什么dt.jar放進(jìn)去。(我可以好好打擊你一下,告訴你一個(gè)可
          悲的事實(shí)——jre永遠(yuǎn)不會(huì)從你這個(gè)classpath中去尋找dt.jar。你完全是徒勞的!)就是
          把"."搞不見(jiàn)了,搞得是冷水一盆盆的往自己身上潑,腦袋一點(diǎn)點(diǎn)的漲大。

          不要設(shè)!classpath沒(méi)有你想象中那么普適和強(qiáng)大,它只是命令行的簡(jiǎn)化替代品。
          你不設(shè)的話它就是"."。


          回到sourcepath,sourcepath指的是你源代碼樹(shù)的存放地點(diǎn)。
          為什么是源代碼樹(shù)?而不是一個(gè)目錄的平板源代碼呢?
          請(qǐng)大家將原本腦海中C的編譯過(guò)程完全砸掉!
          java完全不同,java沒(méi)有頭文件,每個(gè).java都是要放在源代碼樹(shù)中的。
          那么這顆樹(shù)是怎么組織的呢?
          對(duì)了,就是package語(yǔ)句。
          比如寫了package com.lightning;
          那么這個(gè).java就必須放在源代碼樹(shù)根\的com\lighting\之下才行。

          很多浮躁的初學(xué)者被default打包方式寵壞了。自我為中心,以為java就是一套庫(kù),自己寫
          的時(shí)候最多import進(jìn)來(lái)就行了,代碼從不打包,直接javac,直接java,多么方便。
          孰不知自己寫的這個(gè).java也不過(guò)是java大平臺(tái)的其中一個(gè)小單元而已。如果不打包,
          我寫一個(gè)Point,你寫一個(gè)Point,甚至更有甚者敢于給自己的類起名叫String等等。
          全部都在平板式的目錄中,那jre該選哪一個(gè)?

          一旦要使用package語(yǔ)句,就要使用代碼樹(shù)結(jié)構(gòu),當(dāng)然,你要直接javac,也行。
          不過(guò)javac出來(lái)的這個(gè)class要放在符合package結(jié)構(gòu)的目錄中才能發(fā)揮正常作用,否則就是
          廢物一坨。
          而且,如果你這個(gè).java還用到其它自己寫的有package語(yǔ)句的.java,那這個(gè)方法就回天乏
          術(shù)了。

          按照sun的想象,應(yīng)該是寫好的.java放在符合package結(jié)構(gòu)的目錄中,package語(yǔ)句保證了
          正確放置,如果目錄位置和package語(yǔ)句中指示的不同,則會(huì)出錯(cuò)。

          所以按照剛才我們的那種package寫法,我們必然要將那幾個(gè).java文件放入相應(yīng)的目錄中
          才能讓javac順利找到他們來(lái)make。

          有人說(shuō)javac可不可以像java那樣 java aaa.bbb.c...java?
          不可以
          javac中的那個(gè).java文件參數(shù)必須是一個(gè)文件系統(tǒng)的路徑文件名形式。
          然后如果用到其它的.java,javac會(huì)根據(jù)目前的sourcepath出發(fā)尋找目錄結(jié)構(gòu)中的那些
          java文件。

          當(dāng)然了,既然打了包,在使用的時(shí)候。
          要么寫全名——包名.類名
          或者使用import
          不得不提的是,import就好比c++的using,它不負(fù)責(zé)做文件操作,它只是方便你寫代碼。

          另外import語(yǔ)句中的*代表的是類名,不代表包名片斷。
          你import com.*;
          編譯器仍然找不到com.lightning中的任何類。
          反之亦然。
          就好象你告訴編譯器,我這里面要用到姓諸葛的人。
          那么姓諸的人當(dāng)然編譯器不會(huì)認(rèn)為也包含在內(nèi)。


          所以,如果程序一旦寫到一定規(guī)模。
          就不得不使用ant來(lái)管理這些。
          或者使用IDE,否則jdk就真的變成了java developer killer。

          但是對(duì)于初學(xué)者,在了解為什么會(huì)有ant之類的之前,還是要體會(huì)一下使用
          jdk的艱辛。

          這個(gè)和以前在unix上開(kāi)發(fā)的人用gcc命令行到后來(lái)使用make之后使用ide
          之類的時(shí)候的體會(huì)是類似的。

          最后,javac的-d參數(shù)是指示編譯出來(lái)的class文件放在哪里的,如果你不指定的話,它們
          和.java混在一起。當(dāng)然也符合目錄結(jié)構(gòu)。

          posted on 2007-04-29 14:19 執(zhí)手麥田 閱讀(2757) 評(píng)論(1)  編輯  收藏 所屬分類: 咖啡館
          評(píng)論:
          • # re: JAVA中的PACKAGE機(jī)制——(好文轉(zhuǎn)帖)  無(wú) Posted @ 2012-09-16 10:26
            是不是少了一步:在編譯Test.java前,必須逐個(gè)逐個(gè)編譯A.java,B.java.C.java???  回復(fù)  更多評(píng)論   

           
          Copyright © 執(zhí)手麥田 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 湖南省| 赤城县| 九龙县| 横峰县| 双牌县| 金溪县| 高陵县| 东乌| 潮安县| 富平县| 芷江| 开原市| 河北区| 延寿县| 平阳县| 溧水县| 社旗县| 呼和浩特市| 云南省| 繁峙县| 武安市| 宜阳县| 广平县| 贞丰县| 柘城县| 兴和县| 邹平县| 桓仁| 临朐县| 大方县| 社会| 浦江县| 海丰县| 大城县| 定陶县| 扶沟县| 昌邑市| 厦门市| 常熟市| 塔河县| 白城市|