下面我們就來(lái)明確在變量中使用final的需要注意的規(guī)則,以及在局部和匿名類中關(guān)于使用final變量的特殊探討,下面一起來(lái)看接下來(lái)的內(nèi)容搞吧。
1.對(duì)于final變量,編譯器和處理器都要遵守兩個(gè)重排序規(guī)則
構(gòu)造函數(shù)內(nèi),對(duì)一個(gè) final 變量的寫(xiě)入,與隨后把這個(gè)被構(gòu)造對(duì)象的引用賦值給一個(gè)變量,這兩個(gè)操作之間不可重排序;
首次讀一個(gè)包含 final 變量的對(duì)象,與隨后首次讀這個(gè) final 變量,這兩個(gè)操作之間不可以重排序。
2.局部?jī)?nèi)部類和匿名內(nèi)部類只能訪問(wèn)局部final變量
為了解決這個(gè)問(wèn)題,我們先要去使用代碼去驗(yàn)證一下。
原因是為什么呢?這是因?yàn)閠est()方法里面的參數(shù)a和b,在運(yùn)行時(shí),main線程快要結(jié)束,但是thread還沒(méi)有開(kāi)始。因此需要有一種機(jī)制,在使得運(yùn)行thread線程時(shí)候能夠調(diào)用a和b的值,怎么辦呢?java采用了一種復(fù)制的機(jī)制,
也就說(shuō)如果局部變量的值在編譯期間就可以確定,則直接在匿名內(nèi)部里面創(chuàng)建一個(gè)拷貝。如果局部變量的值無(wú)法在編譯期間確定,則通過(guò)構(gòu)造器傳參的方式來(lái)對(duì)拷貝進(jìn)行初始化賦值。
以上就是我們使用final在變量中需要注意的事項(xiàng),如果忽略以上兩點(diǎn),很容易出現(xiàn)程序的報(bào)錯(cuò),小伙伴們學(xué)習(xí)的時(shí)候需要留心。更多關(guān)于“Java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專業(yè),有針對(duì)零基礎(chǔ)的就業(yè)班,有針對(duì)想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢(mèng)想。