本課程解釋瞭如何將類和接口捆綁到包中,如何使用包中的類,以及如何安排文件系統以便編譯器能夠找到源文件。java
爲了使類型更易於查找和使用,避免命名衝突和控制訪問,程序員將相關類型的組捆綁到包中。程序員
定義:包是一組提供訪問保護和名稱空間管理的相關類型,請注意,類型引用類、接口、枚舉和註解類型,枚舉和註解類型分別是特殊的類和接口,所以在本課中一般將類型簡稱爲類和接口。
做爲Java平臺一部分的類型是按功能捆綁類的各類包的成員:基礎類在java.lang
中,用於讀寫的類(輸入和輸出)在java.io
中,依此類推,你也能夠將類型放入包中。編程
假設你編寫了一組表示圖形對象的類,例如圓形、矩形、線條和點,你還能夠編寫一個Draggable
接口,若是類可使用鼠標拖動,則能夠實現這個接口。segmentfault
//in the Draggable.java file public interface Draggable { ... } //in the Graphic.java file public abstract class Graphic { ... } //in the Circle.java file public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file public class Point extends Graphic implements Draggable { . . . } //in the Line.java file public class Line extends Graphic implements Draggable { . . . }
你應該將這些類和接口捆綁在一個包中,緣由有多種,包括:編程語言
要建立包,請爲包選擇一個名稱,將包含該名稱的package
語句放在每一個源文件的頂部,該文件包含要包含在包中的類型(類、接口、枚舉和註解類型)。code
package
語句(例如,package graphics;
)必須是源文件中的第一行,每一個源文件中只能有一個package
語句,它適用於文件中的全部類型。對象
若是將多個類型放在單個源文件中,則只有一個能夠是公共的,而且它必須與源文件具備相同的名稱,例如,你能夠在文件Circle.java
中定義public class Circle
,在文件Draggable.java
中定義public interface Draggable
,在文件Day.java
中定義public enum Day
,依此類推。能夠在與公共類型相同的文件中包含非公共類型(強烈建議這樣作,除非非公共類型很小且與公共類型密切相關),但只有公共類型能夠從包外部訪問,全部頂級非公開類型都將是包私有。接口
若是將上一節中列出的圖形接口和類放在名爲graphics
的包中,則須要六個源文件,以下所示:開發
//in the Draggable.java file package graphics; public interface Draggable { . . . } //in the Graphic.java file package graphics; public abstract class Graphic { . . . } //in the Circle.java file package graphics; public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file package graphics; public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file package graphics; public class Point extends Graphic implements Draggable { . . . } //in the Line.java file package graphics; public class Line extends Graphic implements Draggable { . . . }
若是不使用package
語句,則類型最終會出如今未命名的包中,通常來講,一個未命名的包只適用於小型或臨時應用程序,或者剛剛開始開發過程,不然,類和接口屬於命名包。get
隨着全世界程序員使用Java編程語言編寫類和接口,不少程序員可能會對不一樣類型使用相同的名稱,事實上,前面的例子就是這樣:當java.awt
包中已經有一個Rectangle
類時,它定義了一個Rectangle
類,儘管如此,編譯器容許兩個類在不一樣的包中具備相同的名稱。每一個Rectangle
類的徹底限定名稱包括包名稱,也就是說,graphics
包中Rectangle
類的徹底限定名稱是graphics.Rectangle
,java.awt
包中Rectangle
類的徹底限定名是java.awt.Rectangle
。
除非兩個獨立的程序員爲其包使用相同的名稱,不然這頗有效,是什麼防止了這個問題?公約。
包名稱所有小寫,以免與類或接口的名稱衝突。
公司使用其反向的互聯網域名來開始其包名 — 例如,com.example.mypackage
用於由example.com
的程序員建立的名爲mypackage
的包。
在單個公司內發生的名稱衝突須要經過公司內的約定來處理,多是經過在公司名稱後面包含區域或項目名稱(例如,com.example.region.mypackage
)。
Java語言自己的包以java.
或javax.
開頭。
在某些狀況下,互聯網域名可能不是有效的包名,若是域名包含連字符或其餘特殊字符,若是包名稱以數字或其餘字符開頭,這些字符非法用做Java名稱的開頭,或者若是包名稱包含保留的Java關鍵字,例如「int
」,則會發生這種狀況,在這種狀況下,建議的約定是添加下劃線,例如:
域名 | 包名稱前綴 |
---|---|
hyphenated-name.example.org | org.example.hyphenated_name |
example.int | int_.example |
123name.example.com | com.example._123name |
要爲類型建立包,請將package
語句做爲包含類型(類、接口、枚舉或註解類型)的源文件中的第一個語句。
要使用不一樣包中的公共類型,你有三種選擇:(1)使用類型的徹底限定名稱,(2)導入類型,(3)導入類型爲成員的整個包。
包的源文件和類文件的路徑名稱反映了包的名稱。
你可能必須設置CLASSPATH
,以便編譯器和JVM能夠找到類型的.class
文件。