淺談static關鍵字的四種用法
在一個person類中,一個成員變數例如 String name,當new2個person()物件時候,這2個物件在堆的位置是不同的,給name賦值張三、李四,這兩個物件的 name是互相不影響的。
當用static修飾時,例如static String name,這個變數是存在靜態區,被堆中的物件所共享。如果依次賦值給2個物件name張三、李四。最終2個物件的name為李四(因為後一次的賦值在靜態區中將前一次的賦值覆蓋);
該修飾只會在特定情況下使用,例如給一個數量統計count一個初始化值0,後續根據程式碼邏輯增加。可以修飾為例如:private static int count=0;
2、修飾成員方法:
static修飾方法後,最大的作用就是可以"類名.方法名"呼叫該方法。但是在實際開發中也少用到該方式,因為一是static修飾後的方法資源共享,在多執行緒場景不安全。二是靜態資源常駐記憶體,很難被回收;
static方法也是沒有this的方法,this代表當前物件。而static方法不需要物件;
主要用在沒有建立物件的時候呼叫方法/變數;
擴充套件:
構造器是靜態方法麼?
構造器中可以有"this",並且當建立物件時必須new Person();此時用到了構造器。而static方法沒有this,也不屬於任何物件,並且構造器也不是方法。所以構造器不是靜態方法;
3、靜態塊
static修飾靜態塊後,將要修飾的成員同一放在一個static中。該靜態化會在第一次使用類時,最先初始化static修飾的靜態塊。並且在程式執行過程中,只需要初始化一次,不會進行多次初始化;
輸出結果:
animal staticcat staticanimal constructor
cat constructor
載入順序:首先執行main方法,但是在執行main方法之前會先載入類,發現Test繼承Base類,所有先載入Base類,再載入Test類。載入類的時候執行靜態程式碼塊,所以依次輸出animal static、cat static。載入完類後執行main方法,建立物件new Cat(),執行構造器,先執行父類,再執行子類,則依次輸出animal constructor、cat constructor。(構造器在new物件後才會去初始化)
4、靜態導包
靜態導包指在匯入包前用static修飾,作用是當使用靜態導包後,引用匯入類的方法(變數)時,可以不用XXX=類名.方法,直接XXX=方法();(變數也是一樣);
但是有一個缺點,如果頻繁使用靜態導包,會降低程式碼可讀性。並且如果匯入的不同類有相同方法名(或變數名),可能會衝突。
參考文章:https://www.cnblogs.com/dolphin0520/p/3799052.html https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral http://blog.csdn.net/qq_17864929/article/details/48006835