Java學習筆記之static

不知為何就叫呵呵發表於2016-08-14

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
View Code

執行過程:先要尋找到main方法,因為main方法是程式的入口,但是在執行main方法之前,必須先載入Test類,而在載入Test類的時候發現Test類繼承自Base類,因此會轉去先載入Base類,在載入Base類的時候,發現有static塊,便執行了static塊。在Base類載入完成之後,便繼續載入Test類,然後發現Test類中也有static塊,便執行static塊。在載入完所需的類之後,便開始執行main方法。在main方法中執行new Test()的時候會先呼叫父類的構造器,然後再呼叫自身的構造器。因此,便出現了上面的輸出結果。

 

相關文章