Java 中的final關鍵字

【java中爲什麼會有final變量】:

    final這個關鍵字的含義是“這是無法改變的”或者“終態的”;

    那麼爲什麼要阻止改變呢?

    java語言的發明者可能由於兩個目的而阻止改變:

    1).效率問題:

        jdk中的某些類的某些方法,是不允許被用戶覆蓋的,設計者可能認爲,所用方法已經是最好的方法,

        用戶私自覆蓋,或是由於疏忽而覆蓋,就會影響JVM或是系統的系能;

    2). 設計所需:

        衆所周知,有些情況必須使用final關鍵字,比如方法中的匿名內部類的參數傳遞;

 

【final關鍵字的使用方法】:

    【修飾變量】:

        final成員變量表示常量,只能被賦值一次,賦值後值不再改變。

    【修飾方法】:

        final方法不能被子類方法覆蓋,但可以被繼承。

    【修飾類】:

        final類不能被繼承,沒有子類,final類中所有方法都是final的。

 

【final的內存分配方式】:

    【修飾變量】:

        通常情況下,final變量有3個地方可以賦值:直接賦值,構造函數中,或是初始化塊中。

        【初始化】:

            由於在java的語法中,聲明和初始化是聯繫在一起的,

            也就是說:如果你不顯示的初始化一個變量,系統會自動用一個默認值來對其進行初始化。(如int就是0)

            對於final變量,在聲明時,如果你沒有賦值,系統默認這是一個空白域,在構造函數進行初始化,

            如果是靜態的,則可以在初始化塊。

        【內存】:

             常量(final變量)和非final變量的處理方式是不一樣的。

             每一個類型在用到一個常量時,都會複製一份到自己的常量池中。

             常量也像類變量(static)一樣保存在方法區,只不過他保存在常量池。

             (可能是,類變量被所有實例共享,而常量池是每個實例獨有的。)

    【修飾方法】:

        保存在方法區,並且可以被函數代碼直接替換,而不用等到執行時再決定具體是那個函數。

    【修飾類】:

        保存在方法區。

 

【java中變量的初始化順序】:

     變量的初始化次序優於任何方法,甚至在構造方法的前面。對於static變量也是一樣,

     如果變量是原始類型,那麼它得到一個標準的原始類型的初始值,

     如果是一個對象的引用,除非你創建了一個新的對象給這個引用,否則就是null。

     static變量在需要的時候纔會初始化,並且在這個類的構造函數和所有其他普通變量之前調用,static之後就不再進行初始化了,

     static變量在類初始化時(注意不是實例),就必須分配內存空間,

     static變量單獨劃分一塊存儲空間。

 

     java類首次裝入時,會對靜態成員變量或方法進行一次初始化,

     先初始化父類的靜態代碼-->初始化子類的靜態代碼-->

     (創建使歷史,如果不創建實例,則後面的不執行)初始化父類的非靜態代碼-->初始化父類的構造

         -->初始化子類的非靜態代碼-->初始化子類的構造

 

     類只有在使用new調用創建的時候纔會被java類裝載器裝入。

 

【final方法爲何會高效】:

    final方法會在編譯的過程中利用內嵌機制進行inline優化。

    inline優化是指:在編譯的時候直接調用函數代碼替換,而不是在運行時調用函數。

    inline需要在編譯的時候就知道最後要用哪個函數,    

    顯然,非final是不行的。

    非final方法可能在子類中被重寫,由於可能出現多態的情況,編譯器在編譯階段

    並不能確定將來調用方法的對象的真正類型,也就無法確定到底調用哪個方法。

 

【什麼是多態】:

    按字面的意思是“多種狀態”。在面嚮對象語言中,接口的多種不同的實現方式即爲多態。

    簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

 

【非final方法爲什麼會出現多態】:

    顯然,如果派生出一個子類,覆蓋非final方法,就會出現2個這樣的方法可供調用,這就是多態。

 

【final變量的變與不變】:

    有人說final變量在賦值後就不可變,

    那麼這個不變到底指的是什麼呢?

    這個不變指的是引用,是地址,而所引用的對象的內容仍然是可變的。

    就是說,這個final變量永遠指向某個對象,是一個常量指針,而不是指向常量的指針。

 

===========================================================================================

 

【final關鍵字的具體應用】:

    【final+變量】:

        在實際應用中,這種形式是非常少見的。

        比如logger是可以的,但是貌似並不是非常實用,或許用戶仍然希望通過setter來改變logger變量。

    【static+final+變量】:

        常量。經常使用。

    【final+方法】:

        JDK中常用,但是自己並未常用。

    【final+類】:

        helper類經常使用。

    【final用於匿名內部類的參數傳遞】:

        在多線程測試時,經常使用。

    【final用於方法的參數】:

        並不常用。

發佈了11 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章