2. final, finally, finalize的區(qū)別
2.1 final
final是一個(gè)修飾符也是一個(gè)關(guān)鍵字蜕该。
- 被final修飾的類無法被繼承
- 對于一個(gè)final變量侦香,如果是基本數(shù)據(jù)類型的變量仁热,則其數(shù)值一旦在初始化之后便不能更改蝶缀;
如果是引用類型的變量挣惰,則在對其初始化之后便不能再讓其指向另一個(gè)對象廊佩。但是它指向的對象的內(nèi)容是可變的锣尉。 - 被final修飾的方法將無法被重寫攀隔,但允許重載
注意:類的private方法會(huì)隱式地被指定為final方法皂贩。
2.2 finally
finally是一個(gè)關(guān)鍵字。
- finally在異常處理時(shí)提供finally塊來執(zhí)行任何清除操作昆汹。不管有沒有異常被拋出或者捕獲明刷,finally塊都會(huì)執(zhí)行,通常用于釋放資源满粗。
- finally塊正常情況下一定會(huì)被執(zhí)行辈末。但是有至少兩個(gè)極端情況:
如果對應(yīng)的try塊沒有執(zhí)行,則這個(gè)try塊的finally塊并不會(huì)被執(zhí)行
如果在try塊中jvm關(guān)機(jī)映皆,例如system.exit(n)挤聘,則finally塊也不會(huì)執(zhí)行(都拔電源了,怎么執(zhí)行) - finally塊中如果有return語句捅彻,則會(huì)覆蓋try或者catch中的return語句组去,導(dǎo)致二者無法return,所以強(qiáng)烈建議finally塊中不要存在return關(guān)鍵字
2.3 finalize
finalize()是Object類的protected方法步淹,子類可以覆蓋該方法以實(shí)現(xiàn)資源清理工作从隆。
GC在回收對象之前都會(huì)調(diào)用該方法
finalize()方法是存在很多問題的:
- java語言規(guī)范并不保證finalize方法會(huì)被及時(shí)地執(zhí)行诚撵,更根本不會(huì)保證它們一定會(huì)被執(zhí)行
- finalize()方法可能帶來性能問題,因?yàn)镴VM通常在單獨(dú)的低優(yōu)先級(jí)線程中完成finalize的執(zhí)行
- finalize()方法中键闺,可將待回收對象賦值給GC Roots可達(dá)的對象引用寿烟,從而達(dá)到對象再生的目的
- finalize方法最多由GC執(zhí)行一次(但可以手動(dòng)調(diào)用對象的finalize方法)