新聞中心
想了解更多內(nèi)容,請?jiān)L問:

站在用戶的角度思考問題,與客戶深入溝通,找到鳳凰網(wǎng)站設(shè)計(jì)與鳳凰網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鳳凰地區(qū)。
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos./#zz
一、final使用場景
final可以稀釋變量,方法和類,用于便是修飾的內(nèi)容一旦賦值之后不會再被改變,比如string類就是一個final類型的類。
二、final修飾變量
在Java中變量可以分為成員變量和局部變量。
成員變量
通常每個類中成員變量可以分為類變量(static修飾的變量)以及實(shí)例變量針對這兩種類型的變量賦初始值的時機(jī)是不同的。
類變量可以再聲明變量的時候直接賦初始值或者在靜態(tài)代碼塊中給類變量賦初始值;而實(shí)例變量可以在聲明變量的時候給實(shí)例變量賦初始值,在非靜態(tài)初始化塊中以及構(gòu)造器中賦初始值。
類變量有兩個時機(jī)賦初始值,而實(shí)例變量可以有三個時機(jī)賦初始值。當(dāng)final變量未初始化時系統(tǒng)不會進(jìn)行隱式初始化,會出現(xiàn)報(bào)錯。
將這幾種情況歸納整理一下:
類變量:必須要在靜態(tài)初始化塊中指定初始值或者聲明該類變量時指定初始值,而且只能在這兩個地方之一警醒指定;
實(shí)例變量:必須要在非靜態(tài)初始化塊,聲明該實(shí)例變量或者在構(gòu)造器中指定初始值,而且只能在這三個地方警醒指定。
局部變量
final局部變量有程序員進(jìn)行顯示初始化,如果final局部變量已經(jīng)進(jìn)行了初始化則后面就不能再次進(jìn)行更改,如果final變量未進(jìn)行初始化,可以進(jìn)行賦值,當(dāng)且僅有一次賦值,一旦賦值之后再次賦值就會出錯。
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
final修飾的基本數(shù)據(jù)類型和引用類型有區(qū)別嗎?
通過上面的例子我們已經(jīng)看出來,如果final修飾的是一個基本數(shù)據(jù)類型的數(shù)據(jù),一旦賦值后就不能再次更改,那么,如果final修飾的是引用數(shù)據(jù)類型?這個引用的對象能夠改變嗎?
- package passtra;
- public class FinalExample{
- //在聲明final實(shí)例成員變量時進(jìn)行賦值
- private final static Person person=new Person(25, 175);
- public static void main(String[] args) {
- //對final引用數(shù)據(jù)類型person進(jìn)行更改
- person.age=22;
- System.err.println(person.toString());
- }
- static class Person{
- private int age;
- private int height;
- public Person(int age, int height) {
- super();
- this.age = age;
- this.height = height;
- }
- @Override
- public String toString() {
- return "Person [age=" + age + ", height=" + height + "]";
- }
- }
- }
當(dāng)我們對final修飾的應(yīng)用數(shù)據(jù)類型變量person的屬性改成22,是可以操作成功的。
通過代碼可以看出,當(dāng)final修飾基本數(shù)據(jù)類型時,不能對基本數(shù)據(jù)類型變量重新賦值,因此基本數(shù)據(jù)類型不能被改變,而對于引用數(shù)據(jù)類型,它僅僅保存的是一個引用,final只保證引用類型所引用的地址不會發(fā)生改變,即一直引用這個對象,但這個對象屬性是可以改變的。
宏變量
利用final變量的不可更改性,在馬祖下面三個條件時,該變量就會成為一個宏變量,即一個常量。
使用final修飾符修飾,在定義該final變量時就指定了初始值,該初始值在編譯時就能夠唯一指定。
注意:
當(dāng)程序中其他地方使用該宏變量時,編譯器會直接替換該變量的值。
三、final修飾方法
重寫
當(dāng)父類的方法被final修飾的時候,子類不能重寫父類的該方法。你如在object中g(shù)etClass()方法就是說final修飾的,我們就不能重寫該方法,但是hasdhCode()不是被final修飾的,我們就可以重寫hashCode()方法。
重載
- package passtra;
- public class FinalExample{
- public final void test(){
- }
- //沒有報(bào)錯
- public final void test(int i){
- }
- }
可以看出被final修飾的方法可以重載。
四、final修飾類
當(dāng)一個類被final修飾時,表明該類不能被子類繼承。
子類往往可以重寫父類的方法和屬性,會帶來一定的安全隱患,因此當(dāng)一個類不希望被繼承是就可以用final修飾。
五、final在JDK中有哪些應(yīng)用
final經(jīng)常被用作不變類上,利用final的不可更改性。
不變類
不變類的意思是創(chuàng)建該類的實(shí)例后,該實(shí)例的實(shí)例變量時不可改變的。滿足以下條件可以成為不變類:
- 使用private和final修飾該類的成員變量;
- 提供帶參數(shù)的構(gòu)造器用于初始化類的成員變量;
- 僅為該類的成員變量提供getter方法,不提供setter方法,因?yàn)槠胀ǚ椒o法修改final修飾的成員變量;
- 如果有必要就重寫object的hashCode和equals方法應(yīng)該保證用equals判斷相同的兩個對象其HashCode值也是相等的。
JDK中提供的八個包裝類和String類都是不可變的,可以看看string的實(shí)現(xiàn)
private final char value[];
可以看出string的value就是final修飾的,上述其他幾條性質(zhì)也是吻合的。
想了解更多內(nèi)容,請?jiān)L問:
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos./#zz
【編輯推薦】
- 2020年值得推薦的六大服務(wù)器管理軟件和工具
- 2021-2025年數(shù)字經(jīng)濟(jì)九大技術(shù)趨勢展望
- 20 分鐘建立一個 Ansible 實(shí)驗(yàn)室
- 聊聊通信界的“超級網(wǎng)紅”SRv6
- 2020年已如此糟糕,網(wǎng)絡(luò)安全的2021還會更差嗎?
當(dāng)前標(biāo)題:鴻蒙HarmonyOS開發(fā)Java并發(fā)-final關(guān)鍵字
網(wǎng)頁URL:http://www.5511xx.com/article/ccdjseh.html


咨詢
建站咨詢
