final, finally, finalize 的區別

final:java

在java中,final能夠用來修飾類,方法和變量(成員變量或局部變量)程序員

一、final類中全部的成員方法都會隱式的定義爲final方法。socket

二、若父類中final方法的訪問權限爲private,將致使子類中不能直接繼承該方法,所以,此時能夠在子類中定義相同方法名的函數,此時不會與重寫final的矛盾,而是在子類中從新地定義了新方法。函數

三、final成員變量表示常量,只能被賦值一次,賦值後其值再也不改變。相似於C++中的const。線程

四、final修飾一個成員變量(屬性),必需要顯示初始化。這裏有兩種初始化方式對象

一種是在變量聲明的時候初始化;繼承

第二種方法是在聲明變量的時候不賦初值,可是要在這個變量所在的類的全部的構造函數中對這個變量賦初值生命週期

finally:資源

一、只有與finally對應的try語句塊獲得執行的狀況下,finally語句塊纔會執行。虛擬機

二、在 try 語句塊中執行了 System.exit (0) 語句,終止了 Java 虛擬機的運行,不會執行finally語句塊

三、當一個線程在執行 try 語句塊或者 catch 語句塊時被打斷(interrupted)、被終止(killed)、忽然死機或者斷電,都不會執行finally語句塊

四、finally塊的語句在try或catch中的return語句執行以後返回以前執行,finally裏的修改語句可能影響也可能不影響try或catch中 return已經肯定的返回值,若finally裏也有return語句則覆蓋try或catch中的return語句直接返回。

finalize :

finalize()是在java.lang.Object裏定義的,這個方法在gc啓動,該對象被回收的時候被調用,通常是不須要程序員去實現finalize的;

特殊狀況下,須要程序員實現finalize,當對象被回收的時候釋放一些資源,好比:一個socket連接,在對象初始化時建立,整個生命週期內有效,那麼就須要實現finalize,關閉這個連接。

使用finalize還須要注意一個事,調用super.finalize();

一個對象的finalize()方法只會被調用一次,並且finalize()被調用不意味着gc會當即回收該對象,因此有可能調用finalize()後,該對象又不須要被回收了,而後到了真正要被回收的時候,由於前面調用過一次,因此不會調用finalize(),產生問題。 因此,推薦不要使用finalize()方法

相關文章
相關標籤/搜索