1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:final、finally、finalize 有什么區(qū)別?

        共 2043字,需瀏覽 5分鐘

         ·

        2021-12-02 13:25

        作者 |?磊哥

        來源 | Java面試真題解析(ID:aimianshi666)

        轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

        重要說明:本篇為博主《面試題精選-基礎(chǔ)篇》系列中的一篇,查看系列面試文章請關(guān)注我。Gitee 開源地址:https://gitee.com/mydb/interview

        本題目難度:低

        常見程度:高

        1.final 介紹

        final 是 Java 語言中的一個(gè)關(guān)鍵字,使用 final 修飾的對象不允許修改或替換其原始值或定義。

        final 可以用來修飾:類、方法、變量和參數(shù),其中可以用來修飾“參數(shù)”這一項(xiàng),容易被人遺忘,這是 final 的 4 種用法。

        1.1 final 用法說明

        • 當(dāng) final 修飾類時(shí),此類不允許被繼承,表示此類設(shè)計(jì)的很完美,不需要被修改和擴(kuò)展。
        • 當(dāng) final 修飾方法時(shí),此方法不允許任何從此類繼承的類來重寫此方法,表示此方法提供的功能已經(jīng)滿足當(dāng)前要求,不需要進(jìn)行擴(kuò)展。
        • 當(dāng) final 修飾變量時(shí),表示該變量一旦被初始化便不可以被修改。
        • 當(dāng) final 修飾參數(shù)時(shí),表示此參數(shù)在整個(gè)方法內(nèi)不允許被修改。

        1.2 final 用法展示

        final 修飾類:

        final?class?Animal?{

        }

        final 修飾方法:

        public?class?FinalExample?{
        ????public?final?void?sayHi()?{
        ????????System.out.println("Hi~");
        ????}
        }

        final 修飾變量:

        public?class?FinalExample?{
        ????private?static?final?String?MSG?=?"hello";
        ?//......
        }

        final 修飾參數(shù):

        public?class?FinalExample?{
        ????public?void?sayHi(final?String?name)?{
        ????????System.out.println("Hi,"?+?name);
        ????}
        }

        2.finally 介紹

        finally 則是 Java 中保證重點(diǎn)代碼一定要被執(zhí)行的一種機(jī)制。

        我們可以使用 try-finally 或者 try-catch-finally 來進(jìn)行類似關(guān)閉 JDBC 連接、保證釋放鎖等動(dòng)作。

        2.1 finally 用法展示

        try?{
        ????//?do?something
        }?finally?{
        ????//?一定會(huì)執(zhí)行的代碼
        }

        2.2 finally 擴(kuò)展

        有時(shí)候面試也會(huì)問:finally 是否一定會(huì)被執(zhí)行?這是一個(gè)有誘導(dǎo)嫌疑的問題,正常情況下 finally 一定是會(huì)執(zhí)行的,但有一個(gè)特殊情況 finally 也是不會(huì)執(zhí)行的,特殊的實(shí)現(xiàn)代碼和執(zhí)行結(jié)果如下:

        3.finalize 介紹

        finalize 是 Object 類中的一個(gè)基礎(chǔ)方法,它的設(shè)計(jì)目的是保證對象在被垃圾收集前完成特定資源的回收,但在 JDK 9 中已經(jīng)被標(biāo)記為棄用的方法(deprecated)。

        在實(shí)際開發(fā)中不推薦使用 finalize 方法,它雖然被創(chuàng)造出來,但無法保證 finalize 方法一定會(huì)被執(zhí)行,所以不要依賴它釋放任何資源,因?yàn)樗膱?zhí)行極不“穩(wěn)定”。在 JDK 9 中將它廢棄,也很好的證明了此觀點(diǎn)。

        finalize 性能問題

        finalize 除了執(zhí)行“不穩(wěn)定”之外,還有一定的性能問題。

        因?yàn)?finalize 的執(zhí)行是和垃圾收集關(guān)聯(lián)在一起的,一旦實(shí)現(xiàn)了非空的 finalize 方法,就會(huì)導(dǎo)致相應(yīng)對象回收呈現(xiàn)數(shù)量級(jí)上的變慢,有人專門做過 benchmark,大概是 40~50 倍的下降。

        因?yàn)?finalize 被設(shè)計(jì)成在對象被垃圾收集前調(diào)用,這就意味著實(shí)現(xiàn)了 finalize 方法的對象是個(gè)“特殊公民”,JVM 要對它進(jìn)行額外處理。finalize 本質(zhì)上成為了快速回收的阻礙者,可能導(dǎo)致你的對象經(jīng)過多個(gè)垃圾收集周期才能被回收。

        總結(jié)

        final、finally 和 finalize 從英文字面角度來看,看似很像,實(shí)則 3 者在 Java 中沒任何關(guān)系。final 是用來修飾類、方法、變量和參數(shù)的關(guān)鍵字,被 final 修飾的對象不允許修改或替換其原始值或定義;finally 是 Java 中保證重點(diǎn)代碼一定要被執(zhí)行的一種機(jī)制;finalize 是 Object 類中的一個(gè)基礎(chǔ)方法,它的設(shè)計(jì)目的是保證對象在被垃圾收集前完成特定資源的回收的,但其執(zhí)行“不穩(wěn)定”,且有一定的性能問題,已經(jīng)在 JDK 9 中被設(shè)置為棄用的方法了。

        參考 & 鳴謝

        《Java核心技術(shù)面試精講》

        關(guān)注公眾號(hào):Java面試真題解析,查看更多 Java 面試題。

        瀏覽 59
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黑白日本mv和欧美mv对比 | 伊人大香蕉视频在线 | 中文字幕无码永久无线无码蜜桃视频 | 国产aaa免费 | 干屄视频免费 | 日韩av电影在线免费观看 | 91麻豆天美京东蜜桃传媒老牛 | 美女做爱网站免费视频 | 亚洲色图15p | 高清无码不卡在线观看 |