這篇文章主要介紹“Java中的Final關(guān)鍵字的用法介紹”,在日常操作中,相信很多人在Java中的Final關(guān)鍵字的用法介紹問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java中的Final關(guān)鍵字的用法介紹”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
烏什網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
首先,先給出final關(guān)鍵字的三種使用場(chǎng)景,也就是修飾類(lèi),方法和變量
然后,深入分析final關(guān)鍵字主要注意的幾個(gè)問(wèn)題
最后,總結(jié)一下final關(guān)鍵字
OK,開(kāi)始今天的文章
一、final關(guān)鍵字的基本使用
1、認(rèn)識(shí)final關(guān)鍵字
final可以修飾類(lèi)、方法、變量。那么分別是什么作用呢?
(1)修飾類(lèi):表示類(lèi)不可被繼承
(2)修飾方法:表示方法不可被覆蓋
(3)修飾變量:表示變量一旦被賦值就不可以更改它的值。java中規(guī)定final修飾成員變量必須由程序員顯示指定變量的值。
2、final關(guān)鍵字修飾類(lèi)
final關(guān)鍵字修飾類(lèi)表示這個(gè)類(lèi)是不可被繼承的,如何去驗(yàn)證呢?
3、final關(guān)鍵字修飾方法
final修飾的方法不能被重寫(xiě)。但是可以重載。下面給出了一個(gè)代碼例子。主要注意的是:父類(lèi)中private的方法,在子類(lèi)中不能訪(fǎng)問(wèn)該方法,但是子類(lèi)與父類(lèi)private方法相同的方法名、形參列表和返回值的方法,不屬于方法重寫(xiě),只是定義了一個(gè)新的方法。
public class FinalClass{ public final void test(){} public final void test(int i){} }
4、final關(guān)鍵字修飾變量
final關(guān)鍵字修飾變量,是比較麻煩的。但是我們只需要對(duì)其進(jìn)行一個(gè)分類(lèi)介紹就能理解清楚了。
(1)修飾成員變量
如果final修飾的是類(lèi)變量,只能在靜態(tài)初始化塊中指定初始值或者聲明該類(lèi)變量時(shí)指定初始值。
如果final修飾的是成員變量,可以在非靜態(tài)初始化塊、聲明該變量或者構(gòu)造器中執(zhí)行初始值。
(2)修飾局部變量
系統(tǒng)不會(huì)為局部變量進(jìn)行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時(shí),即可以在定義時(shí)指定默認(rèn)值(后面的代碼不能對(duì)變量再賦值),也可以不指定默認(rèn)值,而在后面的代碼中對(duì)final變量賦初值(僅一次)。
下面使用代碼去驗(yàn)證一下這兩種情況
public class FinalVar { final static int a = 0;//再聲明的時(shí)候就需要賦值 public static void main(String[] args) { final int localA; //局部變量只聲明沒(méi)有初始化,不會(huì)報(bào)錯(cuò),與final無(wú)關(guān)。 localA = 0;//在使用之前一定要賦值 //localA = 1; 但是不允許第二次賦值 } }
(3)修飾基本類(lèi)型數(shù)據(jù)和引用類(lèi)型數(shù)據(jù)
如果是基本數(shù)據(jù)類(lèi)型的變量,則其數(shù)值一旦在初始化之后便不能更改;
如果是引用類(lèi)型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。但是引用的值是可變的。
修飾基本類(lèi)型的數(shù)據(jù),在上面的代碼中基本上能夠看出,下面主要是描述引用類(lèi)型的變量
public class FinalReferenceTest{ public static void main(){ final int[] iArr={1,2,3,4}; iArr[2]=-3;//合法 iArr=null;//非法,對(duì)iArr不能重新賦值 final Person p = new Person(25); p.setAge(24);//合法 p=null;//非法 } }
二、final關(guān)鍵字需要注意的幾個(gè)問(wèn)題
1、final和static的區(qū)別
其實(shí)如果你看過(guò)我上一篇文章,基本上都能夠很容易得區(qū)分開(kāi)來(lái)。static作用于成員變量用來(lái)表示只保存一份副本,而final的作用是用來(lái)保證變量不可變。下面代碼驗(yàn)證一下
public class FinalTest { public static void main(String[] args) { AA aa1 = new AA(); AA aa2 = new AA(); System.out.println(aa1.i); System.out.println(aa1.j); System.out.println(aa2.i); System.out.println(aa2.j); } } //j值兩個(gè)都一樣,因?yàn)槭莝tatic修飾的,全局只保留一份 //i值不一樣,兩個(gè)對(duì)象可能產(chǎn)生兩個(gè)不同的值, class AA { public final int i = (int) (Math.random()*100); public static int j = (int) (Math.random()*100); } //結(jié)果是 65、23、67、23
2、為什么局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)只能訪(fǎng)問(wèn)局部final變量?
為了解決這個(gè)問(wèn)題,我們先要去使用代碼去驗(yàn)證一下。
public class Test { public static void main(String[] args) { } //局部final變量a,b public void test(final int b) { final int a = 10; //匿名內(nèi)部類(lèi) new Thread(){ public void run() { System.out.println(a); System.out.println(b); }; }.start(); } }
上段代碼中,如果把變量a和b前面的任一個(gè)final去掉,這段代碼都編譯不過(guò)。
這段代碼會(huì)被編譯成兩個(gè)class文件:Test.class和Test1.class。默認(rèn)情況下,編譯器會(huì)為匿名內(nèi)部類(lèi)和局部?jī)?nèi)部類(lèi)起名為Outter1.class。
原因是為什么呢?這是因?yàn)閠est()方法里面的參數(shù)a和b,在運(yùn)行時(shí),main線(xiàn)程快要結(jié)束,但是thread還沒(méi)有開(kāi)始。因此需要有一種機(jī)制,在使得運(yùn)行thread線(xiàn)程時(shí)候能夠調(diào)用a和b的值,怎辦呢?java采用了一種復(fù)制的機(jī)制,
也就說(shuō)如果局部變量的值在編譯期間就可以確定,則直接在匿名內(nèi)部里面創(chuàng)建一個(gè)拷貝。如果局部變量的值無(wú)法在編譯期間確定,則通過(guò)構(gòu)造器傳參的方式來(lái)對(duì)拷貝進(jìn)行初始化賦值。
三、總結(jié)
final關(guān)鍵字主要用在三個(gè)地方:變量、方法、類(lèi)。
對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類(lèi)型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類(lèi)型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。
當(dāng)用final修飾一個(gè)類(lèi)時(shí),表明這個(gè)類(lèi)不能被繼承。final類(lèi)中的所有成員方法都會(huì)被隱式地指定為final方法。
使用final方法的原因有兩個(gè)。第一個(gè)原因是把方法鎖定,以防任何繼承類(lèi)修改它的含義;第二個(gè)原因是效率。在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過(guò)于龐大,可能看不到內(nèi)嵌調(diào)用帶來(lái)的任何性能提升(現(xiàn)在的Java版本已經(jīng)不需要使用final方法進(jìn)行這些優(yōu)化了)。類(lèi)中所有的private方法都隱式地指定為final。
到此,關(guān)于“Java中的Final關(guān)鍵字的用法介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
新聞名稱(chēng):Java中的Final關(guān)鍵字的用法介紹
URL分享:http://www.sd-ha.com/article26/geghcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、App設(shè)計(jì)、建站公司、微信小程序、ChatGPT、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(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)