標籤:
/*
包:包就是java中的檔案夾,一個檔案夾就對應java中的一個包。包表現在具體的作業系統(如Windows)中,就是一個
檔案夾。是用來存放類檔案的即.class檔案,也可以存放其他的子包,即包中有包。
在JAVA的世界中,沒有什麼源檔案,核心的檔案就是.class檔案,即java運行檔案。檔案夾就是包。帶壓縮的檔案夾
就是Jar包。
總的原則是:
1、一個java源檔案(即.java檔案)中可以定義多個類(即class),該源檔案在編譯的時候,每一個類都會形成一個
.class檔案,包括內部類在內。
2、含有main方法的類(即public static void main(String[] args))是可以獨立啟動並執行類,即不需要依靠其他類
的調用,直接交給JVM,就可以被JVM啟動並執行類。沒個類都可以作為主類。一個程式有多個主類也可以,但一般沒有
這樣設計的,一般堅持一個程式只有一個程式入口。
3、一個Java源檔案中(即.java檔案)中只可以有一個公用類(即被public修飾的類)。因為有這樣一條規定,如果
一個源檔案中存在一個公用類,則源檔案名稱必須和該公用類同名,否則編譯時間就會報錯。所以,當一個Java源檔案中
有多個公用類時,檔案名稱就不知道該和哪個公用類名稱一致了。所以java源檔案中不允許出現兩個以上的公用類,
最多隻能有一個公用類,可以沒有,沒有公用類時,java源檔案的名稱可以任意命名,可以與源檔案中定義的某個類
的名稱相同,也可以與源檔案中的任何類的名稱都不相同,任意命名,編譯時間都會通過。
4、而位於同一個java源檔案中的類也位於同一個包中。
經過編譯後,就不存在源檔案了,程式變成由一個個類檔案組成,而這一個個類檔案又被放在檔案夾中,即被包
所管理。
————————**由於有了包之後,類也就有了公用類和預設類之分,公用類是可以突破包的封裝隱藏,而暴露除去,給其他包中的
類所使用的公用類。而預設類(即沒有被任何修飾的類),只能在本包中被使用,被引用,即時是父包中的類也
無法引用。**
帶包的源檔案的編譯和運行方法:
帶包的源檔案的編譯:用Javac直接編譯即可。如果沒有用建立檔案的javac命令編譯,則編譯出的.class檔案不能
被JVM所找到識別。必須手動建立檔案夾(即包),按照源檔案中包的定義,建立出檔案夾目錄,將.class檔案放入
其中,然後再用JVM運行主類,而運行時需要主類的完全名稱,即包名.類名。並且需要設定classpath路徑,在
classpath中找完沒有,在當前檔案夾下找,尋找的方式按照包名.類名的方式,每一個包名是一個檔案夾,所以
會在classpath所顯示的路徑下及當前路徑下(如果classpath帶有;),按照包名——檔案夾名,包名——檔案夾名,
類名——.class檔案名稱的方式尋找。最後一個.之前的都是包名,如果尋找不到就會報錯。
帶包的類的運行方法:必須用完全類名來引用類,即用包名.類名的方式。JVM(java虛擬機器)尋找該類的方式
和上面描述的一致,按照包名對應檔案夾名,類名對應.class檔案名稱的方式尋找,找到則載入,當然還有檢查
許可權是否足夠大。
注意:我認為預設包機制,是沒有包名的,即所在檔案夾即根目錄即時預設包。沒有定義包的類,都是在根目錄下
即預設包中。
補充:javac編譯器和java運行器的工作,都不可能離開jvm,java虛擬機器相當於一個小的java作業系統。但這個
Java作業系統必須運行在其他動作系統之上,即屬於一種寄生作業系統。而java語言寫的源檔案(即.java檔案)和
java的運行檔案(即.class檔案)都只有JVM能夠識別,即只有java虛擬機器能夠識別Java語言和運行java語言編譯
後的位元組碼檔案。其他動作系統不行,沒有該功能。windows和Linux都不行,除非內嵌了java虛擬機器的功能。
————————**javac和java運行器,這些工具程式,都是用java語言開發的程式,所以本質上都是一些java的.class類檔案,而
這些類檔案需要通過jvm來啟動並執行,所以是調用Jvm的功能,通過jvm來進一步調用使用宿主作業系統的底層功能。
而classpath是給JVM使用的,是JVM在尋找.java檔案和.class檔案中的類時,依據的尋找路徑。所以編譯的時候
也會同樣使用到classpath環境變數,編譯一個.java檔案時,如果.java檔案中用到了其他類,JVM會依據classpath
環境變數中設定的路徑依次尋找該類的.class檔案或者源檔案.java檔案,若找到.class檔案則直接使用,若找
到.java檔案則先編譯成.class檔案後使用。即本質上JVM使用的是.class檔案,而不是.java檔案,來形成當前需要
編譯的.java檔案的.class類檔案。**
建立方法: 用關鍵字package來建立,包名一律用小寫。
eg. package pack;
包的作用:
1、包是對類檔案的管理
2、包是為了區分同名類檔案而引入的命名空間(即名稱空間)。
3、包也是一種封裝。
注意:所以本質上類的名稱為:包名.類名 ,這個稱為類的完全限定名,也稱為完全類名。
包的建立要位於一個java檔案(即源檔案)的第一行。因為要先有包檔案,然後再有類檔案。對於沒有顯示用package
關鍵字建立包的類檔案,則採用預設java預設包機制,即將java源檔案所在的目前的目錄作為一個預設包。
將.class檔案放在裡面,所以就會看到之前編譯後的類檔案和java源檔案是在一個檔案夾下的。
Dos命令列建立帶有包(即檔案夾)的類檔案時,需要使用帶參數的javac語句,即 javac -d 目錄 Test.java。
這樣編譯後會將Test.class檔案放到Test.java中package語句所定義的包(檔案夾)中。
用java運行類時,必須要帶有包名,否則找不到類。
java允許包中有包,是因為那麼多的類檔案需要分層分類管理。包下的子包,就是一種分層管理。
包對於類的封裝,體現為將一部分功能相似的類或者有某些關係的類放到一個包中,同時通過關鍵字public,protected
將某些類及類中的方法提供出去,而某些類作為包的內部使用,不對外提供。
eg. 1、對於包與包之間類的訪問,必須將包中的類
例如:
【表 1】:基於類的封裝,對類中成員的隱藏程度的設定,形成了類中成員的許可權。
<java中類成員的許可權和各許可權的作用範圍>
一個java源檔案中的一處代碼是否可以訪問(引用)某個類中的成員。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
不同類中的成員是否可以訪問(引用)就依照該表,即在一個java源檔案中是否可以出現該成員的名稱
成員許可權修飾符:public|protected|default(沒有該關鍵字,什麼都不寫就是預設許可權) | private
(作用範圍:)|| |
同一個類中成員ok|ok|ok | ok
同一個包中的類中成員ok|ok|ok |
不同包中子類和父類中成員ok|ok| |
不同包中的非子父的兩個類中成員ok|| |
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
注意:表 1 的使用是需要參照 表 2 的,即表1 中的情況是建立在類的訪問沒問題的基礎上,對類中成員的訪問是否可以。
如果類的訪問就不行,那成員就更白扯了,就更不行了,無論是什麼許可權。
【表 2】:基於包的封裝,對包中類的隱藏程度的設定,形成了包中類的許可權。
<java中類的許可權和各許可權的作用範圍>
一個java源檔案中的一處代碼是否可以訪問(引用)某個類。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
不同的類之間是否可以訪問(引用)就依照該表,即在一個java源檔案中是否可以出現該類的名稱
類許可權修飾符:public | default(沒有該關鍵字,什麼都不寫就是預設許可權)
(作用範圍:)|
同一個包中的類ok|ok
不同包中的類ok|
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
*/
class Demo
{
}
class PackDemo2
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
java包及許可權總結