? ? ????這次字?jǐn)?shù)又超了膘侮,發(fā)表不了塔嬉,所以把后面一些剪切過來了玩徊,費(fèi)了好半天勁重新調(diào)整了一下格式,嗚嗚~下次要長記性啦谨究!字?jǐn)?shù)過多就換一篇文章來寫~
????07-面向?qū)ο?包package)
????????什么叫包呢恩袱?
????????我們來思考一下~
????????我們會發(fā)現(xiàn),在進(jìn)行Java程序開發(fā)的時候胶哲,會寫出很多Java文件畔塔。同時,編譯之后會產(chǎn)生很多的類文件。
????????那么當(dāng)類文件產(chǎn)生之后就會出現(xiàn)很多的問題澈吨。
????????比如把敢,當(dāng)類的內(nèi)容不一樣,而類的名稱重復(fù)時谅辣,在一個文件夾下只能存在一個類文件修赞。我們需要對它們用文件夾進(jìn)行區(qū)分,而這個文件夾在Java中通過包表示桑阶。而Java中的包也就是文件系統(tǒng)中的文件夾亿扁。
????????所以娘荡,包:
? ??????1臀晃,對類文件進(jìn)行分類管理苹丸。
? ? ? ? 2,給類提供多層命名空間包归。
????????原來呢锨推,這個文件叫Demo.class。后來因?yàn)橛袃蓚€Demo.class公壤,所以將它們分別存了换可。一個Demo.class存到A文件夾中去了,一個Demo.class存到B文件夾中去了厦幅。
????????這個時候說沾鳄,我想用一下Demo.class,那么要用的是哪一個呢确憨?
????????所以這個時候就要指明译荞,我要A的Demo.class。所以這個時候Demo.class又多了一層擴(kuò)展名稱 A.Demo.class休弃。
????????比如吞歼,日本有秋名山塔猾,臨潼也有秋名山得湘,我們要去秋名山,那到底是哪一個呢市埋?所以要說清楚托呕,我們要去臨潼的秋名山~
?????????3拗军,寫在程序文件的第一行。
????????包名所有的字母都是小寫掌腰。
? ??????4伦忠,類名的全程是 包名.類名吨娜。
????????舉例:
????????編譯绊起,生成了一個class文件:
????????可是運(yùn)行之后發(fā)現(xiàn)出現(xiàn)了類名錯誤:
????????注意,有了包名之后许布,類名的全稱就是包名.類名辣~
????????改一下:
????????可是怎么還是錯啦?
????????噢噢绎晃,原來是我沒有pack這個文件夾呀蜜唾。
????????所以新建一個pack文件夾:
????????并把PackageDemo.class移動到它的里面杂曲。
????????再次執(zhí)行:
????????OK啦!
????????但是袁余,如果每次都得自己新建文件夾擎勘,經(jīng)過幾次之后是不是都要瘋啦!
????????源文件當(dāng)中是不是已經(jīng)明確了包呀泌霍?那我們讓自己生成包货抄,是不是才是最爽噠述召?
????????接下來注意看哦朱转,我們要改一下啦。在編譯的時候积暖,如果源文件當(dāng)中帶著package這樣的關(guān)鍵字定義包的話藤为,在編譯的時候就需要做一件事情,叫做:加參數(shù)夺刑。我們都知道缅疟,一個命令就是一個功能,這個命令如果加了參數(shù)遍愿,就是加了輔助功能存淫。
????????編譯,發(fā)現(xiàn)自動生成了pack文件夾:
????????這時再運(yùn)行沼填,OK啦:
????????也可以不指定當(dāng)前目錄桅咆,我們換一個位置:
????????這個位置就會新建一個pack文件夾:
????????我們發(fā)現(xiàn),包的出現(xiàn)有一個好處坞笙,可以讓Java的類文件(源文件)和Java的運(yùn)行文件相分離岩饼。當(dāng)對方想要拿我程序的時候,我只需要將運(yùn)行程序拷給他就可以用啦薛夜,沒必要將源文件給他籍茧。
????????接著上一步,我們運(yùn)行:
????????發(fā)現(xiàn)掛啦梯澜,當(dāng)前目錄下沒有這個類寞冯。
????????我們可以把目錄切到C盤那個目錄下,但也可以不那么做晚伙,有其他方法:
????????set classpath一下简十。注意,我們只要指定到包的父目錄即可撬腾,后面不必跟pack螟蝙,pack和PackageDemo.class是一個整體~
?? ? ? 5,包也是一種封裝形式民傻。
????08-面向?qū)ο?包與包之間訪問)
? ? ? ? 不同包中的類該如何訪問呢胰默?
????????packa包:
????????pack包:
? ? ? ? 按照我們以前的寫法场斑,是這樣創(chuàng)建DemoA的的對象并調(diào)用show方法的。?
????????試著編譯運(yùn)行牵署。
? ? ? ? 應(yīng)該先編譯DemoA(否則它還沒有漏隐,PackageDemo怎么調(diào)用呢~):
????????這一步OK啦。
????????接著編譯PackageDemo:
????????錯誤原因:類名寫錯奴迅。
????????注意青责,類名不是DemoA哦,類名的全名應(yīng)該是packa.DemoA取具。(包名.全名)
????????改一下:
????????繼續(xù)編譯:
????????還是錯啦脖隶,不過提示變了,說這個軟件包不存在暇检。
????????錯誤原因:packa包不在當(dāng)前目錄下产阱,需要設(shè)置classpath,告訴jvm去哪里找指定的packa包块仆。
????????OK~我們set classpath一下构蹬,編譯,還是錯了:
? ? ? ? 錯誤原因:有了包悔据,范圍變大庄敛,一個包中的類要被訪問,必須要有足夠大的權(quán)限科汗,所以被訪問的類要被public修飾藻烤。DemoA的權(quán)限不夠大,需要將它設(shè)置成public肛捍。
????????改成public:
????????類的修飾符只有兩種隐绵,默認(rèn)或者public。
????????改完之后重新編譯一下DemoA拙毫,然后編譯PackageDemo:
????????還是有錯依许,不過只剩一個啦。
????????錯誤原因:類公有后缀蹄,被訪問的成員也要公有才可以被訪問峭跳。
????????所以這個show方法也要用public修飾一下:
????????再依次講兩個類編譯,這次終于沒錯啦缺前,運(yùn)行:
????????成功啦蛀醉!
?????????總結(jié)一下:
?????????包與包之間進(jìn)行訪問,被訪問的包中的類以及類中的成員衅码,都需要被public修飾拯刁。
????????不過有一種特殊情況哦。
????????用例子來說明逝段。
????????packb包:
????????packa包中垛玻,我們可以用DemoA來繼承DemoB:
????????依次編譯DemoB割捅、DemoA、PackageDemo帚桩,然后運(yùn)行起來啦:
????????有趣的事情來啦亿驾,接下來,我可不可以不建立DemoA的對象账嚎,直接建立DemoB的對象呢莫瞬?
????????運(yùn)行一下,發(fā)現(xiàn)也行呢:
? ? ? ? 我們發(fā)現(xiàn)郭蕉,packa包中的類和pack包中的類區(qū)別不太大呀疼邀?它們都能訪問packb包中的類。DemoA為什么還有繼承DemoB呢恳不,沒意思了呀檩小,哼开呐!
????????#Java小劇場:
????????PackageDemo:哈哈哈哈烟勋,我不把人家叫爸爸我也可以用人家的類呢,哈哈哈哈筐付。
????????DemoA:嗚嗚嗚嗚~
????????#
????????所以卵惦,Java就給不同包中的子類提供了一個特殊權(quán)限。就是瓦戚,你認(rèn)我為父沮尿,你就能夠拿到一些別人拿不到的東西。
????????這個特殊權(quán)限就是较解。畜疾。。噔噔噔噔印衔!protected權(quán)限啡捶!
????????這個權(quán)限就是保護(hù)權(quán)限。
????????我們現(xiàn)在依然在pack包中直接訪問packb包中的DemoB奸焙,編譯運(yùn)行一下:
????????出錯啦瞎暑。
????????#Java小劇場:
????????DemoB:你必須是我鵝子我才可以叫你訪問,否則与帆。了赌。。哼玄糟!
????????PackageDemo:嗚嗚嗚嗚~
????????#
????????現(xiàn)在用親兒子來訪問它:
????????編譯運(yùn)行:
????????OK的啦勿她。
????????#Java小劇場:
????????DemoA:爸比對我最好啦!有爸比就是不一樣~
????????DemoB:么么噠( ? 3?)?
????????#
?????????總結(jié):
? ? ? ? 不同包中的子類還可以直接訪問父類中被protected權(quán)限修飾的成員阵翎。
?????????注意:包與包之間可以使用的權(quán)限只有兩種:public protected逢并。
????????接下來說一下幾種訪問權(quán)限在不同情境中的訪問情況:
????????關(guān)于覆蓋:
????????現(xiàn)在packb包中有兩 類播揪,想在PackageDemo中全部建立對象訪問:
????????怎么做呢?
????????這樣可以嗎:
????????不可以筒狠。
????????我們說猪狈,類變成公有之后,類名必須和Java文件名保持一致辩恼。
????????現(xiàn)在有兩個公有類雇庙,Java文件名到底用什么呢?
?????????注意:一個.java文件中灶伊,不能出現(xiàn)兩個及以上的公有類和接口疆前。
????????那怎么辦呢?
? ? ? ? 將這兩個類分別存在兩個.java文件中聘萨,但它們依然都是屬于packb哦:
????????分別編譯:
????????都被放在packb文件夾中啦:
竹椒,
????????搞定~
????????另外,我們這個包還可以有多層次米辐,包里面還可以有包~
????????比如:
????????編譯后:
????????注意一下目錄胸完,是不是多層的呀,最里面一個文件夾里就是DemoC.class文件啦翘贮。
????????這叫多層包目錄赊窥。這非常多見的,對類進(jìn)行逐級管理~
????09-面向?qū)ο?導(dǎo)入import)
????????還是用上面的例子:
????????現(xiàn)在想在PackageDemo中建立DemoC的對象狸页,這樣可以嗎:
????????不可以锨能。
????????應(yīng)該寫上包名:
????????但是這樣建立對象也太費(fèi)勁了叭!
????????接下來介紹一個關(guān)鍵字芍耘,是因需求而來的關(guān)鍵字哦址遇,它可以幫我們簡化類名的書寫:import(導(dǎo)入)。
????????import:導(dǎo)入的是包中的類斋竞。
????????一個例子:
????????這樣在當(dāng)前包中可以創(chuàng)建DemoA的對象倔约,這個沒有問題。那可以創(chuàng)建DemoZ的對象嗎窃页?不可以哦跺株。
????????因?yàn)閷?dǎo)入的是packb中的類,而haha是packb包中的包脖卖。
????????如果想要創(chuàng)建DemoZ對象乒省,就必須這樣導(dǎo)入:
????????一定要區(qū)分清楚哦。
????????像這種通配符*的寫法:
????????在實(shí)際開發(fā)中其實(shí)不建議用哦畦木。
????????因?yàn)橛锌赡苓@個包中有十個類袖扛,我們只需要使用其中一個類,那把這一個類導(dǎo)入就行啦。需要用到包中的哪個類蛆封,就導(dǎo)入哪個類唇礁。
????????但是這樣會不會有點(diǎn)麻煩呢?
????????不用擔(dān)心惨篱。
????????以后我們開發(fā)用的都是高級的編譯器(Eclipse之類)盏筐,不會用記事本的。在高級的編譯器中砸讳,package是不用自己寫的琢融,import也是不用自己寫的,全都是自動導(dǎo)入簿寂。
????????注意:如果導(dǎo)入了兩個包漾抬,這兩個包中有同名的類,那在調(diào)用類的時候常遂,類前面必須寫上包名哦纳令!
????????那定義包名的時候該怎么定義呢?
????????我們想想定義包的初衷是什么:方便管理克胳、避免類重名平绩。
????????所以建立定義包名不要重復(fù),可以使用url來完成定義毯欣,url是唯一的馒过。
????????像這樣:
? ? ? ? 在一個程序中臭脓,不寫import可以嗎酗钞?
????????可以的。
????????不寫import的時候来累,我們使用到其他包中的類砚作,可以按照全類名方式來寫。而import只是可以簡化類名的書寫嘹锁。
????10-面向?qū)ο?jar包)
????????Java中也有它的壓縮包葫录,這個壓縮包就是Jar包。
????????Java壓縮包需要一個jdk中的工具來完成领猾,這個工具就叫做jar.exe米同。
????????一個例子:
????????編譯運(yùn)行:
????????這是jar的一些用法:
????????創(chuàng)建packa包和pack包的壓縮包:
????????創(chuàng)建好啦:
????????這個壓縮包中有兩個包(文件夾):packa和pack。
????????我們來查看一下它里面的內(nèi)容:
????????注意:這個是jar包生成后自動生成的一個文件夾摔竿。這個文件夾里面存放了一個配置清單文件面粮,這個配置清單文件里的數(shù)據(jù)我們是可以改動的,改動完這個jar包會有一些特殊的意義继低,或者特殊的操作方式熬苍。
????????我們現(xiàn)在先不對這個進(jìn)行深入了解,在講圖形界面的時候會對它有一些涉獵。
????????現(xiàn)在我們把pack和pakca文件夾都刪掉柴底。
????????試著運(yùn)行一下婿脸,掛啦:
????????我們想一想,打壓縮包的意義就是這兩個壓縮包的父目錄變成了jar包柄驻,而不是原先的C盤的myclass狐树。
????????我們重新set classpath一下:
????????再運(yùn)行,OK啦:
????????下次拿到一個jar包鸿脓,我們只需要將jar包定義到classpath中褪迟,這樣jar包中的東西我們就都可以用啦。
????????其他的一些用法:
????????顯示詳細(xì)信息:
????????更詳細(xì)了答憔,還有時間:
????????將a.jar包中的詳細(xì)信息寫在c盤中的1.txt文件中:
????????將c盤的詳細(xì)內(nèi)容寫在c盤的2.txt文件中:
? ? ? ? 后半部分講的我覺得不是很需要味赃,所以就木有仔細(xì)聽,也有點(diǎn)繁瑣虐拓。有提到native:本地方法心俗,這種方法是調(diào)用了系統(tǒng)(當(dāng)前所用系統(tǒng),比如說Windows)蓉驹,所以看不到方法體城榛。