Python知識分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
《劍指offer》Java深入理解final、finally、finalize PDF 下載
發(fā)布于:2024-01-22 09:55:36
(假如點(diǎn)擊沒反應(yīng),多刷新兩次就OK!)

《劍指offer》Java深入理解final、finally、finalize PDF 下載  圖1

 

 

 

資料內(nèi)容:

 

final、finally 和 finalize 我相信在座的各位都是資深程序員,final 這種基礎(chǔ)關(guān)鍵字就不用多說了。不過,還是要照顧一下小白讀 者,畢竟我們都是從小白走過來的嘛。 final 修飾類、屬性和方法 final 可以用來修飾類,final 修飾的類不允許其他類繼承,也就是說,final 修飾的類是獨(dú)一無二的。 如下所示 我們首先定義了一個 FinalUsage 類,它使用 final 修飾,同時我們又定義了一個 FinalUsageExtend 類,它想要 繼承(extend) FinalUsage,我們?nèi)缟侠^承后,編譯器不讓我們這么玩兒,它提示我們 不能 從 FinalUsage 類繼承,為什么呢?不用管,這是 Java 的約定,有一些為什么沒有必要,遵守就行。 final 可以用來修飾方法,final 修飾的方法不允許被重寫,我們先演示一下不用 final 關(guān)鍵字修飾的情 況 如上圖所示,我們使用 FinalUsageExtend 類繼承了 FinalUsage 類,并提供了 writeArticle 方法的重 寫。這樣編譯是沒有問題的,重寫的關(guān)鍵點(diǎn)是 @Override 注解和方法修飾符、名稱、返回值的一致性。 注意:很多程序員在重寫方法的時候都會忽略 @Override,這樣其實(shí)無疑增加了代碼閱讀的難度, 不建議這樣。 當(dāng)我們使用 final 修飾方法后,這個方法則不能被重寫,如下所示 當(dāng)我們把 writeArticle 方法聲明為 void 后,重寫的方法會報錯,無法重寫 writeArticle 方法。 final 可以修飾變量,final 修飾的變量一經(jīng)定義后就不能被修改,如下所示 編譯器提示的錯誤正是不能繼承一個被 final 修飾的類。 我們上面使用的是字符串 String ,String 默認(rèn)就是 final 的,其實(shí)用不用 final 修飾意義不大,因?yàn)樽址?串本來就不能被改寫,這并不能說明問題。 我們改寫一下,使用基本數(shù)據(jù)類型來演示 同樣的可以看到,編譯器仍然給出了 age 不能被改寫的提示,由此可以證明,final 修飾的變量不能被重 寫。 在 Java 中不僅僅只有基本數(shù)據(jù)類型,還有引用數(shù)據(jù)類型,那么引用類型被 final 修飾后會如何呢?我們 看一下下面的代碼 首先構(gòu)造一個 Person 類 public class Person { int id; String name; get() and set() ... toString()... } 然后我們定義一個 final 的 Person 變量。 static final Person person = new Person(25,"cxuan"); public static void main(String[] args) { System.out.println(person); person.setId(26); person.setName("cxuan001"); System.out.println(person); } 輸出一下,你會發(fā)現(xiàn)一個奇怪的現(xiàn)象,為什么我們明明改了 person 中的 id 和 name ,編譯器卻沒有報 錯呢? 這是因?yàn)?,final 修飾的引用類型,只是保證對象的引用不會改變。對象內(nèi)部的數(shù)據(jù)可以改變。這就涉及 到對象在內(nèi)存中的分配問題,我們后面再說。