您好,登錄后才能下訂單哦!
java語(yǔ)言有有很多看起來(lái)相似,但用途卻完全不同的要素,那么final,finally,finalize又有哪些不同之處呢?
final
final可以用來(lái)修飾類、方法、變量,分別有不同的意義,
final修飾的class表示不可以繼承擴(kuò)展
final修飾的變量是不可以修改的
final修飾的方法是不可以重寫的
final執(zhí)行去修飾某個(gè)引用,
finally
finally是保證java重點(diǎn)代碼執(zhí)行的一種機(jī)制,他可以配合我們的異常機(jī)制一起使用,我們可以使用try{}finally{}或者try{}catch(){}finally{}來(lái)關(guān)閉類似jdbc的連接,保證unlock鎖等動(dòng)作.
finalize
finalize是java的一個(gè)方法,它的設(shè)計(jì)目的是java對(duì)象在被垃圾回收器回收之前,完成特定資源的回收,finalize機(jī)制現(xiàn)在已經(jīng)不推薦使用,
在一般情況下不能指望finalize來(lái)進(jìn)行回收資源,為什么呢?簡(jiǎn)單來(lái)說(shuō),無(wú)法保證finallize什么時(shí)候執(zhí)行,執(zhí)行是否符合預(yù)期,使用不當(dāng)會(huì)影響性能,導(dǎo)致程序死鎖,掛掉等。通常來(lái)說(shuō)上面提到的try{}finally{}機(jī)制是回收資源的辦法,如果特別需要額外處理的話,可以考慮java提供的cleaner機(jī)制(垃圾回收機(jī)制)或者其他替代方法.
finalize是和垃圾收集相關(guān)聯(lián)的,一但調(diào)用finalize方法,就會(huì)導(dǎo)致相應(yīng)的對(duì)象回收呈現(xiàn)數(shù)量集上的變慢,有人專門做過(guò)研究,實(shí)現(xiàn)該方法速度大概是40-50倍的下降,因?yàn)閒inallize被設(shè)計(jì)成在對(duì)象本身垃圾回收之前調(diào)用,這就意味者實(shí)現(xiàn)finalize方法的對(duì)象是個(gè)特殊供應(yīng)。cdn要對(duì)他進(jìn)行額外處理,finalize本質(zhì)上成為快速回收的阻礙,可能導(dǎo)致你的對(duì)象經(jīng)過(guò)多個(gè)垃圾經(jīng)期,才能被回收.如果我們告知jvm來(lái)回收也是不痛不癢的.就向我們用過(guò)的jdbc連接池,其中有一個(gè)close方法,他是釋放資源的,清空某個(gè)池子,以供下回使用,如果我們指望finalize進(jìn)行回收的話,有可能造成內(nèi)存溢出.那么只能讓他作為程序的守門員.其中finalize也會(huì)掩蓋一些出錯(cuò)信息.
java用cleaner來(lái)替換調(diào)finalize的所有實(shí)現(xiàn).利用了幻象引用。這是一個(gè)清理機(jī)制.利用幻象引用或者隊(duì)列可以保證資源被釋放,他有自己的線程,避免了死鎖的情況。
mysqljdbc就用了幻象引用機(jī)制。
隱藏的問(wèn)題
性能,并發(fā),對(duì)象生命周期,垃圾回收等過(guò)程方面的問(wèn)題。
推薦使用final關(guān)鍵字來(lái)表示我們代碼的語(yǔ)義和邏輯密度,這已經(jīng)被證明在很多場(chǎng)景下的實(shí)現(xiàn),比如我們可以將方法或類聲明為final,這樣就可以明確告訴別人,這些類和方法是不可以修改的.如果你關(guān)心過(guò)java的核心類庫(kù)和源碼的話,你就會(huì)發(fā)現(xiàn)java下的很多類都被聲明為final class,這可以防止api使用者改變基礎(chǔ)功能,某種情況這是保證平臺(tái)安全的必要手段,使用final修飾方法或者變量,可以避免意外布局導(dǎo)致的編程錯(cuò)誤,甚至有人明確推薦將所有方法參數(shù)、本地變量、成員變量聲明為final,final在一定程度上產(chǎn)生不可變的效果,所以可以用于保護(hù)只讀數(shù)據(jù),尤其是在并發(fā)編程中,因?yàn)槊鞔_的不能再賦值final變量,有利于減少額外的同步開(kāi)銷,也可以省略防御性拷貝的必要,fianl在很多場(chǎng)景中可以提高性能,利用fianl可能將cdn方法進(jìn)行內(nèi)連,可以改善編譯器進(jìn)行編譯的能力等等,坦白說(shuō)很多類似的結(jié)果都是基于假設(shè)得出的,比如現(xiàn)代高性能cdn判斷內(nèi)斂,未必依賴final的提示,fianl關(guān)鍵字對(duì)性能的影響,沒(méi)有考慮的必要,如果在開(kāi)發(fā)中要想以這樣的方式來(lái)提高性能,那真的是沒(méi)有必要.
finally基礎(chǔ)筆試題
public class finally_demo{
public static char Label;
public static void main(String[] args){
System.out.println(test_finally());
System.out.println(Label);
} 鄭州引產(chǎn)手術(shù)費(fèi)用多少錢 https://yiyuan.120ask.com/art/307587.html
public static char test_finally(){
try{
System.out.println('A');
return Label= 'A';
}finally{
System.out.println('B');
Label= 'B';
}
)
}
輸出結(jié)果:
ABAB
結(jié)構(gòu)分析:
1.這道題考察的點(diǎn)是:return和finally的執(zhí)行順序是什么;
執(zhí)行過(guò)程:
前面輸出AB,大部分人是沒(méi)有疑惑的,這是因?yàn)門est1方法里面的兩個(gè)輸出語(yǔ)句。
之后,
先將label='A’進(jìn)行賦值,
后會(huì)檢測(cè)是否存在finally的語(yǔ)句,
有,則執(zhí)行finally的語(yǔ)句,Label=‘B’,故最終結(jié)果Label的值是B!;
最終將return語(yǔ)句返回(此時(shí)并不進(jìn)行賦值操作,Label雖然等于B,但是返回的仍然是剛才尚未執(zhí)行finally語(yǔ)句前的值)。
創(chuàng)建自定義不可變類需要遵守的規(guī)則:
1、使用private和final修飾成員變量。
2、提供帶參構(gòu)造方法,用于初始化成員變量。
3、不要為成員變量提供setter方法。
4、如果成員變量中有可變類時(shí)需要重寫Object中的hashCode方法和equals方法
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。