Java關鍵字static

一、定義

(一)什麼是static

    1.static方法就是沒有this的方法,在static方法內部不能調用非靜態方法,反過來是可以的,而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。

    2.被static修飾的成員變量和成員方法獨立於該類的任何對象,也就是說,它不依賴類特定的實例,被類的所有實例共享,不要實例化就可以使用。

    3.內存中獨一份,在類加載時候完成內存分配,建議使用【類名.*】直接使用。

二、用法

(一)靜態導入

    1.我們平時使用一個靜態方法的時候,都是【類名.方法名】,使用靜態變量的時候都是【類名.變量名】。這樣當代碼中多次使用該類時候會寫很多次類名,這種情況我們可以再頂部通過import導入該靜態類,這樣在代碼中則可以直接使用該變量或者方法而不用再寫前面的類名(不建議)。

    2.因爲很多不同的靜態類有相同的方法名,所以在靜態導入時候不要使用通配符(*),以免導入的方法或者變量閱讀困難而難以維護。

      1)正例: import static java.lang.Math.PI;

      2)反例:import static java.lang.Math.*;

(二)靜態變量

    1.被static關鍵字修飾的變量叫做靜態變量或者類變量,是屬於類,在加載類信息時候完成內存分配,在內存中只有一份,通過【類名.變量】使用。

    2.使用場景:對象中間共享值時候,或者經常被外部代碼經常訪問時候方便訪問變量。

    3.和final關鍵字一起使用,當修飾基本類型或者字符串類型表示引用和指向的實例都不可變,修飾容器類型,容器本身不可能但是容器內部保存元素可以修改。

(三)靜態方法

    1.一般類中的方法是用static修飾的,可以通過【類名.方法名】調用,也可以通過實例調用。靜態方法內部不能調用實例變量或者實例方法,也不能使用this、super關鍵字,只能訪問類的靜態成員變量和方法,因此static獨立於任何實例,而且static方法必須被實現不能用abstract修飾。

    2.即使沒有顯示的聲明爲static,類的構造器也是靜態方法。

    3.可以被重載、隱藏但是不可以被覆蓋。

      1)覆蓋是針對實例方法而言的,子類的實例方法不能覆蓋父類的靜態方法,子類的靜態方法也不能覆蓋父類的實例方法,若B覆蓋了A的方法,那麼不僅B不能訪問A被覆蓋的方法,將B轉換成A(父類指向子類的實例)同樣不能訪問A被覆蓋的方法(想調用需要super關鍵字)。

      2)隱藏是針對靜態方法和變量(靜態變量或者實例變量)而言的,變量可以交叉隱藏(子類實例變量/靜態變量可以隱藏父類的實例/靜態變量),若B隱藏了A的變量或方法,那麼B不能訪問A被隱藏的變量或方法,但將B轉換成A後可以訪問A被隱藏的變量或者方法。

      3)TTI(運行是類型檢查)只針對覆蓋,不針對隱藏:因爲覆蓋是動態綁定,是受RTTI約束的,隱藏不受RTTI約束,運行時類型爲引用變量所指向的對象的類型,編譯時類型是引用變量自身的類型。

(四)靜態代碼段

    1.靜態代碼塊就是用static修飾的用{}括起來的代碼段,它的主要目的就是對靜態屬性進行初始化。

      1)初始化實例變量:如果一個類中存在若干個構造函數,這些構造函數都需要對實例變量進行初始化,如果我們直接在構造函數中實例化,必定會產生很多重複代碼,繁瑣和可讀性差。這裏我們可以充分利用構造代碼塊來實現。這是利用編譯器會將構造代碼塊添加到每個構造函數中的特性。

      2)初始化實例環境:一個對象必須在適當的場景下才能存在,如果沒有適當的場景,則就需要在創建對象時創建此場景。我們可以利用構造代碼塊來創建此場景,尤其是該場景的創建過程較爲複雜。構造代碼會在構造函數之前執行。

    2.靜態代碼塊可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。

      1)程序大概執行順序:靜態屬性 > 靜態方法聲明 > 靜態塊 > 動態屬性> 普通方法聲明 > 構造塊 > 構造方法。

      2)繼承中的初始化順序:父類靜態代碼區和父類靜態成員 > 子類靜態代碼區和子類靜態成員 > 父類非靜態代碼區和普通成員 > 父類構造函數 > 子類非靜態代碼區和普通成員 > 子類構造函數。

(五)靜態內部類

    1.被static修飾的內部類,它可以不依賴於外部類實例對象而被實例化,而通常的內部類需要在外部類實例化後才能實例化。靜態內部類不能與外部類有相同的名字,不能訪問外部類的普通成員變量,只能訪問內部類中的靜態成員和靜態方法(包括私有類型)。

    2.只有內部類才能被static修飾,普通的類不可以。

    PS:在內部類章節中詳解

 三、注意事項

(一) 使用場景

    1.Staitc修飾變量時候,雖然可以使對象共享屬性,但是也導致該屬性變得難以控制,因爲任何地方都可能改變它,所以很少這樣使用,及時有這樣的場景也會通過其他的方式來實現共享。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章