這篇文章將為大家詳細(xì)講解有關(guān)java面向?qū)ο笾械膄inal修飾符,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站于2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元翼城做網(wǎng)站,已為上家服務(wù),為翼城各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):18980820575一、final修飾符定義:
final關(guān)鍵字可用于修飾類(lèi)、變量和方法
final修飾變量時(shí),表示該變量一旦獲得了初始值就不可被改變(嚴(yán)格來(lái)說(shuō):final修飾得變量不可被改變,一旦獲得初始值,該final變量得值就不能被重新賦值)
final既可以修飾成員變量(類(lèi)變量和實(shí)例變量),也可以修飾局部變量和形參
二、final成員變量語(yǔ)法規(guī)定:
final修飾的成員變量必須由程序員顯式地指定初始值,系統(tǒng)不會(huì)對(duì)final成員進(jìn)行隱式處初始化。
1、final修飾的類(lèi)變量、實(shí)例變量能制定初始值的地方如下:
類(lèi)變量:必須在靜態(tài)初始化塊中指定初始值或聲明該類(lèi)變量時(shí)指定初始值,而且只能在兩個(gè)地方的其中之一指定
實(shí)例變量:必須在非靜態(tài)初始化塊、聲明該實(shí)例變量或構(gòu)造器中指定初始值,而且只能在三個(gè)地方的其中之一指定
注意:如果普通初始化塊已經(jīng)為某個(gè)實(shí)例變量指定了初始值,則不能再在構(gòu)造器中為該實(shí)例變量制定初始值
下面程序演示了final修飾成員變量的效果:
package lextends; public class FinalVariableTest { //定義成員變量時(shí)指定默認(rèn)值,合法 final int a = 6; //下面變量將在構(gòu)造器或初始化塊中分配初始值 final String str; final int c; final static double d; //既沒(méi)有指定默認(rèn)值,又沒(méi)有在初始化塊、構(gòu)造器中指定初始值 //下面定義的ch實(shí)例是不合法的 //final char ch; //初始化塊,可對(duì)沒(méi)有指定默認(rèn)值的實(shí)例變量指定初始值 { //在初始化塊中為實(shí)例變量指定初始值,合法 str = "Hello"; //定義a實(shí)例變量時(shí)已經(jīng)指定了默認(rèn)值 //不能為a重新賦值,因此下面賦值語(yǔ)句非法 //a=9; } //靜態(tài)初始化塊,可對(duì)沒(méi)有指定默認(rèn)值的類(lèi)變量指定初始值 static { //在靜態(tài)初始化塊中為類(lèi)變量指定初始值,合法 d = 5.6; } //構(gòu)造器,可以對(duì)既沒(méi)有指定默認(rèn)值,又沒(méi)有在初始化塊中,指定初始值的實(shí)例變量指定初始值 public FinalVariableTest() { //如果在初始化塊中已經(jīng)對(duì)str指定了初始值 //那么在構(gòu)造器中不能對(duì)final變量重新賦值,下面賦值語(yǔ)句非法 //str="java" c = 5; } public void changeFinal() { //普通方法不能為final修飾的成員變量賦值 //d=1.2 //不能在普通方法中為final成員變量指定初始值 //ch = 'a'; } public static void mian(String[] args){ FinalVariableTest ft= new FinalVariableTest(); System.out.println(ft.a); System.out.println(ft.c); System.out.println(ft.d);} }
2、如果打算在構(gòu)造器、初始化塊對(duì)final成員變量進(jìn)行初始化,則不要在初始化之前就訪(fǎng)問(wèn)成員變量的值。
package lextends; public class FinalErrorTest { //定義一個(gè)final修飾的實(shí)例變量 //系統(tǒng)不會(huì)對(duì)final成員變量進(jìn)行默認(rèn)初始化 final int age; { //age沒(méi)有初始化,所以此處代碼將引起錯(cuò)誤,因?yàn)樗噲D訪(fǎng)問(wèn)一個(gè)未初始化的變量 //只要把定義age時(shí)的final修飾符去掉,程序就正確了 System.out.println(age); age=6; System.out.println(age); } public static void main(String[] args){ new FinalErrorTest(); } }
三、final局部變量
1、定義:系統(tǒng)不會(huì)對(duì)局部變量進(jìn)行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時(shí),既可以在定義時(shí)指定默認(rèn)值,也可以不指定默認(rèn)值。
下面程序示范了final修飾局部變量、形參:
(final修飾形參的情形,因?yàn)樵谡{(diào)用該方法時(shí),由系統(tǒng)根據(jù)傳入的參數(shù)來(lái)完成初始化,因此使用final修飾符不能被賦值。)
package lextends; public class FinalLocalVariable { public void test(final int a){ //不能對(duì)final修飾的形參賦值,下面語(yǔ)句非法 //a=5; } public static void mian(String[] args){ //定義final局部變量時(shí)指定默認(rèn)值,則str變量無(wú)法重新賦值 final String str="hello"; //下面賦值語(yǔ)句非法 //str="Java"; //定義final局部變量時(shí)沒(méi)有指定默認(rèn)值,則d變量可被賦值一次 final double d; d=5.6; //對(duì)final變量重新賦值,下面語(yǔ)句非法 //d=6.4; } }
四、final修飾基本類(lèi)型變量和引用類(lèi)型變量的區(qū)別
使用final修飾的引用類(lèi)型變量不能被重新賦值,但可以改變引用類(lèi)型變量所引用對(duì)象的內(nèi)容
例如下面的iArr變量所引用的數(shù)組對(duì)象,final修飾后的iArr變量不能被重新賦值,但iArr所引用數(shù)組的數(shù)組元素可以被改變
eg. //final修飾數(shù)組元素,iArr是一個(gè)引用變量 final int[] iArr={5,6,12,9}; System.out.println(Arrays.toString(iArr)); //對(duì)數(shù)組元素進(jìn)行排序,合法 Arrays.sort(iArr); System.out.println(Arrays.toString(iArr)); //對(duì)數(shù)組進(jìn)行元素賦值,合法 iArr[2]=-8; System.out.println(Arrays.toString(iArr)); //下面語(yǔ)句對(duì)iArr重新賦值,非法 //iArr=null;
五、可執(zhí)行”宏替換“的final變量
1、對(duì)于一個(gè)final變量來(lái)說(shuō),不管它是類(lèi)變量、實(shí)例變量,還是局部變量,只要該變量滿(mǎn)足三個(gè)條件,這個(gè)final變量就不再是一個(gè)變量,而是相當(dāng)于一個(gè)直接量。
(1)使用final修飾符修飾
(2)在定義該final變量時(shí)指定了初始值
(3)該初始值可以在編譯時(shí)就被確定下來(lái)
2、final修飾符有一個(gè)重要用途就是定義”宏變量“。當(dāng)定義final變量時(shí)就為該變量指定了初始值,而且該變量可以在變量時(shí)就確定下來(lái),那么這個(gè)final變量本質(zhì)上就是一個(gè)”宏變量“,編譯器會(huì)把程序中所有用到該變量的地方直接替換成該變量的值。
3、
eg. String s1="瘋狂Java"; //s2變量引用的字符串可以在編譯時(shí)就確定下來(lái) //因此s2直接引用變量池中已有的"瘋狂Java"字符串 String s2="瘋狂"+"Java"; System.out.println(s1==s2);//true //定義兩個(gè)字符串直接量 String str1="瘋狂"; String str2="Java"; String s3=str1+str2; System.out.println(s1==s3);//false
對(duì)于s3而言,它的值由str1和str2進(jìn)行連接運(yùn)算得到的,由于str1、str2只是兩個(gè)普通變量,編譯器不會(huì)執(zhí)行”宏替換“,因此編譯器無(wú)法確定s3的值,也就無(wú)法讓s3指向字符串池中緩存的"瘋狂Java"。
關(guān)于java面向?qū)ο笾械膄inal修飾符就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:java面向?qū)ο笾械膄inal修飾符怎么用-創(chuàng)新互聯(lián)
鏈接地址:http://bm7419.com/article38/cdeopp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容