一、final、finally與finalize的區別
- final:final是一個修飾符,可以修飾類,方法和變量。final修飾類表示類不能被其它類繼承,並且該類中的所有方法都會隱式的被final修飾。final修飾方法,則該方法不能被重寫,若父類中final方法的訪問權限為private,將導致子類中不能直接繼承該方法,因此,此時可以在子類中定義相同方法名的函數,此時不會與重寫final的矛盾,而是在子類中重新地定義了新方法。當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化后便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之后便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
- finally:finally作為異常處理的一部分,它只能用在try/catch語句中,並且附帶一個語句塊,表示這段語句最終一定會被執行(不管有沒有拋出異常),經常被用在需要釋放資源的情況下。但須注意,在某些特殊情況下,finally塊是不會執行的。
- finalize:finalize()是Object中定義的一個方法,也就是每個對象都有這個方法。當垃圾回收器確定不存在對該對象的更多引用時(是個垃圾),由對象的垃圾回收器調用此方法。子類重寫
finalize
方法,以配置系統資源或執行其他清除,例如:一個socket鏈接,在對象初始化時創建,整個生命周期內有效,那么就需要實現finalize,關閉這個鏈接。
二、try-catch-finally中哪個部分可以省略
catch和finally可以省略其中一個。
public class TestTryCatch { public static void main(String[] args) { try { int a = 0; int b = 1; System.out.println(b/a); } finally { System.out.println("finally..."); } } }
public class TestTryCatch { public static void main(String[] args) { try { int a = 0; int b = 1; System.out.println(b/a); } catch (Exception e){ e.printStackTrace(); } } }
三、try-catch-finally中try塊中有return,finally還會執行嗎?
會執行,當我們執行到return之后,我們不會立即返回,而是會接着執行finally塊里面的代碼,只有執行完,才會繼續執行我們的return值。
1、不管有沒有異常,finally中的代碼都會執行
2、當try、catch中有return時,finally中的代碼依然會繼續執行
3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
4、如果return的數據是引用數據類型,而在finally中對該引用數據類型的屬性值的改變起作用,try中的return語句返回的就是在finally中改變后的該屬性的值。
5、finally代碼中最好不要包含return,程序會提前退出,也就是說返回的值不是try或catch中的值