最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中關(guān)鍵字final finally finalize的區(qū)別介紹

 更新時間:2022年04月25日 10:08:15   作者:紙照片  
這篇文章主要給大家分享的是 Java中final,finally,finalize 到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考的價值,需要的朋友可以參考一下

這三個除了長得像以外,好像沒什么聯(lián)系

1. final

final意為“最后的”,它是Java中的一個關(guān)鍵字。

final可以修飾屬性、方法、類。

1.1 final修飾屬性

從final的含義就不難理解用final修飾內(nèi)容的用意。final修飾屬性,就表示這個屬性是“最終的”,也就是不可更改的,換成我們熟悉的名詞,也就是“常量”。

private final double PI = 3.1415926;   //被final修飾的屬性常常用大寫表示,全部大寫在idea的快捷鍵是ctrl+shift+u

此時如果再想修改這個值,就會報錯。

final修飾的屬性可以通過多種方式進(jìn)行初始化,比如顯式初始化、代碼塊初始化、構(gòu)造方法初始化等等。

public class Test {
    private final int WIDTH = 10;   //顯示初始化
    private final int HEIGHT;
    private final int LEFT;
    {
        HEIGHT = 10;   //代碼塊初始化
    }
    public Test(){
        LEFT = 10;  //構(gòu)造方法初始化
    }
    public Test(int n){
        LEFT = n;   //構(gòu)造方法初始化
    }
}

final修飾屬性經(jīng)常和static一起使用,表示全局常量 。

另外,final還可以修飾局部變量

public void test(final int NUMBER){
}
public void test(int number){
    final int NUM = number;
}

上文提到final修飾屬性的多種初始化方法,這里注意一點(diǎn),切記不要使用普通方法去初始化,當(dāng)然這種方式都不會編譯通過。因為final引用的屬性在對象出現(xiàn)前就已經(jīng)存在了,調(diào)用方法賦值就太晚了。

1.2 final修飾方法

final修飾方法表示此方法不可重寫。套用含義上的理解,也就是“最終的方法”,也就是不可被修改的方法。

比如寫一個父類

class ParentClass{
    public final void finalMethod(){  
    }
}

嘗試在子類中重寫這個方法,就會報錯。

1.3 final修飾類

final修飾類,套用含義上的理解,“最終的類”意為不可修改的類,表示該類不可被繼承,因為繼承就可以重寫方法、擴(kuò)展功能,是對現(xiàn)有類的修改。

聲明一個final的類

final class ParentClass{
}

嘗試去繼承這個類,就會報錯

2. finally

finally用于異常處理,try-catch-finally,finally表示最終會執(zhí)行的功能塊。finally包裹的代碼塊一定會執(zhí)行。(注意這個“一定會執(zhí)行”,后文有坑)

try{
    //可能出現(xiàn)異常的代碼
}
catch(異常類型1 變量名1){
    //處理異常的方式1
}
catch(異常類型2 變量名2){
    //處理異常的方式2
}
finally{
    //一定會執(zhí)行的代碼
}

舉一個例子

@Test
public void test(){
    try{
        int a = 10;
        int b = 0;
        System.out.println(a/b);
    }
    catch (ArithmeticException e){
        System.out.println("處理方式1");
    }
    catch (Exception e){
        System.out.println("處理方式2");
    }
    finally {
        System.out.println("執(zhí)行finally");
    }
}

執(zhí)行結(jié)果:

注意以下三點(diǎn):

  • finally是可選的,在try-catch結(jié)構(gòu)中不使用finally沒有任何問題
  • finally聲明的代碼是一定會執(zhí)行的
  • 像數(shù)據(jù)庫連接、輸入輸出流、網(wǎng)絡(luò)Socket… JVM是不能自動回收的,所以常常在可能存在異常的代碼中手動在finally釋放掉這些資源

擴(kuò)展-finally和return誰會先執(zhí)行?

上文多次提到“finally聲明的代碼是一定會執(zhí)行的”,那么在try或者catch中出現(xiàn)了return,那么誰會先執(zhí)行?

執(zhí)行以下代碼,會輸出什么?

private int finallyTest(){
    try{
        int a = 10;
        int b = 0;
        System.out.println(a/b);
        return 1;
    }
    catch (Exception e){
        return 2;
    }
    finally {
        System.out.println("執(zhí)行finally");
    }
}

調(diào)用一下

@Test
public void test(){
    int num = finallyTest();
    System.out.println(num);
}

結(jié)果如下圖,也就是即使在catch中有return語句,也要等待finally聲明的代碼執(zhí)行完再return出去。

3. finalize

finalize翻譯為“使結(jié)束”,它是一個方法,是每個類默認(rèn)存在的方法。

打開Object類的源碼,就可以找到finalize()方法

finalize()方法用于GC回收,finalize是本文最難理解的概念,要真正理解finalize()方法,就要深入理解GC回收機(jī)制,而本文的側(cè)重點(diǎn)并不在于解釋GC回收機(jī)制,所以只會簡單地描述一下finalize()方法的使用場景,讀者如果感興趣,請自行查找相關(guān)的文章。

在Java的內(nèi)存管理中,使用可達(dá)性分析算法來判斷對象是否存活,基本思路是通過一系列稱為“GC Roots”的跟對象作為起始節(jié)點(diǎn),根據(jù)引用關(guān)系向下搜索,如果某些對象到GC Roots之間沒有任何引用關(guān)系,則證明此對象是不能被再使用的,就有可能去回收這一塊內(nèi)存了。下圖中,雖然object5、object6、object7之間有引用關(guān)系,但是到GC Roots沒有任何途徑,則這些對象仍在回收的范圍內(nèi)。

生存還是死亡?

即使經(jīng)過可達(dá)性分析算法判定為不可達(dá)的對象,也不是非要回收不可,要真正回收一個內(nèi)存空間,至少需要兩次的不可達(dá)判定。經(jīng)過第一次不可達(dá)判定,隨后要進(jìn)行一個篩選,篩選的條件是該對象是否有必要執(zhí)行finalize()方法。假如待回收的對象沒有重寫finalize()方法,或者finalize()方法被JVM調(diào)用過(每個對象的finalize()方法只能被JVM調(diào)用一次),這兩種情況都會被虛擬機(jī)認(rèn)為是“沒有必要執(zhí)行finalize()方法”,那么在經(jīng)過幾輪不可達(dá)標(biāo)記后,該對象被真正地回收掉。

如果該對象被認(rèn)定為“有必要執(zhí)行finalize()方法”,則稍后會被低調(diào)度優(yōu)先級的線程去執(zhí)行finalize()方法,而重寫的finalize()方法有可能完成一次對象的“自救”,比如將this賦給某個屬性,那么在后續(xù)標(biāo)記時會被判定為“可達(dá)”,那么JVM就不會回收這個對象。

盡管finalize()方法有著特殊的使用場景,但是永遠(yuǎn)也不要顯式調(diào)用某個對象的finalize()方法,應(yīng)該交給GC回收機(jī)制調(diào)用。

到此這篇關(guān)于Java中關(guān)鍵字final finally finalize的區(qū)別介紹的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字final finally finalize內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring配置文件解析之BeanDefinitionDocumentReader詳解

    Spring配置文件解析之BeanDefinitionDocumentReader詳解

    這篇文章主要介紹了Spring配置文件解析之BeanDefinitionDocumentReader詳解,Spring的xml配置文件解析成Document對象,接下來的解析處理工作是在BeanDefinitionDocumentReader中對Document對象進(jìn)行解析,需要的朋友可以參考下
    2024-02-02
  • Spring?IOC容器Bean管理的完全注解開發(fā)放棄配置文件

    Spring?IOC容器Bean管理的完全注解開發(fā)放棄配置文件

    這篇文章主要為大家介紹了Spring?IOC容器的Bean管理完全注解開發(fā)放棄配置文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Java和SNMP4J實現(xiàn)SNMP操作完整代碼

    使用Java和SNMP4J實現(xiàn)SNMP操作完整代碼

    這篇文章主要介紹了如何使用Java和SNMP4J庫進(jìn)行SNMP操作,包括初始化SNMP、創(chuàng)建目標(biāo)、創(chuàng)建PDU、發(fā)送SNMP請求和處理響應(yīng)等內(nèi)容,通過編寫SnmpUtil類,展示了完整的SNMP操作流程,需要的朋友可以參考下
    2024-12-12
  • 淺談Java變量的初始化順序詳解

    淺談Java變量的初始化順序詳解

    本篇文章是對Java變量的初始化順序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案

    使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案

    這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot實現(xiàn)小程序支付的項目實踐

    springboot實現(xiàn)小程序支付的項目實踐

    本文主要介紹了springboot實現(xiàn)小程序支付的項目實踐,?可以通過調(diào)用微信支付?API?實現(xiàn)支付功能,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SpringBoot+?Sharding?Sphere?輕松實現(xiàn)數(shù)據(jù)庫字段加解密功能

    SpringBoot+?Sharding?Sphere?輕松實現(xiàn)數(shù)據(jù)庫字段加解密功能

    在Spring?Boot生態(tài)中,有一個非常厲害的開源框架:Apache?ShardingSphere,它是一款分布式?SQL?事務(wù)和查詢引擎,可通過數(shù)據(jù)分片、彈性伸縮、加密等能力對任意數(shù)據(jù)庫進(jìn)行增強(qiáng),今天通過這篇文章,我們一起來了解一下如何在?Spring?Boot?中快速實現(xiàn)數(shù)據(jù)的加解密功能
    2024-07-07
  • 啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    這篇文章主要介紹了啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 簡單了解Thymeleaf語法 數(shù)據(jù)延遲加載使用實例

    簡單了解Thymeleaf語法 數(shù)據(jù)延遲加載使用實例

    這篇文章主要介紹了簡單了解Thymeleaf語法 數(shù)據(jù)延遲加載使用實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2010-05-05
  • Java實現(xiàn)窗體程序顯示日歷

    Java實現(xiàn)窗體程序顯示日歷

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)窗體程序顯示日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論

阳泉市| 博兴县| 内黄县| 灯塔市| 剑河县| 金溪县| 雷波县| 汉寿县| 杨浦区| 收藏| 琼中| 肇东市| 江口县| 灯塔市| 丰城市| 郴州市| 祁连县| 沁水县| 永州市| 晋中市| 开鲁县| 莒南县| 区。| 霍林郭勒市| 祁门县| 东源县| 正宁县| 青冈县| 霍林郭勒市| 灵川县| 上思县| 丰原市| 安西县| 巴彦县| 历史| 凉山| 吴旗县| 定结县| 辽阳市| 久治县| 紫阳县|