資料內(nèi)容:
final、finally 和 finalize 我相信在座的各位都是資深程序員,final 這種基礎(chǔ)關(guān)鍵字就不用多說了。不過,還是要照顧一下小白讀 者,畢竟我們都是從小白走過來的嘛。 final 修飾類、屬性和方法 final 可以用來修飾類,final 修飾的類不允許其他類繼承,也就是說,final 修飾的類是獨一無二的。 如下所示 我們首先定義了一個 FinalUsage 類,它使用 final 修飾,同時我們又定義了一個 FinalUsageExtend 類,它想要 繼承(extend) FinalUsage,我們?nèi)缟侠^承后,編譯器不讓我們這么玩兒,它提示我們 不能 從 FinalUsage 類繼承,為什么呢?不用管,這是 Java 的約定,有一些為什么沒有必要,遵守就行。 final 可以用來修飾方法,final 修飾的方法不允許被重寫,我們先演示一下不用 final 關(guān)鍵字修飾的情 況 如上圖所示,我們使用 FinalUsageExtend 類繼承了 FinalUsage 類,并提供了 writeArticle 方法的重 寫。這樣編譯是沒有問題的,重寫的關(guān)鍵點是 @Override 注解和方法修飾符、名稱、返回值的一致性。 注意:很多程序員在重寫方法的時候都會忽略 @Override,這樣其實無疑增加了代碼閱讀的難度, 不建議這樣。 當我們使用 final 修飾方法后,這個方法則不能被重寫,如下所示 當我們把 writeArticle 方法聲明為 void 后,重寫的方法會報錯,無法重寫 writeArticle 方法。 final 可以修飾變量,final 修飾的變量一經(jīng)定義后就不能被修改,如下所示 編譯器提示的錯誤正是不能繼承一個被 final 修飾的類。 我們上面使用的是字符串 String ,String 默認就是 final 的,其實用不用 final 修飾意義不大,因為字符 串本來就不能被改寫,這并不能說明問題。 我們改寫一下,使用基本數(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 ,編譯器卻沒有報 錯呢? 這是因為,final 修飾的引用類型,只是保證對象的引用不會改變。對象內(nèi)部的數(shù)據(jù)可以改變。這就涉及 到對象在內(nèi)存中的分配問題,我們后面再說。