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