final、finally和finalize的區別總結

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”關注。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章