1. 程式人生 > >菜雞的Java筆記 第二十八 包的定義

菜雞的Java筆記 第二十八 包的定義

包的主要作用以及定義
    包的匯入操作
    系統常見的開發包
    jar 程式命令
    
    包的定義
        在任何的作業系統之中都有一個統一的共識:同一個目錄下不能夠存在有相同的檔名稱
        但是在實際的開發之中又不可能出現不重名的情況
        所以為了解決這樣的衝突問題,在專案裡面往往會引用包的概念,而所謂的包儲存的就是一個資料夾
        也就是說在不同的目錄中可以存放有相同的檔案
        如果要想在javac中定義包,直接使用 package 關鍵字即可
        範例:定義包

    package cn.mldn.demo; // 包名稱
    public class packageDefinition{
        public static void main(String args[]){
            System.out.println("浪");
        }
    }

           
            一旦程式中聲明瞭包,那麼就必須生成的*.class 檔案儲存在包裡面
            這個包並不是手工建立的,在java裡面考慮到了使用者開發所需要的種種情況,所以專門提供有打包編譯的操作
        範例:打包編譯
            開啟控制檯.......
            java -d . Hello.java
            
            在以上的編譯命令中有兩個引數:
                "-d" :生成目錄,預設情況下是根據 package 定義的內容生存


                "." :生成程式的儲存路徑,如果設定為 "." 表示當前目錄下儲存
            此時如果程式有包了,那麼在解釋程式ude時候必須加上包名稱,也就是說此時的 packageDefinition 類包執行
            java cn.mldn.demo.packageDefinition

            
            所有的java專案開發過程之中,程式類必須要有包的定義才可以使用,沒有包的類不存在。而類的完整名稱“包.類”
            
    
    包的匯入操作
        利用程式包可以將一個很多的 *.class 類歸類儲存起來,但是這樣一來就有可能出現包與包之間進行類的互相呼叫問題
        所以此時就可以利用 import 語句來解決
        範例:定義一個 cn.mldn.util.Message 的類

    package cn.mldn.util; // 包名稱
    class Message{
        public String getInfo(){
            return "..................";
        }
    }

           
        範例:定義一個 packageDefinition

    package cn.mldn.test;
    import cn.mldn.util.Message; // 匯入其他包的類
    public class packageDefinition{
        public static void main(String args[]){
            Message msg = new Message();
            System.out.println(msg.getInfo);
        }
    }

 

            現在的程式肯定是需要進行編譯,但是從理論上來講應該先編譯 Message.java ,而後再編譯 packageDefinition.java
            於是按照此順序編譯
            編譯出錯: Message 在 cn.mldn.util 中不是公共的:無法從外部程式包對其進行訪問
            之所以造成此問題,是因為此時的 Message 類的定義中使用的是預設的訪問控制權限,而這個許可權的特點是指同一包中的類可以互相訪問
            但是不能夠被外包所訪問,所以學習完包的定義之後對於程式碼也可以進行一些規範化要求:
            以後寫的類都要寫在包中,而包中的  *.java 檔案 裡面只會有一個 public class 宣告
            總結:關於 public class 與 class 宣告類的區別?
                public class 定義要求檔名稱與類名稱保持一致,而在 *.java 檔案之中只允許有一個 public class 定義,如果該類要被不同的包所使用,則必須使用 public class 宣告
                class 定義的類檔名稱可以與類名稱不一致,但那是在編譯之後每個 class 宣告的類都會生成一個 *.java 檔案,此類只能夠在一個包中使用
                
        範例:修改Message 類的定義

    package cn.mldn.util; // 包名稱
    public class Message{
        public String getInfo(){
            return "..................";
        }
    }

           
            現在發現多個程式編譯的時候要考慮編譯順序,那麼這實在是太麻煩了,所以為了方便編譯,可以使用“*.java”進行自動順序編譯:javac -d . *.java
            
        但是現在的程式碼出現了兩個問題:
            問題一:每次都是單獨匯入特定的類:
                import cn.mldn.util.Message;
                在進行匯入的時候都需要寫上完整的類名稱,那麼假設說現在在 cn.mldn.util 包中存在有500個類,並且本次專案需要匯入20個類,難道要寫20個 import 嗎?
                這樣就很麻煩了。所以可以使用萬用字元“*”完成: import cn.mldn.util.*;
                使用 import 包.* 的情況並不會將一個包中所有的類都匯入進來,包括所謂的類載入的時候實際上只會載入所需要的類,不需要的類不載入
            問題二:有可能在同一個程式中匯入不通過的包,但是這不同的包有相同的類,現在模擬環境:
                現在有類一: cn.mldn.util.Message;
                現在有類二:com.yootk.Message;
                

    package cn.mldn.util; // 包名稱
    public class Message{
        public void show(){
            System.out.println("------------------");
        }
    }

       
                隨後編譯第二個 Message 程式類: javac -d . Message.java
                範例:在 packageDefinition 類中由於某種需要同時匯入了兩個包

    package cn.mldn.test;
    import cn.mldn.util.*; // 匯入其他包的類
    import com.yootk.*;
    public class packageDefinition{
        public static void main(String args[]){
            Message msg = new Message();
            System.out.println(msg.getInfo);
        }
    }

                   
                結果出錯
                為了避免使用中的類衝突,那麼就建議在操作類的時候直接寫上類的完整名稱
                範例:使用完整名稱避免錯誤

    package cn.mldn.test;
    import cn.mldn.util.*; // 匯入其他包的類
    import com.yootk.*;
    public class packageDefinition{
        public static void main(String args[]){
            cn.mldn.util.Message msg = new cn.mldn.util.Message();
            System.out.println(msg.getInfo);
        }
    }

                   
                    這種情況在開發之中一定會出現許多次,所以用的時候就寫上完整名稱
                    編寫順序: package, import, public class
            
    系統常見包
        java 的開發類庫非常的龐大,而開發包也非常的多,比較常見的幾個包如下:
            java.lang:像 Object,String Intger,Number 都是這個包中定義的,從JDK 1.1 開始自動匯入
            java.reflect:反射開發包,直接與框架開發有關係
            java.util: java的 工具包
            java.regex:正則表示式的開發包
            java.text:國際化程式支援包
            java.io:資料流的開發包(Input,Output),前提是要弄懂抽象類就差不多學會這個包
            java.net:網路程式設計包
            java.spl:資料庫的程式設計包
            java.awt,javax.swing:影象介面開發包
                java在JDK1.0 的時候只提供有java.的 開發包,這個開發包可以實現影象介面的開發,最初的設計較為倉促要大量的使用Windows的系統函式
                在JDK 1.2(java2)推出了輕量級的元件,有了swing開發元件
            java.applet.*:是在網頁上嵌入的java程式,是java發展的標誌

    jar 命令
        當一個專案開發完成之後,雖然不同功能的類要要存在不同的包裡面,但是這裡面也會出現一個問題,你不可能將所有的*.class 檔案給使用者
        往往有可能是若干個*.class檔案完成某一特定的功能組合,那麼如果要更新也只會更新這幾個檔案
        所以在實際的專案中為了方便管理,往往會利用jar檔案負責處理
        範例:;現在有個packageDefinition。java類

    package cn.mldn.util;
    public class packageDefinition{
        public String getInfo(){
            return "**************";
        }
    }

            1.進行打包編譯:javac -d . packageDefinition.java;
            2.將開發包打成 pd。jar 檔案:jar -cvf pd.jar cn
            打成的pd.jar 檔案可以通過rar壓縮檔案開啟,而後在這個檔案裡面會存在有一個資料夾:META-INF/MANFEST.MF
            3.當程式打包完成之後肯定需要進行程式碼的執行,肯定需要編寫測試類

    package cn.mldn.test;
    public class packageDefinition{
        public static void main(String args[]){
            cn.mldn.util.Message msg = new cn.mldn.util.Message();
            System.out.println(msg.getInfo);
        }
    }
    //出錯

                   
            實際上每個jar檔案都是一個獨立的路徑,所以要想讓jar檔案起作用,必須配置CLASSPATH,但是CLASSPATH 中有一個“.” ,所以如果要想配置多個CLASSPATH 使用“;”分割
            SET CLASSPATH = .;(檔案目錄)
            
            以上的配置只能夠在當前命令列中使用,如果要想讓其成為全域性的配置,則需要修改環境屬性
            如果現在只使用記事本開發程式,那麼所有需要的第三方的*.jar 檔案啊都必須在環境屬性配置
            
            
    總結
        1.以後的程式都要寫上 package 打包
        2.import 語句往往不需要編寫,前提:使用開發工具
        3.jar命令是最好用的,比開發工具提供的好用