參考文獻(xiàn):《Java瘋狂講義》(第三版)
面向?qū)ο笾R(shí)點(diǎn)(下)
Java8增強(qiáng)的包裝類(lèi):
知識(shí)點(diǎn):
常量池用來(lái)專(zhuān)門(mén)管理在編譯時(shí)被確定并保存在已編譯的.class
文件中的一些數(shù)據(jù)。它包括了關(guān)于類(lèi)、方法绘搞、接口中的產(chǎn)量寥裂,還
包括字符串常量必指。
單例類(lèi)(單例模式)
定義:如果一個(gè)類(lèi)始終只能創(chuàng)建一個(gè)實(shí)例萤厅,則這個(gè)類(lèi)被稱(chēng)為單例
類(lèi)阎毅。
使用:將所有構(gòu)造器用private修飾目代,該類(lèi)還必須緩存已經(jīng)創(chuàng)建
的對(duì)象屈梁,否則該類(lèi)無(wú)法知道是否曾經(jīng)創(chuàng)建過(guò)對(duì)象,也就無(wú)法保證
之創(chuàng)建一個(gè)對(duì)象榛了。為此還需要使用一個(gè)成員變量(靜態(tài))來(lái)保存
曾經(jīng)創(chuàng)建的對(duì)象在讶,因?yàn)樵摮蓡T變量需要被上面的靜態(tài)方法訪問(wèn),
故該成員變量必須使用static修飾霜大。
final變量:
與普通成員變量不同的是构哺,final成員變量(包括實(shí)例
變量和類(lèi)變量)必須由程序員顯示初始化,系統(tǒng)不會(huì)對(duì)final成員
進(jìn)行隱式初始化
注:當(dāng)使用final修飾基本類(lèi)型變量時(shí)战坤,不能對(duì)基本類(lèi)型變量重新
賦值曙强。
知識(shí)點(diǎn):
final修飾符的一個(gè)重要用途就是定義“宏變量”。當(dāng)定義
final變量時(shí)就為該變量指定了初始值途茫,而且該初始值可以在編譯
時(shí)就確定下來(lái)碟嘴,那么這個(gè)final變量本質(zhì)上就是一個(gè)“宏變量”,
編譯器會(huì)把程序中所有用到該變量的地方直接替換成該變量的值
慈省。
知識(shí)點(diǎn):
Java會(huì)使用常量池來(lái)管理曾經(jīng)用過(guò)的字符串直接量臀防,例如執(zhí)
行String a=“java”,常量池中就會(huì)緩存一個(gè)字符串“java”
边败;如果程序再次執(zhí)行String b="java",系統(tǒng)會(huì)讓b直接指向常量
池中的“java”字符串袱衷,因此a==b將會(huì)返回true。
知識(shí)點(diǎn):
對(duì)于實(shí)例變量而言笑窜,既可以在定義該變量時(shí)賦初始值致燥,在這
三個(gè)地方指定初始值的效果基本一樣。但對(duì)于final實(shí)例變量而言
排截,只有在定義該變量時(shí)指定初始值才會(huì)有"宏變量"的效果
知識(shí)點(diǎn):
盲目亂用緩存也可能可能導(dǎo)致系統(tǒng)性能下降嫌蚤,緩存的對(duì)象就
會(huì)占用系統(tǒng)內(nèi)存辐益,如果某個(gè)對(duì)象只使用一次,重復(fù)使用的概率不
大脱吱,緩存該實(shí)例就會(huì)弊大于利智政;反之,如果某個(gè)對(duì)象需要頻繁的
重復(fù)使用箱蝠,緩存該實(shí)例就利大于弊续捂。
抽象類(lèi)Abstract
抽象方法和抽象類(lèi)規(guī)則如下:
1、抽象類(lèi)必須使用abstract修飾符來(lái)修飾宦搬,抽象方法也必須使
用abstract修飾符來(lái)修飾逾滥,抽象方法不能有方法體稚伍;
2为居、抽象類(lèi)不能被實(shí)例化教寂,無(wú)法使用new關(guān)鍵字來(lái)調(diào)用抽象類(lèi)的
構(gòu)造器創(chuàng)建抽象類(lèi)實(shí)例。(技巧:匿名內(nèi)部類(lèi)方法)
3憔足、抽象類(lèi)可以包含成員變量胁附、方法、構(gòu)造器四瘫、初始化塊汉嗽、內(nèi)部
類(lèi)(接口、枚舉)5種成份找蜜;
4饼暑、含有抽象方法的類(lèi)只能被定義為抽象類(lèi);
知識(shí)點(diǎn):abstract不能用于修飾成員變量洗做、局部變量弓叛、構(gòu)造器
接口:
知識(shí)點(diǎn):
接口里定義的內(nèi)部類(lèi)、內(nèi)部接口诚纸、內(nèi)部枚舉默認(rèn)都采用
public static 兩個(gè)修飾符撰筷,不管定義時(shí)是否指定這兩個(gè)修飾符,
系統(tǒng)都會(huì)自動(dòng)使用public static對(duì)它們進(jìn)行修飾畦徘;
面向接口編程:
簡(jiǎn)單工程模式毕籽、命令模式
知識(shí)點(diǎn):
設(shè)計(jì)模式就是對(duì)經(jīng)常出現(xiàn)的軟件設(shè)計(jì)問(wèn)題的成熟解決方案,
很多人把設(shè)計(jì)模式想象成非常高深的概念井辆,實(shí)際上設(shè)計(jì)模式僅僅
是對(duì)特定問(wèn)題的一種慣性思維关筒。
設(shè)計(jì)模式的理解必須以足夠的代碼積累作為基礎(chǔ)。最好是經(jīng)
歷過(guò)某種苦痛杯缺,或者正在經(jīng)歷一種苦痛蒸播,就會(huì)對(duì)設(shè)計(jì)模式有較深
的感受。
命令模式:
場(chǎng)景:某個(gè)方法需要完成某個(gè)行為,但具體行為實(shí)現(xiàn)無(wú)法確定袍榆,
必須等到執(zhí)行該方法時(shí)才可以確定胀屿。
知識(shí)點(diǎn):
在某些編程語(yǔ)言(如Ruby等)里,確實(shí)允許傳入一個(gè)代碼塊
作為參數(shù)“福現(xiàn)在Java8中已經(jīng)增加了Lambda表達(dá)式宿崭,通過(guò)
Lambda表達(dá)式可以傳入代碼塊作為參數(shù)
可以考慮設(shè)置一個(gè)接口Command來(lái)定義一個(gè)方法,用這個(gè)方法
來(lái)“處理行為”才写。
知識(shí)點(diǎn):非靜態(tài)內(nèi)部類(lèi)里不可以有靜態(tài)初始化塊劳曹,但可以包含普
通初始化塊。非靜態(tài)內(nèi)部類(lèi)普通初始化塊的作用與外部類(lèi)初始化
塊作用完全相同
Java8新增的Lambda表達(dá)式
1琅摩、形參列表
2、箭頭:"->"
3锭硼、代碼塊
作用:取代匿名內(nèi)部類(lèi)
對(duì)象與垃圾回收
1房资、垃圾回收機(jī)制只負(fù)責(zé)回收堆內(nèi)存中的對(duì)象,不會(huì)回收任何物
理資源檀头;
2轰异、程序無(wú)法精確控制垃圾回收的運(yùn)行,垃圾回收會(huì)在合適的時(shí)
候進(jìn)行暑始。當(dāng)對(duì)象永久地失去引用后搭独,系統(tǒng)就會(huì)在合適的時(shí)候回收
它所占的內(nèi)存。
3廊镜、在垃圾回收機(jī)制回收任何對(duì)象之前牙肝,總會(huì)先調(diào)用它的finalize
()方法,該該方法可能使該對(duì)象重新復(fù)活嗤朴,從而導(dǎo)致垃圾回收
機(jī)制取消回收配椭。
對(duì)象在內(nèi)存中的狀態(tài)
1、可達(dá)狀態(tài):當(dāng)一個(gè)對(duì)象被創(chuàng)建后雹姊,若有一個(gè)以上的引用變量
引用它股缸,則這個(gè)對(duì)象在程序中處于可達(dá)狀態(tài),程序可通過(guò)引用變
量來(lái)調(diào)用該對(duì)象的實(shí)例變量和方法吱雏。
2敦姻、可恢復(fù)狀態(tài):如果程序中某個(gè)對(duì)象不再有任何引用變量引用
它,它就進(jìn)入了可恢復(fù)狀態(tài)歧杏。在這種狀態(tài)下镰惦,系統(tǒng)的垃圾回收機(jī)
制準(zhǔn)備回收該對(duì)象所占用的內(nèi)存,在回收該對(duì)象之前得滤,系統(tǒng)會(huì)調(diào)
用所有可恢復(fù)狀態(tài)對(duì)象的finalize方法進(jìn)行資源清理陨献。如果系統(tǒng)
在調(diào)用finalize()方法時(shí)重新讓一個(gè)引用變量引用該對(duì)象,則這個(gè)
對(duì)象會(huì)再次變?yōu)榭蛇_(dá)狀態(tài):否則該對(duì)象將進(jìn)入不可達(dá)狀態(tài)懂更。
3眨业、不可達(dá)狀態(tài):當(dāng)對(duì)象與所有引用變量的關(guān)聯(lián)都被切斷急膀,且系
統(tǒng)已經(jīng)調(diào)用所有對(duì)象的finalize()方法后依然沒(méi)有使該對(duì)象變成可
達(dá)狀態(tài),那么這個(gè)對(duì)象將永久性地失去引用龄捡,最后變成不可達(dá)狀
態(tài)卓嫂。只有當(dāng)一個(gè)對(duì)象處于不可達(dá)狀態(tài)時(shí),系統(tǒng)才會(huì)真正回收該對(duì)
象所占有的資源聘殖。
強(qiáng)制垃圾回收:
1晨雳、調(diào)用System類(lèi)中的gc()靜態(tài)方法:System.gc();
2、調(diào)用Runtime對(duì)象的gc()實(shí)例方法:Runtime.getRuntime
().gc();
finalize方法
在垃圾回收機(jī)制回收某個(gè)對(duì)象所占用的內(nèi)存之前奸腺,通常要求
程序調(diào)用適當(dāng)?shù)姆椒▉?lái)清理資源餐禁,在沒(méi)有明確指定清理資源的情
況下,Java提供了默認(rèn)機(jī)制來(lái)清理該對(duì)象的資源突照,這個(gè)機(jī)制就是
finalize()方法
當(dāng)finalize方法返回后帮非,對(duì)象消失,垃圾回收機(jī)制開(kāi)始執(zhí)行讹蘑。
finalize()方法4個(gè)特點(diǎn):
1末盔、永遠(yuǎn)不要主動(dòng)調(diào)用某個(gè)對(duì)象finalize()方法,該方法應(yīng)當(dāng)交
給垃圾回收機(jī)制調(diào)用座慰。
2陨舱、finalize方法何時(shí)被調(diào)用,是否被調(diào)用具有不確定性版仔,不要把
finalize()方法當(dāng)成一定會(huì)被執(zhí)行的方法游盲;
3、當(dāng)JVM執(zhí)行可恢復(fù)對(duì)象的finalize()方法時(shí)蛮粮,可能使該對(duì)象
或系統(tǒng)中其他對(duì)象重新變成可達(dá)狀態(tài)背桐。
4、當(dāng)JVM執(zhí)行finalize方法時(shí)出現(xiàn)異常時(shí)蝉揍,垃圾回收機(jī)制不會(huì)報(bào)
告錯(cuò)誤链峭,程序繼續(xù)執(zhí)行
對(duì)象的軟、弱和虛引用
1又沾、強(qiáng)引用:
這時(shí)Java程序最常見(jiàn)的引用弊仪。程序創(chuàng)建一個(gè)對(duì)象,并把這個(gè)
對(duì)象賦給一個(gè)引用變量杖刷,程序通過(guò)該引用變量來(lái)操作實(shí)際的對(duì)象
励饵,前面介紹的對(duì)象和數(shù)組都采用了這種強(qiáng)引用的方式。當(dāng)一個(gè)對(duì)
象被一個(gè)或一個(gè)以上的引用變量所引用時(shí)滑燃,它處于可達(dá)狀態(tài)役听,不
可能被系統(tǒng)垃圾回收機(jī)制回收。
2、軟引用
軟引用需要通過(guò)SoftReference類(lèi)來(lái)實(shí)現(xiàn)典予,當(dāng)一個(gè)對(duì)象只有軟
引用時(shí)甜滨,它有可能被垃圾回收機(jī)制回收。對(duì)于只有軟引用的對(duì)象
而言瘤袖,當(dāng)系統(tǒng)內(nèi)存空間足夠時(shí)衣摩,它不會(huì)被系統(tǒng)回收,程序也可使
用該對(duì)象捂敌;當(dāng)系統(tǒng)內(nèi)存空間不足時(shí)艾扮,系統(tǒng)可能回收它。軟引用通
常對(duì)于內(nèi)存敏感的程序中占婉。
3泡嘴、弱引用:
弱引用通過(guò)WeakReference類(lèi)實(shí)現(xiàn),弱引用和軟引用很像逆济,
但弱引用的引用級(jí)別更低磕诊。對(duì)于只有弱引用的對(duì)象而言,當(dāng)系統(tǒng)
垃圾回收機(jī)制運(yùn)行時(shí)纹腌,不管系統(tǒng)內(nèi)存是否足夠,總會(huì)回收該對(duì)象
所占用的內(nèi)存滞磺,當(dāng)然升薯,并不是說(shuō)當(dāng)一個(gè)對(duì)象只有弱引用時(shí),它就
會(huì)立即被回收——正如那些失去引用的對(duì)象而言击困,必須等到系
統(tǒng)垃圾回收機(jī)制運(yùn)行時(shí)才會(huì)被回收涎劈。
4、虛引用
虛引用通過(guò)PhantomReference類(lèi)實(shí)現(xiàn)阅茶,虛引用完全類(lèi)似于
沒(méi)有引用蛛枚。虛引用對(duì)對(duì)象本身沒(méi)有太大影響,對(duì)象甚至感覺(jué)不到
虛引用的存在脸哀。如果一個(gè)對(duì)象只有虛引用時(shí)蹦浦,那么它和沒(méi)有引用
的效果大致相同。虛引用主要用于跟蹤對(duì)象被垃圾回收的狀態(tài)撞蜂,
虛引用不能單獨(dú)使用盲镶,虛引用必須和引用隊(duì)列聯(lián)合使用。
上面三個(gè)引用類(lèi)都包含get方法蝌诡,用于獲取被它們所引用的對(duì)
象溉贿。
引用隊(duì)列由java.lang.ref.ReferenceQueue類(lèi)表示,它用于
保存被回收后對(duì)象的引用浦旱。當(dāng)聯(lián)合使用軟引用宇色、弱引用和引用隊(duì)
列時(shí),系統(tǒng)在回收被引用的對(duì)象之后,將把被回收對(duì)象對(duì)應(yīng)的引
用添加到關(guān)聯(lián)的引用隊(duì)列中宣蠕。
與軟引用和弱引用不同的是例隆,虛引用在對(duì)象被釋放之前,將
把它對(duì)應(yīng)的虛引用添加到它關(guān)聯(lián)的引用隊(duì)列中植影,這使得可以在對(duì)
象被回收之前采取行動(dòng)裳擎。
弱引用和軟引用可以單獨(dú)使用,但虛引用不能單獨(dú)使用思币,單
獨(dú)使用虛引用沒(méi)有太大的意義鹿响。虛引用的主要作用就是跟蹤對(duì)象
被垃圾回收的狀態(tài),程序可以通過(guò)檢查虛引用關(guān)聯(lián)的引用隊(duì)列中
是否已經(jīng)包含了該虛引用谷饿,從而了解虛引用所引用的對(duì)象是否即
將被回收惶我。
弱引用所引用的對(duì)象被系統(tǒng)垃圾回收過(guò)程
import java.lang.ref.*;
public class ReferenceTest{
public static void main(String[] arge)
throws Exception
{
String str=new String("Java瘋狂講義");
WeakReference wr=new WeakReference(str); //1
//切斷str引用和瘋狂Java講義字符串之間的引用
str=null; //2
System.out.println(wr.get());//3
//強(qiáng)制垃圾回收
System.gc();
System.runFinalization();
//再次取出弱引用所引用的對(duì)象
System.out.println(wr.get()); //4
}
}
1、創(chuàng)建“瘋狂Java講義”字符串對(duì)象博投,并讓str字符串引用變量
引用他绸贡,執(zhí)行1行代碼時(shí),系統(tǒng)創(chuàng)建了一個(gè)弱引用對(duì)象毅哗,并讓該
對(duì)象和str引用同一個(gè)對(duì)象听怕。
2、當(dāng)程序執(zhí)行到第2行代碼時(shí)虑绵,程序切斷了str和“瘋狂Java講
義”字符串對(duì)象之間的引用關(guān)系尿瞭;
3、當(dāng)程序執(zhí)行到3號(hào)粗體字代碼時(shí)翅睛,由于本程序不會(huì)導(dǎo)致內(nèi)存
緊張声搁,此時(shí)程序通常還不會(huì)回收弱引用wr所引用的對(duì)象,因此
在3號(hào)代碼處可以看到輸出“瘋狂Java講義”字符串
4捕发、之后調(diào)用了gc()方法和runFinalization()方法疏旨,通知系
統(tǒng)進(jìn)行垃圾回收,如果系統(tǒng)立即進(jìn)行垃圾回收扎酷,那么就會(huì)將弱引
用wr所引用的對(duì)象回收檐涝。接下來(lái)在4代碼處看到輸出null
作用:
使用這些引用類(lèi)可以避免在程序執(zhí)行期間將對(duì)象留在內(nèi)存中
,如果以軟引用法挨、弱引用或虛引用的方式引用對(duì)象骤铃,垃圾回收期
就能夠隨意地釋放對(duì)象。如果希望盡可能減小程序在其生命周期
中所占用的內(nèi)存大小時(shí)坷剧,這些引用類(lèi)就很有用處惰爬。
Jar文件
知識(shí)點(diǎn):jar是隨JDK自動(dòng)安裝的,在JDK安裝目錄下的bin目錄
中惫企,運(yùn)行它需要用到JDK安裝目錄中l(wèi)ib目錄中的tools.jar文件
撕瞧,通常系統(tǒng)會(huì)自動(dòng)加載tools.jar陵叽,無(wú)需顯式設(shè)置
jar命令的用法
1、創(chuàng)建jar文件:jar cf 名稱(chēng).jar 類(lèi)
2丛版、創(chuàng)建jar文件巩掺,并顯示壓縮過(guò)程:jar cvf 名稱(chēng).jar 類(lèi)民
3页畦、不使用清單文件:jar cvfM test.jar test
4、自定義清單文件內(nèi)容:jar cvfm test.jar manifest.mf test