日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

1.19 final修饰符详解

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.19 final修饰符详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

final 在 Java 中的意思是最終,也可以稱為完結(jié)器,表示對(duì)象是最終形態(tài)的,不可改變的意思。final 應(yīng)用于類、方法和變量時(shí)意義是不同的,但本質(zhì)是一樣的,都表示不可改變,

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

  • final 用在變量的前面表示變量的值不可以改變,此時(shí)該變量可以被稱為常量。
  • final用在方法的前面表示方法不可以被重寫(子類中如果創(chuàng)建了一個(gè)與父類中相同名稱、相同返回值類型、相同參數(shù)列表的方法,只是方法體中的實(shí)現(xiàn)不同,以實(shí)現(xiàn)不同于父類的功能,這種方式被稱為方法重寫,又稱為方法覆蓋。)。
  • final 用在類的前面表示該類不能有子類,即該類不可以被繼承。

final 修飾變量

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

  • final 修飾的局部變量必須使用之前被賦值一次才能使用。
  • final 修飾的成員變量在聲明時(shí)沒有賦值的叫“空白 final 變量”。空白 final 變量必須在構(gòu)造方法或靜態(tài)代碼塊中初始化。

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

public class FinalDemo {void doSomething() {// 沒有在聲明的同時(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;} }

上述代碼 final int e;和 e = 100;是聲明局部常量,

其中 final int e;只是聲明沒有賦值,但必須在使用之前賦值( e = 100;),

其實(shí)局部常量最好在聲明的同時(shí)初始化。代碼
final int a = 5; // 直接賦值
final int b; // 空白final變量、
final static int c = 12;// 直接賦值
final static int d; // 空白final變量都聲明成員常量。

代碼 final int a = 5; // 直接賦值
final int b; // 空白final變量是實(shí)例常量,如果是空白 final 變量( final int b; // 空白final變量),則需要在構(gòu)造方法中初始化(b = 3;)。

代碼 final static int c = 12;// 直接賦值
final static int d; // 空白final變量是靜態(tài)常量,如果是空白 final 變量( final static int d; // 空白final變量),則需要在靜態(tài)代碼塊中初始化( d = 32;)。

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

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

當(dāng)使用 final 修飾基本類型變量時(shí),不能對(duì)基本類型變量重新賦值,因此基本類型變量不能被改變。 但對(duì)于引用類型變量而言,它保存的僅僅是一個(gè)引用,final 只保證這個(gè)引用類型變量所引用的地址不會(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;} }

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

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

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

public static final String SEX= "女";

final修飾方法

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

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

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

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

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

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

下面程序示范了如何在子類中“重寫”父類的 private final 方法。

public class PrivateFinalMethodTest {private final void test() {} } class Sub extends PrivateFinalMethodTest {// 下面的方法定義不會(huì)出現(xiàn)問題public void test() {} }

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

final 修飾的方法僅僅是不能被重寫,并不是不能被重載,因此下面程序完全沒有問題。

public class FinalOverload {// final 修飾的方法只是不能被重寫,完全可以被重載public final void test(){}public final void test(String arg){} }

final修飾類

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

下面代碼示范了 final 修飾的類不可被繼承。

final class SuperClass { } class SubClass extends SuperClass { //編譯錯(cuò)誤 }

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

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

1. final 修飾類中的變量
表示該變量一旦被初始化便不可改變,這里不可改變的意思對(duì)基本類型變量來說是其值不可變,而對(duì)對(duì)象引用類型變量來說其引用不可再變。

其初始化可以在兩個(gè)地方:一是其定義處,也就是說在 final 變量定義時(shí)直接給其賦值;二是在構(gòu)造方法中。這兩個(gè)地方只能選其一,要么在定義時(shí)給值,要么在構(gòu)造方法中給值,不能同時(shí)既在定義時(shí)賦值,又在構(gòu)造方法中賦予另外的值。

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

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

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

總結(jié)

以上是生活随笔為你收集整理的1.19 final修饰符详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。