天天看點

面試-java關鍵字final和static

轉載自:http://lavasoft.blog.51cto.com/62575/18771/ 

一、final

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

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

 final成員變量表示常量,隻能被指派一次,指派後值不再改變。

 final不能用于修飾構造方法。

另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什麼情況,編譯器都確定空白final在使用之前必須被初始化。

當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

二、static

被static修飾的成員變量和成員方法獨立于該類的任何對象。被類的所有執行個體共享。隻要這個類被加載,Java虛拟機就能根據類名在運作時資料區的方法區内定找到他們。是以,static對象可以在它的任何對象建立之前通路,無需引用任何對象。

 用static修飾的代碼塊表示靜态代碼塊,當Java虛拟機(JVM)加載類時,就會執行該代碼塊。

1、static變量

        對于靜态變量在記憶體中隻有一個拷貝(節省記憶體),JVM隻為靜态配置設定一次記憶體,在加載類的過程中完成靜态變量的記憶體配置設定,可用類名直接通路(友善),當然也可以通過對象來通路(但是這是不推薦的)。

        對于執行個體變量,沒建立一個執行個體,就會為執行個體變量配置設定一次記憶體,執行個體變量可以在記憶體中有多個拷貝,互不影響(靈活)。

2、靜态方法

        靜态方法可以直接通過類名調用,任何的執行個體也都可以調用,是以靜态方法中不能用this和super關鍵字,不能直接通路所屬類的執行個體變量和執行個體方法(就是不帶static的成員變量和成員成員方法),隻能通路所屬類的靜态成員變量和成員方法。因為執行個體成員與特定的對象關聯!

        因為static方法獨立于任何執行個體,是以static方法必須被實作,而不能是抽象的abstract。

3、static代碼塊

        static代碼塊也叫靜态代碼塊,是在類中獨立于類成員的static語句塊,可以有多個,位置可以随便放,它不在任何的方法體内,JVM加載類時會執行這些靜态的代碼塊,如果static代碼塊有多個,JVM将按照它們在類中出現的先後順序依次執行它們,每個代碼塊隻會被執行一次。

4、static和final一塊用表示什麼

對于被static和final修飾過的執行個體常量,執行個體本身不能再改變了,但對于一些容器類型(比如,ArrayList、HashMap)的執行個體變量,不可以改變容器變量本身,但可以修改容器中存放的對象。

繼續閱讀