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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

final修饰符

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 final修饰符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

final從字面上理解含義為“最后的,最終的”。在Java中也同樣表示出此種含義。final可以用來修飾變量(包括類屬性、對象屬性、局部變量和形參)、方法(包括類方法和對象方法)和類。

1. final修飾類:

final修飾類即表示此類已經是“最后的、最終的”含義。因此,用final修飾的類不能被繼承,即不能擁有自己的子類。如果試圖對一個已經用final修飾的類進行繼承,在編譯期間或發生錯誤。

2. final修飾方法(此方法不能被重寫(可以重載多個final修飾的方法)):

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

1 public class B extends A {2 3 public static void main(String[] args) {4 5 }6 7 public void getName() {8 9 } 10 } 11 12 class A { 13 14 /** 15 * 因為private修飾,子類中不能繼承到此方法,因此,子類中的getName方法是重新定義的、 16 * 屬于子類本身的方法,編譯正常 17 */ 18 private final void getName() { 19 20 } 21 22 /* 因為pblic修飾,子類可以繼承到此方法,導致重寫了父類的final方法,編譯出錯 23 public final void getName() { 24 25 } 26 */ 27 }

3. final 修飾變量:

final修飾的變量表示此變量是“最后的、最終的”含義。一旦定義了final變量并在首次為其顯式初始化后,final修飾的變量值不可被改變。

這里需要注意以下幾個問題:

  • final修飾的變量,無論是類屬性、對象屬性、形參還是局部變量,這些變量都是需要進行顯式初始化(即為其顯示指定初始值)。
    • 對于final修飾的形參,由于是實參傳遞過來的,很好理解。

    • 對于final修飾的局部變量,與未用final修飾的變量一樣,都是需要顯示初始化。即局部變量都是需要顯式初始化的。

    • 對于一般的類屬性和對象屬性,由類和對象的初始化過程中可以看出,首先都進行了默認初始化。然后對有顯示賦值的變量才再進行顯式初始化。

    • 但對final修飾的類屬性和對象屬性而言,如果不顯示初始化,其默認將是進行默認初始化后的值,這與final本身出發點矛盾,因此,Java語法規定:

    • final修飾的類屬性和變量屬性必須要進行顯式初始化賦值。

    • 另外,無論對于基本數據類型還是引用數據類型,final修飾的變量都是首次顯式初始化后值都不能修改。對于基本數據類型,很好理解。對于引用數據類型,引用變量指向的是實際的對象,但其存儲的是所指向對象的地址,因此,其值不能修改并不意味著其所指向的對象不能修改。

    final int[] arr = {1,2,3,4}; // arr = {}; 報錯,不可從新引用別的內存地址 arr[2] = 8; // 可以改變數組內容

    4. final修飾變量后導致的“宏替換”/"宏變量"問題

    Java 中宏變量/宏替換指的是在java代碼中在編譯期某些變量能夠直接被其本身的值所替換,編譯到.class文件中。因此,編譯后的.class文件中已經不存在此變了。

    在String類型的變量中,有時候經常遇到如下情況:

    1 public class Test {2 3 public static void main(String[] args) {4 5 String country = "China";6 String name = "qqyumidi";7 8 String userInfo = country + name; //編譯后此處依然是country和name變量9 String user = "China" + "qqyumidi"; //編譯后此處直接變成Chinaqqyumidi 10 11 } 12 }

    在上述代碼中的第9行,編譯后的變量結果直接為Chinaqqyumidi。而第8行代碼中,由于country和name都是普通的變量,編譯器無法在編譯時直接確定userInfo的值,因此此處編譯后結果不直接是Chinaqqyumidi。

    但是,如果希望第8行中的代碼在編譯期直接就能表示為Chinaqqyumidi,

    就需要用到final修飾符對country和name變量進行修飾。

    原因:final修飾符修飾的變量在由于其本身的特性,在編譯期就能直接確定其值,且此值不可變。在編譯過程中,可以直接將其變量直接轉換成其值本身去表示。

    1 public class Test {2 3 public static void main(String[] args) {4 5 final String country = "China";6 final String name = "qqyumidi";7 8 String userInfo = country + name; //編譯后此處直接是Chianqqyumidi9 10 } 11 }

    5.在接口中定義的成員默認就是有final static修飾的

    public class InterfaceDemo implements itf{public static void main(String[] args) {// 可以用類名調用age,說明age屬于類成員(靜態成員)System.out.println(InterfaceDemo.age); // 報錯The final field itf.age cannot be assigned 說明age是final類型的// InterfaceDemo.age = 20; } }interface itf {// 接口時候定義的變量,默認就是final staic 修飾int age = 10; }

    參考文章1
    參考文章2

    總結

    以上是生活随笔為你收集整理的final修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。