package、import、import static傻傻分不清楚

剛剛接觸代碼的童鞋肯定會對頭幾行出現(xiàn)的諸如:
package tempo;
import tempo.test;
import static java.lang.Math.*;
弄得不是特別明白,或者就直接忽略了。今天就想談?wù)勥@三個兄弟的區(qū)別,跟平時一樣先例出本文需要解決的問題。

  1. package是啥?有何作用?
  2. import又是什么意思,和package有何區(qū)別?
  3. import static有何import如何分別?

先來看第一個,package翻譯成中文就是包包的意思,很顯然這個包不是LV也不是Prada,那這里包是什么意思了?上大學(xué)的時候,我有個同學(xué)叫張偉,后來看愛情公寓里面也有個張偉,有個愛碎碎念的歌手也叫張偉,原來國內(nèi)叫張偉的人這么多。如果一個班上有兩個張偉,為便于區(qū)分我們可能會叫其中一個大張偉,另一個小張偉。同理,Java的開發(fā)中肯定有各式各樣的軟件開發(fā)商,他們會提供成千上萬具有各種用途的類,這些類也肯定會發(fā)生重名的時候。
針對這個問題,Java引入了包(package)機制,提供了類的多層命名空間即允許留在類名前面加一個或多個前綴來限定這個類,這樣便解決了類的命名沖突和類文件管理問題。另外Java允許將一組作用相關(guān)的類放在同一個包下,從而組成類庫單元,格式如下:
package packageName;
一旦在Java源文件中使用了package語句,就意味著該源文件里定義的所有類都屬于這個包,位于包中的每個類的完整命名都應(yīng)該是包名和類名的組合。如果有人想使用該包中的某個類,必須要用包名加類名做引用。看下面的代碼演示:

package示例代碼.JPG

上面的第一行代碼表明把Test類放在了Tempo包空間下。不過需要注意的是用cmd進行編譯時,不再是javac Test.java,而是下面一行指令:
javac -d . Test.java
注意“.”的前后有空格,-d用于設(shè)置編譯生成class文件的保存位置,這里是將他的class文件放在當前位置下面??墒钱斁幾g后發(fā)現(xiàn)當前路徑下沒有Test.class文件,而是多了一個名為Tempo的文件夾,其中就有Test.class文件,如下圖:

Tempo包的文件夾.JPG
Tempo包中的class文件.JPG

這里就與Java的設(shè)計有關(guān)。假設(shè)某個程序中有兩個Test類,引入包可以區(qū)分它們,同時這兩個類還分別對應(yīng)兩個不同的Test.class文件,它們在文件系統(tǒng)中必須分開存放才不會沖突。
注意圖中的Test.class必須放在Tempo包中才會生效,而用-d來編譯Java源文件會自動建立對應(yīng)的文件結(jié)構(gòu)來存放相應(yīng)的class文件。
接下來輸入java Tempo.Test指令來運行Test類,可以看到正常輸出了。

包差不多了,我們在來看第二個問題,import是什么?
解釋import之前,還想先說說package。package中可以包含一個子類,比如如果我想在Tempo包中定義一個子包,只需要輸入:
package Tempo.sub;
public class Ball{}
如果想調(diào)用Ball類,則必須要用全名(包名加類名)即Tempo.sub.Ball,與Tempo包中Test類不在同一個包下。雖然Tempo.sub是Tempo的子包,但在Test中如果想使用Ball類,不能省略前面的Tempo包路徑,即在Tempo.Test類中使用它不能寫成sub.Ball,必須寫成完整包加類名:Tempo.sub.Ball。所以,想創(chuàng)建Ball類的實例則必須采用如下代碼:
Tempo.sub.Ball ball = new Tempo.sub.Ball();
如上所示,如果需要使用不同包中的其他類時,總是需要使用該類的全名,這是一件很操蛋的事。
為了簡化編程,Java于是引入了import關(guān)鍵字,import可以在程序中一次導(dǎo)入某個指定包下的類,這樣就不必在每次用到該類是都書寫完整類名了,具體格式如下:
import 包名.類名;

使用import簡化代碼.JPG

如圖,當使用import語句導(dǎo)入子包中的Ball后,創(chuàng)建實例的時候前面的一溜Tempo.sub.Ball就可以省去不寫啦,是不是可以省去很多代碼了。

理解了import,在來看import static就非常簡單了,它是JDK1.5后增加的一種靜態(tài)導(dǎo)入的語法,用一句話來解釋兩者的區(qū)別便是:import可以省略寫包名;而使用import static則可以連類名都省略,兩者的目的都是為了減少程序中代碼編寫量,如下實例:

import static的用法.JPG

上面out是System類的靜態(tài)成員變量,代表標準輸出,因為import static可以直接使用了。

今天的內(nèi)容有點雜,希望說清楚了,有不明白的地方歡迎一起探討。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,741評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,281評論 6 342
  • 《魔法少女小圓》講了這樣一個故事:地球上有潛力的少女可以通過與QB簽訂契約,從而實現(xiàn)任何一個愿望,而代價是成為魔法...
    下雨天游園閱讀 2,336評論 2 7
  • 同學(xué),同讀本書,同聽教師的課,同吃一鍋飯,同唱一首歌,同踢一個球,因為平等,爭執(zhí)過后,握手言和,因為平等所以真誠。...
    塵緣1227閱讀 320評論 0 2

友情鏈接更多精彩內(nèi)容