成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

小而有料的final

Baoyuan / 2673人閱讀

摘要:閱讀原文小而有料的想聽文章核心內(nèi)容語(yǔ)音對(duì)話版,請(qǐng)到微信公眾號(hào)碼上實(shí)戰(zhàn),閱讀原文這塊肉雖然小,但不可不知,因?yàn)椴粌H面試可能會(huì)問,實(shí)際中也常使用。參考書籍編程思想深入理解虛擬機(jī)更多精彩技術(shù)文章盡在微信公眾號(hào)碼上實(shí)戰(zhàn)

閱讀原文:小而有料的final(想聽文章核心內(nèi)容語(yǔ)音對(duì)話版,請(qǐng)到微信公眾號(hào)——碼上實(shí)戰(zhàn),閱讀原文)

final這塊肉雖然小,但不可不知,因?yàn)椴粌H面試可能會(huì)問,實(shí)際中也常使用。
就問你常量聲明時(shí)你為什么要加final?它有哪些作用?你思考過嗎?

final通常指被修飾的東西不能被改變的,不能被改變的原因旺往往出于設(shè)計(jì)和效率的考慮。

先看final能修飾什么?

修飾變量

修飾方法

修飾類

修飾參數(shù)

不同的修飾有什么不同的作用呢?下面慢慢道來:

final常量

final修飾的常量必須在被使用前進(jìn)行初始化,初始化的方式無(wú)非兩種:定義時(shí)賦值或構(gòu)造函數(shù)內(nèi)賦值

final修飾常量基本類型和引用類型有些不同,我分開講。

基本數(shù)據(jù)類型
public class Test {

    private final int A;
    private final int B = 3;
    private final int C = new Random().nextInt();

    public Test() {
        this.A = 5;
    }
    public Test(int a) {
        this.A = a;
    }
}

為什么常量B要用final修飾?

因?yàn)檫@種確定值(定義便立即賦值)的final常量,編譯器會(huì)在編譯時(shí)將該常量值帶入到任何可能用到它的計(jì)算式中,這會(huì)減輕運(yùn)行時(shí)的一些負(fù)擔(dān)。
比如 int d = 3 * B; 那么編譯后相當(dāng)于 int d = 9;

final修飾的常量值是在編譯期間被確定的嗎?

注意上面的變量C,我們并不能以為final修飾的就能在編譯時(shí)知道它的值,C的值只有在運(yùn)行時(shí)被初始化時(shí)才會(huì)顯現(xiàn)。

引用類型

引用類型不能改變指的是引用被初始化指向一個(gè)對(duì)象后,就再也無(wú)法改為指向其他對(duì)象,但其指向的對(duì)象本身是可以被修改的。

public class B {

    //final常量d指向了對(duì)象D
    private final D d =new D();

    //這個(gè)方法改變了對(duì)象D的內(nèi)容
    public D change(){
        this.d.setS("change");
        return d;
    }

    //注意這個(gè)方法,將常量d的引用改變了
    public D refnewD(){
        this.d = new D();
        return d;
    }
    
    class D {
        private String s= "init";

        public String getS() {
            return s;
        }

        public void setS(String s) {
            this.s = s;
        }
    }
}

上面代碼是無(wú)法編譯的,因?yàn)閠his.d=new D()會(huì)提示Cannot assign a value to final variable "d",但是你卻可以調(diào)用change()方法來改變d對(duì)象的s變量值。

final方法

為什么使用final修飾方法

設(shè)計(jì):把方法鎖定,防止繼承類修改它的含義。

效率:早期編譯器會(huì)將final方法所有的調(diào)用轉(zhuǎn)為內(nèi)嵌調(diào)用,隨著JVM的提高,這種方式已被丟棄。

final和private

當(dāng)一個(gè)方法被private修飾,這會(huì)隱式的指定為final,這也會(huì)使得子類無(wú)法覆蓋此方法,可以對(duì)private方法增加final修飾,但對(duì)該方法并不能增加任何意義。

final類

String類是final應(yīng)用的典型例子,可去查看面試別再問我String了。

為什么要把類指定為final?

出于安全考慮或其他原因,你不希望該類有任何變動(dòng)或被繼承。

一旦類被final修飾,即代表final類中的所有成員變量和方法都會(huì)隱式的final.
final參數(shù)

在方法的參數(shù)列表中將參數(shù)指定為final,即代表該參數(shù)引用所指向的對(duì)象是無(wú)法改變的;
若為基本類型,則表示值可以讀取,但無(wú)法修改。修飾情況和final常量類似。也可結(jié)合這題不會(huì)!別說你懂值傳遞與引用傳遞看。

final相關(guān) static 和 final

static強(qiáng)調(diào)的是該數(shù)據(jù)只存在一份,且是屬于類的,不是屬于對(duì)象。

final強(qiáng)調(diào)該數(shù)據(jù)不可變,且是屬于對(duì)象的。

public class C {

    private final double A = 3.14D;

    private static double b = 3.14D;

    public static void main(String[] args) {
        new C();
        new C();
        new C();
    }
}

上面代碼運(yùn)行后,A會(huì)存在3個(gè),但b只有一個(gè)。

final,finally和finalize

finally

是在異常處理時(shí)配合try-catch執(zhí)行清理操作,需要清理的資源包括:打開的文件或網(wǎng)絡(luò)連接等,它會(huì)把內(nèi)存之外的資源恢復(fù)到他們的初始狀態(tài)。無(wú)論try中是否有異常出現(xiàn),finally里的操作都會(huì)被執(zhí)行。

finalize

這是Object基類的一個(gè)方法,垃圾收集器在將對(duì)象清除出內(nèi)存之前調(diào)用的清理資源方法,且此方法只會(huì)被系統(tǒng)調(diào)用一次,其實(shí)finalize能做的工作,try-finally能做的更好,《深入理解Java虛擬機(jī)》中建議大家忘掉這個(gè)方法的存在。

參考書籍

Java編程思想

深入理解Java虛擬機(jī)

更多精彩技術(shù)文章盡在微信公眾號(hào):碼上實(shí)戰(zhàn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74036.html

相關(guān)文章

  • 區(qū)塊鏈系列教程

    摘要:區(qū)塊鏈教程是我寫的一個(gè)區(qū)塊鏈教程,最初譯自的系列文章,這個(gè)系列主要針對(duì)。隨著對(duì)區(qū)塊鏈的認(rèn)識(shí)不斷深入,我后續(xù)計(jì)劃加入很多其他內(nèi)容,比如,,,,,等等我感興趣的項(xiàng)目。不過要想了解鏈,還是我上面的教程內(nèi)容更豐富一點(diǎn)。 區(qū)塊鏈教程 blockchain-tutorial 是我寫的一個(gè)區(qū)塊鏈教程,最初譯自 Jeiwan/blockchain_go 的系列文章,這個(gè)系列主要針對(duì) Bitcoin。隨...

    Julylovin 評(píng)論0 收藏0
  • Node.js快速開發(fā)利器-Keystone.js

    摘要:介紹是以和為基礎(chǔ)搭建的開源的和應(yīng)用程序平臺(tái)。在官網(wǎng)上聲稱在中,用搭建數(shù)據(jù)驅(qū)動(dòng)的網(wǎng)站應(yīng)用程序和是最容易的。這樣實(shí)現(xiàn)一個(gè)網(wǎng)站只要定義和寫前端代碼就好了。這應(yīng)該是前端猴子接外包的一個(gè)利器吧。 介紹 Keystone是以Express和MongoDB為基礎(chǔ)搭建的開源的Node.js CMS和web應(yīng)用程序平臺(tái)。 Keystone在官網(wǎng)上聲稱:在Node.js中,用Keystone搭建數(shù)據(jù)驅(qū)動(dòng)的...

    zhiwei 評(píng)論0 收藏0
  • css進(jìn)階

    摘要:柵格系統(tǒng)用于處理頁(yè)面多終端適配的問題。它表示抓取對(duì)象以后拖放到另一個(gè)位置。目前,它是標(biāo)準(zhǔn)的一部分。精簡(jiǎn)高效的命名準(zhǔn)則方法這篇文章發(fā)布于年月日,星期日,,歸類于相關(guān)。但是不會(huì)受到包含塊的限制,可能會(huì)溢出。 一勞永逸的搞定 flex 布局 尋根溯源話布局 一切都始于這樣一個(gè)問題:怎樣通過 CSS 簡(jiǎn)單而優(yōu)雅的實(shí)現(xiàn)水平、垂直同時(shí)居中。記得剛開始學(xué)習(xí) CSS 的時(shí)候,看到 float 屬性不由...

    import. 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<