final 实例域+final类+final方法(阻止继承)
【0】README
0.1)本文描述+源代碼均 轉自 core java volume 1, 旨在理清 “final 實例域”;
0.2) 最后還增加了 阻止繼承 的內容,涵蓋了final類+final方法;
0.3) 引入了 內聯 以及 即時編譯器對方法進行內聯處理 ;
【1】final相關
1.1) final 大都應用于 基本數據域, 或不可變類的域; final 域被設置后, 不能再對它進行更改, 即沒有 setter 更改器方法;
1.2)不可變的類:如果類中的每個方法都不會改變其對象,這種類就是不可變的類;
1.3)對于可變的類: 使用final修飾符可能會對讀者造成混亂,如:private final GregorianCalendar entryTime;
Attention)
- A1)這僅僅意味著存儲在 entryTime 變量中的對象引用在對象構造后不能被改變, 并不是說 entryTime 對象是一個常量, 任何方法都可以對 entryTime 引用的對 象調用 setTime更改器(注意,這里是 setTime(), 而不是 setEntryTime() ); (也就是說,entryTime 指針只能指向 初始化的 內存地址空間, 虛擬機停止運行前,它不能指向另外的內存地址空間)
- A2)也即是, 對于final的 對象(對象就是引用)變量來講,它在對象創建的時候, 它所引用的地址是至始至終不會改變的, 但是該引用地址(對象)上的值是可以改變的, 下圖中的 setTime 更改了final entryTime 的 日歷日期,但是沒有改變它的引用地址;
【2】看個荔枝:
【3】阻止繼承:final 類 和 方法
3.1)不允許擴展的類被稱為final類: 如,
final class Executive extends Manager {...... }3.2)類中的方法也可以被聲明為final, 那么,子類就不能覆蓋這個方法了(final類中的所有方法自動地成為final方法)
class Employee {......public final String getName(){return name;} }Annotation) 對于final域來說,構造對象后就不允許改變他們的值了,不過如果將一個類聲明為final, 只有其中的方法自動地成為final, 而不包括域;
3.3)內聯:如果一個方法沒有被覆蓋并且很短,編譯器就能夠對它進行優化處理,這個過程就稱為內聯;如, 內聯調用e.getName() 將被替換為 訪問 e.name 域;
3.4)即時編譯器對方法進行內聯處理: 虛擬機中的即時編譯器比傳統編譯器的處理能力強得多, 這個編譯器可以準確誰知道類之間的繼承關系,并能夠檢測出類中是否
真正地存在覆蓋給定的方法, 如果方法很短,被頻繁調用且沒有真正地被覆蓋,那么即時編譯器就會將這個方法進行內聯處理;
總結
以上是生活随笔為你收集整理的final 实例域+final类+final方法(阻止继承)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钟爱有加是什么意思 钟爱有加意思是什么
- 下一篇: 静态方法+工厂方法(静态方法用途)