1、final
Final可以用於成員變量(包括方法參數),方法、類。
Final成員
- 作爲變量
變量一旦被初始化便不可改變(對於基本類型,指的是值不變;對於對象類型,指的是引用不變),初始化只可能在兩個地方:定義處和構造函數。
- 作爲方法參數
對於基本類型,定義成final參數沒有什麼意義,因爲基本類型就是傳值,不會影響調用語句中的變量;對於對象類型,在方法中如果參數確認不需要改變時,定義成final參數可以防止方法中無意的修改而影響到調用方法。
Final方法
- 不可覆寫
- 編譯器將對此方法的調用轉化成行內(inline)調用,即直接把方法主體插入到調用處(方法主體內容過多的時候反而會影響效率)
Final類
- 不可繼承
2、finally
異常處理關鍵字,finally中的主體總會執行,不管異常發生是否。
2.1、當try中有return時執行順序
return語句並不是函數的最終出口,如果有finally語句,這在return之後還會執行finally(return的值會暫存在棧裏面,等待finally執行後再返回)
2.2、return和異常獲取語句的位置
- 情況一(try中有return,finally中沒有return)
“return num += 80”被拆分成了“num = num+80”和“return num”兩個語句,線執行try中的“num =num+80”語句,將其保存起來,在try中的”return num“執行前,先將finally中的語句執行完,而後再將90返回。
- 情況二(try和finally中均有return)
try中的return被”覆蓋“掉了,不再執行。
- 情況三(finally中改變返回值num)
雖然在finally中改變了返回值num,但因爲finally中沒有return該num的值,因此在執行完finally中的語句後,test()函數會得到try中返回的num的值,而try中的num的值依然是程序進入finally代碼塊前保留下來的值,因此得到的返回值爲10。並且函數最後面的return語句不會執行。
- 另外一種情況:將num的值包裝在Num類中
2.3、簡單地總結如下:
try語句在返回前,將其他所有的操作執行完,保留好要返回的值,而後轉入執行finally中的語句,而後分爲以下三種情況:
情況一:如果finally中有return語句,則會將try中的return語句”覆蓋“掉,直接執行finally中的return語句,得到返回值,這樣便無法得到try之前保留好的返回值。
情況二:如果finally中沒有return語句,也沒有改變要返回值,則執行完finally中的語句後,會接着執行try中的return語句,返回之前保留的值。
情況三:如果finally中沒有return語句,但是改變了要返回的值,這裏有點類似與引用傳遞和值傳遞的區別,分以下兩種情況,:
- 如果return的數據是基本數據類型,則在finally中對該基本數據的改變不起作用,try中的return語句依然會返回進入finally塊之前保留的值。
- 如果return的數據是引用數據類型,而在finally中對該引用數據類型的屬性值的改變起作用,try中的return語句返回的就是在finally中改變後的該屬性的值。
3、finalize
類的Finalize方法,可以告訴垃圾回收器應該執行的操作,該方法從Object類繼承而來。在從堆中永久刪除對象之前,垃圾回收器調用該對象的Finalize方法。注意,無法確切地保證垃圾回收器何時調用該方法,也無法保證調用不同對象的方法的順序。即使一個對象包含另一個對象的引用,或者在釋放一個對象很久以前就釋放了另一個對象,也可能會以任意的順序調用這兩個對象的Finalize方法。如果必須保證採用特定的順序,則必須提供自己的特有清理方法。
我有一個微信公衆號,經常會分享一些Java技術相關的乾貨;如果你喜歡我的分享,可以用微信搜索“Java團長”或者“javatuanzhang”關注。