<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    執手麥田的咖啡空間  
    專注于Java的學習研究
    公告
    • 于喧鬧網界之中,尋一處僻靜之所,與三二好友,品程序、論思想,其樂何融融!
      執手麥田的咖啡館——在這里關注JAVA的學習研究
    日歷
    <2012年9月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    導航

    留言簿(2)

    隨筆分類(13)

    隨筆檔案(13)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     

     

     

    1,什么都別說,先跟著我來做一把
    我們先找一個目錄,比如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。你完全是徒勞的!)就是
    把"."搞不見了,搞得是冷水一盆盆的往自己身上潑,腦袋一點點的漲大。

    不要設!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-04-29 14:19 執手麥田 閱讀(2752) 評論(1)  編輯  收藏 所屬分類: 咖啡館
    評論:
    • # re: JAVA中的PACKAGE機制——(好文轉帖)   Posted @ 2012-09-16 10:26
      是不是少了一步:在編譯Test.java前,必須逐個逐個編譯A.java,B.java.C.java???  回復  更多評論   

     
    Copyright © 執手麥田 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 国产在线观看xxxx免费| 国产成人精品日本亚洲专| 中美日韩在线网免费毛片视频| 免费精品国产日韩热久久| 亚洲一级毛片免观看| 99久久这里只精品国产免费| 亚洲国产精品xo在线观看| 97在线线免费观看视频在线观看| 亚洲av永久无码嘿嘿嘿| AV免费网址在线观看| 亚洲AV无码资源在线观看| 国产麻豆免费观看91| 国产亚洲精品仙踪林在线播放| 免费中文字幕在线观看| fc2成年免费共享视频网站| 亚洲性猛交XXXX| 男人的天堂网免费网站| 亚洲黄色免费网址| 国产片AV片永久免费观看| 亚洲欧美中文日韩视频| 四虎永久在线免费观看| jizz在线免费观看| 久久亚洲精品人成综合网| 无码人妻一区二区三区免费手机| 亚洲欧美不卡高清在线| 亚洲美女在线国产| 四虎国产精品永久免费网址| 亚洲一区二区三区免费在线观看| 免费观看美女裸体网站| 国产精品免费αv视频| 亚洲视屏在线观看| 国产男女猛烈无遮档免费视频网站| 国产裸体美女永久免费无遮挡| 亚洲AV无码一区二区二三区入口| 曰曰鲁夜夜免费播放视频| 色欲色欲天天天www亚洲伊| 亚洲理论电影在线观看| 大地资源免费更新在线播放| 一级白嫩美女毛片免费| 亚洲一区中文字幕在线观看| 国产成人亚洲精品影院|