国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

java final關(guān)鍵字的作用是什么

青燈夜游
發(fā)布: 2022-11-25 16:26:26
原創(chuàng)
27833人瀏覽過(guò)
在java中,final可以用來(lái)修飾類(lèi)、方法和變量。final修飾類(lèi),表示該類(lèi)是無(wú)法被任何其他類(lèi)繼承的,意味著此類(lèi)在一個(gè)繼承樹(shù)中是一個(gè)葉子類(lèi),并且此類(lèi)的設(shè)計(jì)已被認(rèn)為很完美而不需要進(jìn)行修改或擴(kuò)展。final修飾類(lèi)中的方法,表示該類(lèi)是無(wú)法被任何其他類(lèi)繼承的,不可以被重寫(xiě);也就是把該方法鎖定了,以防止繼承類(lèi)對(duì)其進(jìn)行更改。final修飾類(lèi)中的變量,表示該變量一旦被初始化便不可改變。

java final關(guān)鍵字的作用是什么

本教程操作環(huán)境:windows7系統(tǒng)、java8版、DELL G3電腦。

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

1、final可以用來(lái)修飾的結(jié)構(gòu):類(lèi)、方法、變量

2、final用來(lái)修飾一個(gè)類(lèi):此類(lèi)不能被其它類(lèi)繼承。

當(dāng)我們需要讓一個(gè)類(lèi)永遠(yuǎn)不被繼承,此時(shí)就可以用final修飾,但要注意:final類(lèi)中所有的成員方法都會(huì)隱式的定義為final方法。

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

比如:String類(lèi)、System類(lèi)、StringBuffer類(lèi)

3、final? 用來(lái)修飾方法? :表明此方法不可以被重寫(xiě)?

  • 作用

    (1) 把方法鎖定,以防止繼承類(lèi)對(duì)其進(jìn)行更改。

    (2) 效率,在早期的java版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但若方法過(guò)于龐大,可能在性能上不會(huì)有多大提升。因此在最近版本中,不需要final方法進(jìn)行這些優(yōu)化了。

    final方法意味著“最后的、最終的”含義,即此方法不能被重寫(xiě)。

  • 比如:Object類(lèi)中的getClass( )

4、final 用來(lái)修飾變量 ,此時(shí)變量就相當(dāng)于常量

  • final用來(lái)修飾屬性:可以考慮賦值的位置有:顯式初始化、代碼塊中初始化、構(gòu)造器中初始化

  • final修飾局部變量:尤其是使用final修飾形參時(shí),表明此形參是一個(gè)常量。當(dāng)我們調(diào)用此方法時(shí),給常量形參賦一個(gè)實(shí)參,一旦賦值之后,就只能在方法體內(nèi)使用此形參的值,不能重新進(jìn)行賦值。

  • 如果final修飾一個(gè)引用類(lèi)型時(shí),則在對(duì)其初始化之后便不能再讓其指向其他對(duì)象了或者說(shuō)他的地址不能發(fā)生變化了(因?yàn)橐玫闹凳且粋€(gè)地址,final要求值,即地址的值不發(fā)生變化),但該引用所指向的對(duì)象的內(nèi)容是可以發(fā)生變化的。本質(zhì)上是一回事。

5、使用 final 關(guān)鍵字聲明類(lèi)、變量和方法需要注意以下幾點(diǎn):

  • final 用在變量的前面表示變量的值不可以改變,此時(shí)該變量可以被稱(chēng)為常量。

  • final 用在方法的前面表示方法不可以被重寫(xiě)(子類(lèi)中如果創(chuàng)建了一個(gè)與父類(lèi)中相同名稱(chēng)、相同返回值類(lèi)型、相同參數(shù)列表的方法,只是方法體中的實(shí)現(xiàn)不同,以實(shí)現(xiàn)不同于父類(lèi)的功能,這種方式被稱(chēng)為方法重寫(xiě),又稱(chēng)為方法覆蓋。這里了解即可,教程后面我們會(huì)詳細(xì)講解)。

  • final 用在類(lèi)的前面表示該類(lèi)不能有子類(lèi),即該類(lèi)不可以被繼承。

final 修飾變量

final 修飾的變量即成為常量,只能賦值一次,但是 final 所修飾局部變量和成員變量有所不同。

  • final 修飾的局部變量必須使用之前被賦值一次才能使用。

  • final 修飾的成員變量在聲明時(shí)沒(méi)有賦值的叫“空白 final 變量”??瞻?final 變量必須在構(gòu)造方法或靜態(tài)代碼塊中初始化。

注意:final 修飾的變量不能被賦值這種說(shuō)法是錯(cuò)誤的,嚴(yán)格的說(shuō)法是,final 修飾的變量不可被改變,一旦獲得了初始值,該 final 變量的值就不能被重新賦值。

public class FinalDemo {
    void doSomething() {
        // 沒(méi)有在聲明的同時(shí)賦值
        final int e;
        // 只能賦值一次
        e = 100;
        System.out.print(e);
        // 聲明的同時(shí)賦值
        final int f = 200;
    }
    // 實(shí)例常量
    final int a = 5; // 直接賦值
    final int b; // 空白final變量
    // 靜態(tài)常量
    final static int c = 12;// 直接賦值
    final static int d; // 空白final變量
    // 靜態(tài)代碼塊
    static {
        // 初始化靜態(tài)變量
        d = 32;
    }
    // 構(gòu)造方法
    FinalDemo() {
        // 初始化實(shí)例變量
        b = 3;
        // 第二次賦值,會(huì)發(fā)生編譯錯(cuò)誤
        // b = 4;
    }
}
登錄后復(fù)制

上述代碼第 4 行和第 6 行是聲明局部常量,其中第 4 行只是聲明沒(méi)有賦值,但必須在使用之前賦值(見(jiàn)代碼第 6 行),其實(shí)局部常量最好在聲明的同時(shí)初始化。代碼第 13、14、16 和 17 行都聲明成員常量。代碼第 13 和 14 行是實(shí)例常量,如果是空白 final 變量(見(jiàn)代碼第 14 行),則需要在構(gòu)造方法中初始化(見(jiàn)代碼第 27 行)。代碼第 16 和 17 行是靜態(tài)常量,如果是空白 final 變量(見(jiàn)代碼第 17 行),則需要在靜態(tài)代碼塊中初始化(見(jiàn)代碼第 21 行)。

另外,無(wú)論是那種常量只能賦值一次,見(jiàn)代碼第 29 行為 b 常量賦值,因?yàn)橹?b 已經(jīng)賦值過(guò)一次,因此這里會(huì)發(fā)生編譯錯(cuò)誤。

final 修飾基本類(lèi)型變量和引用類(lèi)型變量的區(qū)別

當(dāng)使用 final 修飾基本類(lèi)型變量時(shí),不能對(duì)基本類(lèi)型變量重新賦值,因此基本類(lèi)型變量不能被改變。 但對(duì)于引用類(lèi)型變量而言,它保存的僅僅是一個(gè)引用,final 只保證這個(gè)引用類(lèi)型變量所引用的地址不會(huì)改變,即一直引用同一個(gè)對(duì)象,但這個(gè)對(duì)象完全可以發(fā)生改變。

下面程序示范了 final 修飾數(shù)組和 Person 對(duì)象的情形。

import java.util.Arrays;
class Person {
    private int age;
    public Person() {
    }
    // 有參數(shù)的構(gòu)造器
    public Person(int age) {
        this.age = age;
    }
    // 省略age的setter和getter方法
    // age 的 setter 和 getter 方法
}
public class FinalReferenceTest {
    public static void main(String[] args) {
        // 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ù)組元素賦值,合法
        iArr[2] = -8;
        System.out.println(Arrays.toString(iArr));
        // 下面語(yǔ)句對(duì)iArr重新賦值,非法
        // iArr = null;
        // final修飾Person變量,p是一個(gè)引用變量
        final Person p = new Person(45);
        // 改變Person對(duì)象的age實(shí)例變量,合法
        p.setAge(23);
        System.out.println(p.getAge());
        // 下面語(yǔ)句對(duì)P重新賦值,非法
        // p = null;
    }
}
登錄后復(fù)制

從上面程序中可以看出,使用 final 修飾的引用類(lèi)型變量不能被重新賦值,但可以改變引用類(lèi)型變量所引用對(duì)象的內(nèi)容。例如上面 iArr 變量所引用的數(shù)組對(duì)象,final 修飾后的 iArr 變量不能被重新賦值,但 iArr 所引用數(shù)組的數(shù)組元素可以被改變。與此類(lèi)似的是,p 變量也使用了 final 修飾,表明 p 變量不能被重新賦值,但 p 變量所引用 Person 對(duì)象的成員變量的值可以被改變。

注意:在使用 final 聲明變量時(shí),要求全部的字母大寫(xiě),如 SEX,這點(diǎn)在開(kāi)發(fā)中是非常重要的。

如果一個(gè)程序中的變量使用 public static final 聲明,則此變量將稱(chēng)為全局變量,如下面的代碼:

public static final String SEX= "女";
登錄后復(fù)制

final修飾方法

final 修飾的方法不可被重寫(xiě),如果出于某些原因,不希望子類(lèi)重寫(xiě)父類(lèi)的某個(gè)方法,則可以使用 final 修飾該方法。

Java 提供的 Object 類(lèi)里就有一個(gè) final 方法 getClass(),因?yàn)?Java 不希望任何類(lèi)重寫(xiě)這個(gè)方法,所以使用 final 把這個(gè)方法密封起來(lái)。但對(duì)于該類(lèi)提供的 toString() 和 equals() 方法,都允許子類(lèi)重寫(xiě),因此沒(méi)有使用 final 修飾它們。

下面程序試圖重寫(xiě) final 方法,將會(huì)引發(fā)編譯錯(cuò)誤。

public class FinalMethodTest {
    public final void test() {
    }
}
class Sub extends FinalMethodTest {
    // 下面方法定義將出現(xiàn)編譯錯(cuò)誤,不能重寫(xiě)final方法
    public void test() {
    }
}
登錄后復(fù)制

上面程序中父類(lèi)是 FinalMethodTest,該類(lèi)里定義的 test() 方法是一個(gè) final 方法,如果其子類(lèi)試圖重寫(xiě)該方法,將會(huì)引發(fā)編譯錯(cuò)誤。

對(duì)于一個(gè) private 方法,因?yàn)樗鼉H在當(dāng)前類(lèi)中可見(jiàn),其子類(lèi)無(wú)法訪(fǎng)問(wèn)該方法,所以子類(lèi)無(wú)法重寫(xiě)該方法——如果子類(lèi)中定義一個(gè)與父類(lèi) private 方法有相同方法名、相同形參列表、相同返回值類(lèi)型的方法,也不是方法重寫(xiě),只是重新定義了一個(gè)新方法。因此,即使使用 final 修飾一個(gè) private 訪(fǎng)問(wèn)權(quán)限的方法,依然可以在其子類(lèi)中定義與該方法具有相同方法名、相同形參列表、相同返回值類(lèi)型的方法。

下面程序示范了如何在子類(lèi)中“重寫(xiě)”父類(lèi)的 private final 方法。

public class PrivateFinalMethodTest {
    private final void test() {
    }
}
class Sub extends PrivateFinalMethodTest {
    // 下面的方法定義不會(huì)出現(xiàn)問(wèn)題
    public void test() {
    }
}
登錄后復(fù)制

上面程序沒(méi)有任何問(wèn)題,雖然子類(lèi)和父類(lèi)同樣包含了同名的 void test() 方法,但子類(lèi)并不是重寫(xiě)父類(lèi)的方法,因此即使父類(lèi)的 void test() 方法使用了 final 修飾,子類(lèi)中依然可以定義 void test() 方法。

final 修飾的方法僅僅是不能被重寫(xiě),并不是不能被重載,因此下面程序完全沒(méi)有問(wèn)題。

public class FinalOverload {
    // final 修飾的方法只是不能被重寫(xiě),完全可以被重載
    public final void test(){}
    public final void test(String arg){}
}
登錄后復(fù)制

final修飾類(lèi)

final 修飾的類(lèi)不能被繼承。當(dāng)子類(lèi)繼承父類(lèi)時(shí),將可以訪(fǎng)問(wèn)到父類(lèi)內(nèi)部數(shù)據(jù),并可通過(guò)重寫(xiě)父類(lèi)方法來(lái)改變父類(lèi)方法的實(shí)現(xiàn)細(xì)節(jié),這可能導(dǎo)致一些不安全的因素。為了保證某個(gè)類(lèi)不可被繼承,則可以使用 final 修飾這個(gè)類(lèi)。

下面代碼示范了 final 修飾的類(lèi)不可被繼承。

final class SuperClass {
}
class SubClass extends SuperClass {    //編譯錯(cuò)誤
}
登錄后復(fù)制

因?yàn)?SuperClass 類(lèi)是一個(gè) final 類(lèi),而 SubClass 試圖繼承 SuperClass 類(lèi),這將會(huì)引起編譯錯(cuò)誤。

final 修飾符使用總結(jié)

1. final 修飾類(lèi)中的變量

表示該變量一旦被初始化便不可改變,這里不可改變的意思對(duì)基本類(lèi)型變量來(lái)說(shuō)是其值不可變,而對(duì)對(duì)象引用類(lèi)型變量來(lái)說(shuō)其引用不可再變。其初始化可以在兩個(gè)地方:一是其定義處,也就是說(shuō)在 final 變量定義時(shí)直接給其賦值;二是在構(gòu)造方法中。這兩個(gè)地方只能選其一,要么在定義時(shí)給值,要么在構(gòu)造方法中給值,不能同時(shí)既在定義時(shí)賦值,又在構(gòu)造方法中賦予另外的值。

2. final 修飾類(lèi)中的方法

說(shuō)明這種方法提供的功能已經(jīng)滿(mǎn)足當(dāng)前要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類(lèi)繼承的類(lèi)來(lái)重寫(xiě)這種方法,但是繼承仍然可以繼承這個(gè)方法,也就是說(shuō)可以直接使用。在聲明類(lèi)中,一個(gè) final 方法只被實(shí)現(xiàn)一次。

3. final 修飾類(lèi)

表示該類(lèi)是無(wú)法被任何其他類(lèi)繼承的,意味著此類(lèi)在一個(gè)繼承樹(shù)中是一個(gè)葉子類(lèi),并且此類(lèi)的設(shè)計(jì)已被認(rèn)為很完美而不需要進(jìn)行修改或擴(kuò)展。

對(duì)于 final 類(lèi)中的成員,可以定義其為 final,也可以不是 final。而對(duì)于方法,由于所屬類(lèi)為 final 的關(guān)系,自然也就成了 final 型。也可以明確地給 final 類(lèi)中的方法加上一個(gè) final,這顯然沒(méi)有意義。

推薦教程:《java教程

以上就是java final關(guān)鍵字的作用是什么的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

java速學(xué)教程(入門(mén)到精通)
java速學(xué)教程(入門(mén)到精通)

java怎么學(xué)習(xí)?java怎么入門(mén)?java在哪學(xué)?java怎么學(xué)才快?不用擔(dān)心,這里為大家提供了java速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問(wèn)題
開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線(xiàn)php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)