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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java基础-关键字final

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

概述

final是java中一個保留的關鍵字,也被視為一個修飾符(Modifier),可以修飾一個成員變量、方法參數、方法甚至一個類。

final變量(域)

凡是用final關鍵字修飾的成員變量或本地變量都可以稱為final變量,即常量。被final修飾后的變量是只讀的,即一旦初始化后就不允許重新賦值。但如果final修飾的是一個對象的引用,則對象本身的內容是可以改變的,不可改變的是final對象不允許再指向其他對象。 在修飾變量時,final經常和其好基友final一起出現,如聲明一個日志對象時:

private final static Logger LOG = LoggerFactory.getLogger(Abc.class); 復制代碼

LOG被定義為static,使得這個變量與當前類Abc綁定,避免每次都new一個新對象,造成資源浪費;同時LOG被定義成final,可以有效防止無意中將LOG變量重新賦值。
在包括Math在內的工具類中,一般都包含很多final域,如:

public final class Math {...public static final double E = 2.7182818284590452354;public static final double PI = 3.14159265358979323846;... } 復制代碼

常量分類

  • 全局常量:類的公開靜態常量,使用public static final修飾
  • 類內常量:類的私有靜態屬性,使用private static final修飾
  • 局部常量:包括方法常量和參數常量,前者包括方法體內和代碼塊內定義的常量。
  • 命名規約:

  • 全局常量和類內常量使用字母全部大寫、單詞之間加下劃線的方式
  • 局部變量采用小駝峰形式
  • final入參

    首先需要明確一點java中只有按值傳遞,沒有按引用傳遞。

    基本類型參數

    對于基本數據類型,按值傳遞調用函數時并不會改變在原函數中的值。所以使用final修飾的目的不是為了防止調用函數對原數值造成副作用,而僅僅是為了防止用戶無意間對入參重新賦值,而可能引發的一些難以發現的BUG。

    引用類型參數

    與基本類型參數相似,使用final修飾引用類型入參時,如果在方法內對該變量重新賦值,會導致編譯失敗。

    public static void changeMe(int i){i = 123; // OK,但不會更改實參的值 }public static void changeMe(final int i) {i = 123; // 編譯失敗 }public static void changeMe(BookBean book) {book = new BookBean(); // OK,但是一般不會這樣使用,沒啥意義。最好為新new的對象啟用一個新的變量名 }public static void changeMe(final BookBean book){book = new BookBean(); // 編譯失敗 } 復制代碼

    final方法

    使用final修飾的方法,不能被子類override。意味著你認為這個方法已經很nice了,子類沒有必要再去修改了。從性能角度考慮,final方法相比非final方法要更快,因為前者是在編譯階段就已經被靜態綁定了,不需要在運行期間再去動態綁定。java.lang.Object類中大部分方法都是final修飾的,如:

    public final native Class<?> getClass(); public final native void notify(); 復制代碼

    final類

    final方法是不能被子類重寫,相似地,final類則表明該類不能被子類繼承。java中有許多類都是被final修飾的,如String類、包裝類、Objects。這些類都屬于不可變類,即只能創建只讀對象 。如果我們嘗試去extends一個String類,編譯器就不會同意。

    // String類定義 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { ... }; // Integer類定義 public final class Integerextends Number implements Comparable<Integer> { ... } // Objects類定義 public final clas Objects { ... } 復制代碼

    效率與安全

  • 當final變量是基本數據類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時確定。
  • 不可變類可以提供一些靜態方法,他們把頻繁被請求的實例緩存起來,從而當現有實現可以符合請求的時候,就不必創建新的實例。所有基本類型的包裝類型和BigInteger都有這樣的靜態工廠。使用這樣的靜態工廠也使得客戶端之間可以共享現有的實例,從而降低內存占用率和GC的回收成本。如Integer的內部類IntegerCache就提供了實例的緩存機制。詳見Integer的內部類IntegerCache。
  • final修飾的不可變類創建的不可變對象是線程安全的,它們不要求同步。當多個線程并發訪問這樣的對象時它們不會被破壞,這無疑是獲得線程安全最容易的辦法,即不可變對象可以被自由地共享。--《Effective Java》

  • 20190119更新:常量的分類及命名規約

    總結

    以上是生活随笔為你收集整理的java基础-关键字final的全部內容,希望文章能夠幫你解決所遇到的問題。

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