隨筆 - 100  文章 - 50  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          我們先找一個目錄,比如C:\myjob
          然后我們建立兩個目錄,一個叫做src,一個叫做bin
          C:\myjob>md src
          C:\myjob>md bin
          C:\myjob>dir
          驅動器 C 中的卷是 LIGHTNING
          卷的序列號是 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 個文件 0 字節
          4 個目錄 305,123,328 可用字節
          C:\myjob>
          然后我們在src目錄中去寫程序
          C:\myjob>cd src
          C:\myjob\src>
          我們寫這么4個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
          驅動器 C 中的卷是 LIGHTNING
          卷的序列號是 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 個文件 434 字節
          2 個目錄 305,106,944 可用字節

          然后我們建立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中發令:
          C:\myjob\src>cd ..
          C:\myjob>javac -sourcepath src -d bin src\net\test\Test.java
          然后我們看看bin目錄中多了什么
          C:\myjob>dir bin /s
          驅動器 C 中的卷是 LIGHTNING
          卷的序列號是 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 個文件 0 字節

          C:\myjob\bin\net 的目錄

          2005-12-25 14:46 <DIR> .
          2005-12-25 14:46 <DIR> ..
          2005-12-25 14:46 <DIR> test
          0 個文件 0 字節

          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 個文件 520 字節

          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 個文件 338 字節

          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 個文件 708 字節

          所列文件總數:
          4 個文件 1,566 字節
          14 個目錄 305,057,792 可用字節

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

          2,從實踐到理論

          剛才我用一個非常簡單但是非常完整的例子給大家演示了java的package機制。
          為什么以前腦海里面那么簡單的javac會搞得這么復雜呢?

          實際上它本就這么復雜,
          并不是一個.java,一行javac一個當前目錄中的class這么簡單。

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

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

          比如我們裝好jdk之后,我說過不要設定classpath環境變量,因為大部分人一旦設定了
          classpath,不是多此一舉把什么dt.jar放進去。(我可以好好打擊你一下,告訴你一個可
          悲的事實–jre永遠不會從你這個classpath中去尋找dt.jar。你完全是徒勞的?。┚褪?br /> 把”.”搞不見了,搞得是冷水一盆盆的往自己身上潑,腦袋一點點的漲大。

          不要設!classpath沒有你想象中那么普適和強大,它只是命令行的簡化替代品。
          你不設的話它就是”.”。

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

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

          一旦要使用package語句,就要使用代碼樹結構,當然,你要直接javac,也行。
          不過javac出來的這個class要放在符合package結構的目錄中才能發揮正常作用,否則就是
          廢物一坨。
          而且,如果你這個.java還用到其它自己寫的有package語句的.java,那這個方法就回天乏
          術了。

          按照sun的想象,應該是寫好的.java放在符合package結構的目錄中,package語句保證了
          正確放置,如果目錄位置和package語句中指示的不同,則會出錯。

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

          有人說javac可不可以像java那樣 java aaa.bbb.c…java?
          不可以
          javac中的那個.java文件參數必須是一個文件系統的路徑文件名形式。
          然后如果用到其它的.java,javac會根據目前的sourcepath出發尋找目錄結構中的那些
          java文件。

          當然了,既然打了包,在使用的時候。
          要么寫全名–包名.類名
          或者使用import
          不得不提的是,import就好比c++的using,它不負責做文件操作,它只是方便你寫代碼。

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

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

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

          這個和以前在unix上開發的人用gcc命令行到后來使用make之后使用ide
          之類的時候的體會是類似的。

          最后,javac的-d參數是指示編譯出來的class文件放在哪里的,如果你不指定的話,它們
          和.java混在一起。當然也符合目錄結構。

          posted on 2007-08-30 10:18 fly 閱讀(160) 評論(0)  編輯  收藏 所屬分類: java學習
          主站蜘蛛池模板: 东光县| 莆田市| 仪陇县| 东平县| 洞口县| 孝义市| 眉山市| 民丰县| 宝丰县| 东乡族自治县| 沙雅县| 平定县| 咸宁市| 永德县| 建瓯市| 大英县| 嘉义市| 抚顺市| 十堰市| 浙江省| 武平县| 康平县| 大新县| 荆门市| 东乡县| 偃师市| 寿光市| 绥化市| 龙江县| 比如县| 宜都市| 博客| 梓潼县| 舞钢市| 阿合奇县| 溧水县| 邵阳市| 屯门区| 吉安市| 镇康县| 荥经县|