欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java關(guān)鍵字final

 更新時(shí)間:2021年05月27日 17:05:29   作者:星河入夢(mèng)丶  
今天帶大家學(xué)習(xí)Java基礎(chǔ)知識(shí),文中對(duì)關(guān)鍵字final作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下

一、常見(jiàn)問(wèn)題

  • 所有的final修飾的字段都是編譯期常量嗎?
  • 如何理解private所修飾的方法是隱式的final?
  • 說(shuō)說(shuō)final類(lèi)型的類(lèi)如何拓展?比如String是final類(lèi)型,我們想寫(xiě)個(gè)MyString復(fù)用所有String中方法,同時(shí)增加一個(gè)新的toMyString()的方法,應(yīng)該如何做?
  • final方法可以被重載嗎?可以
  • 父類(lèi)的final方法能不能夠被子類(lèi)重寫(xiě)?不可以
  • 說(shuō)說(shuō)final域重排序規(guī)則?
  • 說(shuō)說(shuō)final的原理?
  • 使用 final 的限制條件和局限性?

二、final修飾類(lèi)

當(dāng)某個(gè)類(lèi)的整體定義為final時(shí),就表明了你不能打算繼承該類(lèi),而且也不允許別人這么做。即這個(gè)類(lèi)是不能有子類(lèi)的。
注意:final類(lèi)中的所有方法都隱式為final,因?yàn)闊o(wú)法覆蓋他們,所以在final類(lèi)中給任何方法添加final關(guān)鍵字是沒(méi)有任何意義的。

三、final修飾方法

類(lèi)中所有private方法都隱式地指定為final的,由于無(wú)法取用private方法,所以也就不能覆蓋它??梢詫?duì)private方法增添final關(guān)鍵字,但這樣做并沒(méi)有什么好處。

public class Base {
    private void test() {
    }
}

public class Son extends Base{
    public void test() {
    }
    public static void main(String[] args) {
        Son son = new Son();
        Base father = son;
        //father.test();
    }
}
  

Base和Son都有方法test(),但是這并不是一種覆蓋,因?yàn)閜rivate所修飾的方法是隱式的final,也就是無(wú)法被繼承,所以更不用說(shuō)是覆蓋了,在Son中的test()方法不過(guò)是屬于Son的新成員罷了,Son進(jìn)行向上轉(zhuǎn)型得到father,但是father.test()是不可執(zhí)行的,因?yàn)锽ase中的test方法是private的,無(wú)法被訪問(wèn)到。

四、final方法是可以被重載的

我們知道父類(lèi)的final方法是不能夠被子類(lèi)重寫(xiě)的,那么final方法可以被重載嗎? 答案是可以的,下面代碼是正確的。

public class FinalExampleParent {
    public final void test() {
    }

    public final void test(String str) {
    }
}

修飾參數(shù)
Java允許在參數(shù)列表中以聲明的方式將參數(shù)指明為final,這意味這你無(wú)法在方法中更改參數(shù)引用所指向的對(duì)象。這個(gè)特性主要用來(lái)向匿名內(nèi)部類(lèi)傳遞數(shù)據(jù)。

五、修飾變量

public class Test {
    //編譯期常量
    final int i = 1;
    final static int J = 1;
    final int[] a = {1,2,3,4};
    //非編譯期常量
    Random r = new Random();
    final int k = r.nextInt();

    public static void main(String[] args) {

    }
}

k的值由隨機(jī)數(shù)對(duì)象決定,所以不是所有的final修飾的字段都是編譯期常量,只是k的值在被初始化后無(wú)法被更改。

六、static final

一個(gè)既是static又是final 的字段只占據(jù)一段不能改變的存儲(chǔ)空間,它必須在定義的時(shí)候進(jìn)行賦值,否則編譯器將不予通過(guò)。

public class finaltest
{
    //Random對(duì)象r
    static Random r = new Random();
    //生成隨機(jī)數(shù)k
    final int k = r.nextInt(10);
    //生成隨機(jī)數(shù)k2
    static final int k2 = r.nextInt(10);
    
    public static void main(String[] args) {
        
        finaltest t1 = new finaltest();
        
        System.out.println("k="+t1.k+" k2="+t1.k2);
        
        finaltest t2 = new finaltest();
        
        System.out.println("k="+t2.k+" k2="+t2.k2);
    }
}
  

k=2 k2=7
k=8 k2=7
我們可以發(fā)現(xiàn)對(duì)于不同的對(duì)象k的值是不同的,但是k2的值卻是相同的,這是為什么呢? 因?yàn)閟tatic關(guān)鍵字所修飾的字段并不屬于一個(gè)對(duì)象,而是屬于這個(gè)類(lèi)的。也可簡(jiǎn)單的理解為static final所修飾的字段僅占據(jù)內(nèi)存的一個(gè)一份空間,一旦被初始化之后便不會(huì)被更改。

七、black final

Java允許生成空白final,也就是說(shuō)被聲明為final但又沒(méi)有給出定值的字段,但是必須在該字段被使用之前被賦值,這給予我們兩種選擇:

  • 在定義處進(jìn)行賦值(這不叫空白final)
  • 在構(gòu)造器中進(jìn)行賦值,保證了該值在被使用前賦值。

這增強(qiáng)了final的靈活性。

final int i1 = 1;

    final int i2;//空白final

    public finaltest() {
        i2 = 1;
    }
    public finaltest(int x) {
        this.i2 = x;
    }

可以看到i2的賦值更為靈活。但是請(qǐng)注意,如果字段由static和final修飾,僅能在定義處賦值,因?yàn)樵撟侄尾粚儆趯?duì)象,屬于這個(gè)類(lèi)。

八、final域重排序規(guī)則

上面我們聊的final使用,應(yīng)該屬于Java基礎(chǔ)層面的,當(dāng)理解這些后我們就真的算是掌握了final嗎? 有考慮過(guò)final在多線程并發(fā)的情況嗎? 在java內(nèi)存模型中我們知道java內(nèi)存模型為了能讓處理器和編譯器底層發(fā)揮他們的最大優(yōu)勢(shì),對(duì)底層的約束就很少,也就是說(shuō)針對(duì)底層來(lái)說(shuō)java內(nèi)存模型就是一弱內(nèi)存數(shù)據(jù)模型。同時(shí),處理器和編譯為了性能優(yōu)化會(huì)對(duì)指令序列有編譯器和處理器重排序。那么,在多線程情況下,final會(huì)進(jìn)行怎樣的重排序? 會(huì)導(dǎo)致線程安全的問(wèn)題嗎? 下面,就來(lái)看看final的重排序。

到此這篇關(guān)于詳解Java關(guān)鍵字final的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字final內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java創(chuàng)建對(duì)象的六種常用方式總結(jié)

    Java創(chuàng)建對(duì)象的六種常用方式總結(jié)

    作為Java開(kāi)發(fā)者,經(jīng)常創(chuàng)建很多對(duì)象,你是否知道Java中創(chuàng)建對(duì)象有哪些方式呢?下面這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建對(duì)象的六種常用方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java深入淺出數(shù)組的定義與使用下篇

    Java深入淺出數(shù)組的定義與使用下篇

    數(shù)組是有序的元素序列,若將有限個(gè)類(lèi)型相同的變量的集合命名,那么這個(gè)名稱(chēng)為數(shù)組名。組成數(shù)組的各個(gè)變量稱(chēng)為數(shù)組的分量,也稱(chēng)為數(shù)組的元素,有時(shí)也稱(chēng)為下標(biāo)變量。數(shù)組是在程序設(shè)計(jì)中,為了處理方便,?把具有相同類(lèi)型的若干元素按有序的形式組織起來(lái)的一種形式
    2022-03-03
  • Java常用類(lèi)String的面試題匯總(java面試題)

    Java常用類(lèi)String的面試題匯總(java面試題)

    這篇文章主要介紹了Java常用類(lèi)String的面試題匯總,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • JAVA調(diào)用JavaScript方法代碼示例

    JAVA調(diào)用JavaScript方法代碼示例

    我們都知道腳本語(yǔ)言非常靈活,在處理某些問(wèn)題的時(shí)候Java實(shí)現(xiàn)用十幾行來(lái)寫(xiě),用js可能不到十行就寫(xiě)完,并且非常簡(jiǎn)潔,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用JavaScript方法的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Java實(shí)現(xiàn)壓縮圖片大小

    Java實(shí)現(xiàn)壓縮圖片大小

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)壓縮圖片大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springboot如何獲取request請(qǐng)求的原始url與post參數(shù)

    springboot如何獲取request請(qǐng)求的原始url與post參數(shù)

    這篇文章主要介紹了springboot如何獲取request請(qǐng)求的原始url與post參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java File類(lèi)的簡(jiǎn)單使用教程(創(chuàng)建、刪除、遍歷與判斷是否存在等)

    Java File類(lèi)的簡(jiǎn)單使用教程(創(chuàng)建、刪除、遍歷與判斷是否存在等)

    這篇文章主要給大家介紹了關(guān)于Java File類(lèi)的簡(jiǎn)單使用(創(chuàng)建、刪除、遍歷與判斷是否存在等)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    這篇文章主要介紹了已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java HashMap詳解及實(shí)例代碼

    java HashMap詳解及實(shí)例代碼

    這篇文章主要介紹了java HashMap詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 詳解Java中的時(shí)間處理與時(shí)間標(biāo)準(zhǔn)

    詳解Java中的時(shí)間處理與時(shí)間標(biāo)準(zhǔn)

    這篇文章主要為大家詳細(xì)介紹了三個(gè)時(shí)間標(biāo)準(zhǔn)GMT,CST,UTC的規(guī)定,以及Java進(jìn)行時(shí)間處理的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09

最新評(píng)論