一、為什麼要引入package和import?
這個問題和c++中引入命名空間是一樣的,也是為了解決重名問題。java通過包機制來解決重名問題,也就相當于給重名的代碼加一系列字首,進而達到唯一辨別的作用。
二、如何解決重名問題?
這個就有點像外國人的名字:如果我叫Jeason,我爸叫Kevin,我爺爺叫Bob,我爺爺的爸爸叫Peter。
那麼如果沒有人和我同名(Jeason),那麼Jeason這個名字就能夠唯一辨別我了;而如果還有一個人也叫Jeason,那麼我就加上我爸爸的名字Kevin,我就
是Kevin Jeason;如果那個人他爸爸也叫Kevin,那麼我再加上我爺爺的名字,我就叫Bob Devin Jeason;如果他爸爸和爺爺的名字又和我爸爸和爺爺的
名字相同,那麼我再加上我爺爺的爸爸的名字,我就叫Peter Bob Kevin Jeason ...
這樣一來就解決了重名問題。
三、具體用法
在桌面上建立了一個Cat.java,内容為:
當然這樣是可以正确編譯運作的。
現在我再在前面加一個package,将這段代碼打包一下:
編譯通過,但是在執行程式時提示“錯誤:找不到或無法加載主類 Cat”。
為什麼會出現這個問題呢?因為我們已經将Cat類打包,系統自然無法找到Cat類。
那現在我再在桌面上建立一個Dog.java,内容為:
在編譯時會顯示:無法找到Cat類,還是同樣的問題;我們已經将Cat.java類打包了。
那麼我們如何才能通路到Cat.java類呢?
其實,在java語言中,package是和檔案的目錄相對應的,我們在寫程式的時候要随時将代碼與檔案聯系在一起。
我們在封裝類的時候,一般有這樣一個預設的準則,即仿照域名的格式,将域名倒過來打包類。
既然我們打包了類,而package又是和檔案對應,那麼我們就建立檔案夾把它放進去就行,将.class檔案放在.com/crazyacking/github/檔案夾下即可。

代碼變為:
這樣就能通路到Cat類了。但是,每次通路Cat類的時候前面都要寫這麼一大堆東西,不僅寫着麻煩,看着也煩,這時候import就派上用場了。
當然也可以将com.crazyacking.github中的全部子類都包含進來:
注意:“.*”隻可以包含該檔案夾下的類,但并不包括該檔案下的子檔案夾下的類。
通過package和import就可以完美的解決重名問題了。
四、相關拓展
如果我們包的路徑太過于複雜而且該包被經常調用,我們還可以直接将包所在的檔案夾路徑直接加到環境變量的ClassPath下面。
這樣一來,系統會首先根據ClassPath進行資源查找,避免了每次調用都要包含的問題。
另:在使用import來包含類時,包含的源代碼可能對運作産生影響,可以将源代碼移除,隻留.class檔案就行。