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