国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

淺析Java中的final關(guān)鍵字(詳細)

這篇具有很好參考價值的文章主要介紹了淺析Java中的final關(guān)鍵字(詳細)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

文章目錄

1.什么是final關(guān)鍵字(概念)

2.final關(guān)鍵字基本用法

3.深入理解final關(guān)鍵字

4.final 關(guān)鍵字的最佳實踐

什么是final關(guān)鍵字(概念)

談到final關(guān)鍵字,想必很多人都不陌生,在使用匿名內(nèi)部類的時候可能會經(jīng)常用到final關(guān)鍵字 。final 是 Java 中的一個關(guān)鍵字,可以用于修飾類、方法和變量。當(dāng)一個類被聲明為 final 時,它意味著該類不能被繼承。當(dāng)一個方法被聲明為 final 時,它意味著該方法不能被重寫。當(dāng)一個變量被聲明為 final 時,它意味著該變量的值不能被修改。

?final關(guān)鍵字基本用法

常見有5種用法,我們來歸納總結(jié)一下:

1. 用來修飾一個類

2. 用來修飾一個方法

3. 用來修飾成員變量

4. 用來修飾局部變量

5. 用來修飾方法參數(shù)

final飾修類?

如果聲明一個類為final類,? 那么這個類就是最終類,不能被繼承

public final class ParentClass {
    public void happy() {
        System.out.println("高興");
    }
}

當(dāng)寫一個類去繼承它的時候

public class ChildClass extends ParentClass{
 
}

就會報錯錯誤;

注意:一個類如果是final的,那么其中所有的成員方法都無法進行覆蓋重寫。

final類中的成員變量可以根據(jù)需要設(shè)為final,但是final類中的所有成員方法都會被隱式地指定為final方法。 在使用final修飾類的時候,一定要謹慎選擇,除非這個類以后不會用來繼承或者出于安全考慮,盡量不要將類設(shè)計為final類。

final修飾方法?

當(dāng)final用來修飾一個方法的時候,這個方法就是最終方法,那么很明顯就是說不能被覆蓋重寫。

public class ParentClass {
 
    public void happy() {
        System.out.println("高興");
    }
    
    //用final關(guān)鍵字修飾的方法
    protected final void play(){
        System.out.println("開心的玩耍");
    }
 
}

我們在繼承類中去看下 play()方法是不可以被override的,也就是是報錯,說明 final修飾的方法,是一個最終方法,不能被子類去覆蓋重寫。

“使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現(xiàn)版本中,會將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優(yōu)化了?!?br> 因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設(shè)置為final的。即父類的final方法是不能被子類所覆蓋的,也就是說子類是不能夠存在和父類一模一樣的方法的。

final修飾的方法表示此方法已經(jīng)是“最后的、最終的”含義,亦即此方法不能被重寫(可以重載多個final修飾的方法)。此處需要注意的一點是:因為重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時訪問控制權(quán)限為private,將會導(dǎo)致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和參數(shù),此時不再產(chǎn)生重寫與final的矛盾,而是在子類中重新定義了新的方法。(注:類的private方法會隱式地被指定為final方法)

final修飾變量

final成員變量表示常量,只能被賦值一次,賦值后值不再改變。
當(dāng)final修飾一個基本數(shù)據(jù)類型時,表示該基本數(shù)據(jù)類型的值一旦在初始化后便不能發(fā)生變化;如果final修飾一個引用類型時,則在對其初始化之后便不能再讓其指向其他對象了,但該引用所指向的對象的內(nèi)容是可以發(fā)生變化的。本質(zhì)上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發(fā)生變化。
final修飾一個成員變量(屬性),必須要顯示初始化。這里有兩種初始化方式,一種是在變量聲明的時候初始化;第二種方法是在聲明變量的時候不賦初值,但是要在這個變量所在的類的所有的構(gòu)造函數(shù)中對這個變量賦初值。

class Animal {
    private final int count = 0;
    public Animal() {
        count = 1; //報錯
        final Object object = new Object();
        object = new Object(); //報錯
    }
}

深入理解final關(guān)鍵字?

類的final變量和普通變量的區(qū)別

當(dāng)用final作用于類的成員變量時,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時或者構(gòu)造器中進行初始化賦值,而且final變量一旦被初始化賦值之后,就不能再被賦值了。
那么final變量和普通變量到底有何區(qū)別呢?下面請看一個例子:

public class Test {
    public static void main(String[] args) {
        String a = "helloworld";
        final String b = "hello";
        String c = "hello";
        String x = b + "world";
        String y = c + "world";
        System.out.println(a == x);
        System.out.println(a == y);
    }
}

輸出結(jié)果:true ; false

大家可以先想一下這道題的輸出結(jié)果。為什么第一個比較結(jié)果為true,而第二個比較結(jié)果為fasle。這里面就是final變量和普通變量的區(qū)別了,當(dāng)final變量是基本數(shù)據(jù)類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當(dāng)做編譯期常量使用。也就是說在用到該final變量的地方,相當(dāng)于直接訪問的這個常量,不需要在運行時確定。這種和C語言中的宏替換有點像。因此在上面的一段代碼中,由于變量b被final修飾,因此會被當(dāng)做編譯器常量,所以在使用到b的地方會直接將變量b 替換為它的值。而對于變量d的訪問卻需要在運行時通過鏈接來進行。想必其中的區(qū)別大家應(yīng)該明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會進行這樣的優(yōu)化,比如下面的這段代碼就不會進行優(yōu)化:

public class Test {
    public static void main(String[] args) {
        String a = "helloworld";
        final String b = getHello();
        String x = b + "world";
        System.out.println(a == x);
    }
    public static String getHello() {
        return "hello";
    }
}

這段代碼的輸出結(jié)果為false。這里要注意一點就是:不要以為某些數(shù)據(jù)是final就可以在編譯期知道其值,通過變量b我們就知道了,在這里是使用getHello()方法對其進行初始化,他要在運行期才能知道其值。

被final修飾的引用變量指向的對象內(nèi)容可變?

在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內(nèi)容可變嗎?看下面這個例子:

public class Test {
    public static void main(String[] args) {
       final Object object = new Object();
        System.out.println(++object.i);
    }
}
class Object {
    public int i = 0;
}

輸出結(jié)果: 1

這段代碼可以順利編譯通過并且有輸出結(jié)果,輸出結(jié)果為1。這說明引用變量被final修飾之后,雖然不能再指向其他對象,但是它指向的對象的內(nèi)容是可變的。

?final參數(shù)的問題

在實際應(yīng)用中,我們除了可以用final修飾成員變量、成員方法、類,還可以修飾參數(shù)、若某個參數(shù)被final修飾了,則代表了該參數(shù)是不可改變的。如果在方法中我們修改了該參數(shù),則編譯器會提示你:The final local variable i cannot be assigned. It must be blank and not using a compound assignment??聪旅娴睦樱?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-769482.html

public class TestFinal {
    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        int i = 0;
        testFinal.changeValue(i);
        System.out.println(i);
    }

    public void changeValue(final int i) {
        //final參數(shù)不可改變
        i++; //報錯,因為參數(shù)i已經(jīng)被final修飾了
        System.out.println(i);
    }
}

上面這段代碼changeValue方法中的參數(shù)i用final修飾之后,就不能在方法中更改變量i的值了。值得注意的一點,方法changeValue和main方法中的變量i根本就不是一個變量,因為java參數(shù)傳遞采用的是值傳遞,對于基本類型的變量,相當(dāng)于直接將變量進行了拷貝。所以即使沒有final修飾的情況下,在方法內(nèi)部改變了變量i的值也不會影響方法外的i。文章來源地址http://www.zghlxwxcb.cn/news/detail-769482.html

到了這里,關(guān)于淺析Java中的final關(guān)鍵字(詳細)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 淺析Java中volatile關(guān)鍵字

    淺析Java中volatile關(guān)鍵字

    ????????Java中的volatile用于修飾一個變量,當(dāng)這個變量被多個線程共享時,這個變量的值如果發(fā)生更新,每個線程都能獲取到最新的值。volatile在多線程環(huán)境下還會禁止指令重排序,確保變量的賦值操作按照代碼的順序執(zhí)行。需要注意是它不能保證變量操作的

    2024年01月21日
    瀏覽(23)
  • Java 基礎(chǔ)進階篇(三)—— 權(quán)限修飾符、final 關(guān)鍵字與枚舉

    Java 基礎(chǔ)進階篇(三)—— 權(quán)限修飾符、final 關(guān)鍵字與枚舉

    權(quán)限修飾符 用于約束成員變量、構(gòu)造器、方法等的訪問范圍。 權(quán)限修飾符: 有四種作用范圍由小到大 (private - 缺省 -protected - public) 注: 不同包下的子類指的是,不同包下的子類對象能訪問,當(dāng)前類創(chuàng)建父類對象訪問不了。 定義成員變量、構(gòu)造器、方法等一般需滿足如下要

    2024年02月02日
    瀏覽(93)
  • 全面理解java中的構(gòu)造方法以及this關(guān)鍵字的用法(超詳細)

    全面理解java中的構(gòu)造方法以及this關(guān)鍵字的用法(超詳細)

    Hello,各位鐵汁們!我是小??兒哈!今天我又來更新我的Java基礎(chǔ)學(xué)習(xí)博客了。 本篇主要內(nèi)容概述: 1、??如何用構(gòu)造方法初始化對象 2、??為啥要有this這個 3、??this.屬性名訪問成員變量、成員方法 4、??this.方法名 || this.()的用法 目錄 初識構(gòu)造方法? 構(gòu)造方法的使

    2023年04月09日
    瀏覽(22)
  • 【Java基礎(chǔ)教程】(十四)面向?qū)ο笃?· 第八講:多態(tài)性詳解——向上及向下轉(zhuǎn)型、關(guān)鍵字 final與 instanceof的作用~

    【Java基礎(chǔ)教程】(十四)面向?qū)ο笃?· 第八講:多態(tài)性詳解——向上及向下轉(zhuǎn)型、關(guān)鍵字 final與 instanceof的作用~

    掌握final 的主要作用及使用; 掌握對象多態(tài)性的概念以及對象轉(zhuǎn)型的操作; 掌握instanceof 的主要作用及使用; 在Java 中 final稱為終結(jié)器,在Java 里面可以使用 final定義類、方法和屬性,用于表示不可變性 。 final 類:當(dāng)一個類被聲明為 final 時,意味著該類不能被

    2024年02月16日
    瀏覽(114)
  • Java中的volatile關(guān)鍵字實現(xiàn)原理

    在并發(fā)編程中,線程之間的可見性問題是非常重要的一項難題。Java中提供了一種解決并發(fā)可見性問題的機制,即volatile。 在本文中,我們將會講解Java中volatile的實現(xiàn)原理,為什么它能夠保證可見性,以及背后的實現(xiàn)原理涉及到的內(nèi)存屏障和JVM屏障等內(nèi)容。在學(xué)習(xí)

    2023年04月27日
    瀏覽(21)
  • Java面試題:請談?wù)凧ava中的volatile關(guān)鍵字?

    在Java中,volatile是一種特殊的修飾符,用于確保多線程環(huán)境下的變量 可見性和順序性 。當(dāng)一個變量被聲明為volatile時,它可以確保以下兩點: 內(nèi)存可見性 :當(dāng)一個線程修改了一個volatile變量的值,其他線程會立即看到這個改變。這是因為volatile會禁止CPU緩存和編

    2024年04月23日
    瀏覽(22)
  • Java中 private關(guān)鍵字 詳細用法及解釋

    Java中 private關(guān)鍵字 詳細用法及解釋

    ? 出于 安全性考慮 ,我們在寫字段時,盡量考慮采用 封裝 ,這樣可以隱藏類的細節(jié),只對外開放接口即可實現(xiàn)對象之間的交互。 private是 一個 訪問限定修飾符 可修飾的的范圍: 修飾成員變量: 表示當(dāng)前成員變量 只能在當(dāng)前類中使用 修飾成員方法: 表示當(dāng)前成員方法 只

    2024年02月03日
    瀏覽(91)
  • static關(guān)鍵字和final關(guān)鍵字

    在java的中,static和final是兩個必須掌握的。static和final用法多樣,且在一定環(huán)境下使用,可以提高程序的運行性能,優(yōu)化程序的結(jié)構(gòu)。下面將依次介紹static和final。注意,某些場景下,staic和final可以聯(lián)合使用

    2024年02月09日
    瀏覽(98)
  • final關(guān)鍵字的作用

    目錄 1.修飾類時 2.修飾方法時 3.修飾屬性和局部變量時 3.1修飾局部變量時 3.2修飾成員變量時 3.3修飾類變量時 4.final與普通變量的區(qū)別 5.final用于引用 1.只能是公共的(public)就算不寫也是public 2.被final修飾的類不可以被繼承 1.方法不能不能覆蓋 2.被final修飾的方法,JVM會嘗試

    2024年02月05日
    瀏覽(78)
  • final 關(guān)鍵字的用法

    final; //使用的位置: 1.用于聲明常量:基本數(shù)據(jù)類型的常量不允許修改值, ? ? ? ? ? ? ? ? ? ? ? ? ? ?引用數(shù)據(jù)類型的常量不允許重新分配內(nèi)存地址 2.用于聲明方法(最終方法),該方法在了類中不能重寫,在當(dāng)前類中允許重載 3.用于聲明類(最終類), 該類不允許子類繼承

    2024年01月21日
    瀏覽(93)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包