1.static可以用於修飾成員變數、方法以及塊,並不會改變類中成員的許可權修飾,如:private修飾的成員變數,類外只能類名或非私有方法呼叫,而不能使用物件名呼叫。
2.static方法和成員變數,可使用類名直接呼叫,而不需要例項化:類名.方法名();類名.變數名();
也可以例項化後,使用物件名呼叫。
3.static方法(靜態方法):
3.1 靜態方法中,沒有this,因為沒有建立物件;
3.2 靜態方法中不能呼叫非靜態成員變數、方法,但非靜態方法可以呼叫靜態成員變數、方法;
4.static變數(靜態變數):
4.1 靜態變數在類第一次載入時,就會初始化並賦值;
4.2 每一個靜態變數在記憶體中都是隻有一個副本,所有物件共享這個副本,無論哪個物件或是類名呼叫修改,都會使之變化;
4.3 static不能用於修飾區域性變數,這是Java語法規定的。
5.static塊:
5.1 靜態塊可以在類的任何位置定義,會在類第一次載入時,依次呼叫,並且只呼叫一次,即還沒建立物件便已呼叫:
public class Test extends Base{ static{ System.out.println("test static"); } public Test(){ System.out.println("test constructor"); } public static void main(String[] args) { new Test(); } } class Base{ static{ System.out.println("base static"); } public Base(){ System.out.println("base constructor"); } }
base static test static base constructor test constructor
執行過程:先要尋找到main方法,因為main方法是程式的入口,但是在執行main方法之前,必須先載入Test類,而在載入Test類的時候發現Test類繼承自Base類,因此會轉去先載入Base類,在載入Base類的時候,發現有static塊,便執行了static塊。在Base類載入完成之後,便繼續載入Test類,然後發現Test類中也有static塊,便執行static塊。在載入完所需的類之後,便開始執行main方法。在main方法中執行new Test()的時候會先呼叫父類的構造器,然後再呼叫自身的構造器。因此,便出現了上面的輸出結果。