1. 程式人生 > >static使用詳解和使用誤區-java

static使用詳解和使用誤區-java

static的特點

A:隨著類的載入而載入,也就是說在專案啟動的時候,這個變數就已經被初始化了。
B:優先於物件存在
為什麼這樣說,static修飾的變數或者方法,在編譯的時候就已經被分配一定的記憶體,直達程式停止時才會被釋放,而物件需要new的時候才能使用。
C:被類的所有物件共享

舉例:咱們班級的學生應該共用同一個班級編號。 其實這個特點也是在告訴我們什麼時候使用靜態?
如果某個成員變數是被所有物件共享的,那麼它就應該定義為靜態的。

它可以修飾成員變數,還可以修飾成員方法,以及用來寫程式碼塊

在《Java程式設計思想》P86頁有這樣一段話:
  “static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。”

1、static修飾成員變數

修飾全域性成員變數

1、可以直接通過類名.變數名的方式直接呼叫,即被類的所有物件共享
2、呼叫靜態變數的方法可以是靜態方法,也可是是非靜態方法
3、隨著類的載入而載入,
4、優先於物件存在
 
 使用場景:一般,一個變數需要被多出呼叫,而且基本不會變的情況下,建議使用static修飾

修飾方法內變數

1、static不能修飾方法內部的變數,不然編譯錯誤。

2、static修飾方法

1、靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫。
2、靜態方法是類內部的一類特殊方法,只有在需要時才將對應的方法宣告成靜態的,一個類內部的方法一般都是非靜態的
3、靜態方法中沒有this和super關鍵字,只能訪問所屬類靜態成員變數以及靜態成員方法

使用場景:一般使用者工具類方法。

3、static程式碼塊

1、static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次(即靜態程式碼塊只是在程式啟動的時候被執行一次)。
2、曾經犯下的錯:

static Date date = null;  
    static {
        Date dateTime=new Date();
        SimpleDateFormat sdf=new
SimpleDateFormat("yyyy-MM-dd"); try { date = sdf.parse(sdf.format(dateTime)); } catch (ParseException e1) { e1.printStackTrace(); } }

date在類中很多地方都要用,索性就用程式碼塊定義一個全域性變數來初始化,但是我想要的date的當前日期,static修飾的程式碼塊只在程式啟動的時候被初始化一次,比如我九月一號啟動了專案,那麼這個date就一直是九月一號的日期了。

4、final和static一起使用

final和static一起使用時比較常見的使用方法,用final和static一起宣告的方法或者變數稱為‘全域性常量’,這種常量有兩個特點。
1、一旦給值不可以被修改,通過型別直接方法
2、修飾方法時,方法不可以被覆蓋,並通過類名可以直接訪問

5、static使用誤區

1、以後遇到了在寫吧