靜態代碼塊、非靜態代碼塊、構造方法的執行順序

java中常常有一些靜態塊,這是用來在生成類以前進行的初始化,不管java還C++語言中的static,都是最早初始化好的。結構以下: 
static { 
靜態語句代碼塊 
} 

{ 
非靜態語句代碼塊 
} 
異同點 
相同點:都是在JVM加載類時且在構造方法執行以前執行,在類中均可以定義多個,通常在代碼塊中對一些static變量進行賦     值。 
不一樣點:靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊--》非靜態代碼塊--》構造方法)。 
    靜態代碼塊只在第一次new執行一次,以後不在執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊能夠     在普通方法中定義(我的感受做用不大);而靜態代碼塊不行。 

Java代碼  
package com.sample.client;  
public class Test {  
    public int a;  
      
    static {  
        System.out.println("Test Static 靜態語句塊");  
    }  
    public Test() {  
        System.out.println("Test 默認無參構造器");  
    }  
    {  
        System.out.println("Test 非靜態");  
    }  
 

Java代碼  
package com.sample.client;  
  
public class Test1 extends Test {  
    public int i;  
    public double d;  
      
    static {  
        System.out.println("Test1 Static 靜態語句塊");  
    }  
      
    public Test1 () {  
        System.out.println("Test1 默認無參構造器");  
    }  
      
    {  
        System.out.println("Test1 非靜態");  
    }  
      
    public static void main(String[] args) {  
        Test1 t = new Test1();  
          
    }  
 

Java代碼  
輸出結果以下:  
  
Test Static 靜態語句塊  
Test1 Static 靜態語句塊  
Test 非靜態  
Test 默認無參構造器  
Test1 非靜態  
Test1 默認無參構造器  

小結: 
一、靜態代碼塊是在類加載時自動執行的,非靜態代碼塊在建立對象自動執行的代碼,不建立對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊--》非靜態代碼塊--》類構造方法。 
二、在靜態方法裏面只能直接調用同類中其餘的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。由於對於非靜態的方法和變量,須要先建立類的實例對象後方可以使用,而靜態方法在使用前不用建立任何對象。 
三、若是某些代碼必需要在項目啓動時候就執行的時候,咱們能夠採用靜態代碼塊,這種代碼是主動執行的;須要在項目啓動的時候就初始化,在不建立對象的狀況下,其餘程序來調用的時候,須要使用靜態方法,此時代碼是被動執行的。 
區別:靜態代碼塊是自動執行的; 
靜態方法是被調用的時候才執行的; 
做用:靜態代碼塊能夠用來初始化一些項目最經常使用的變量和對象;靜態方法能夠用做不建立對象也能夠能須要執行的代碼。java

相關文章
相關標籤/搜索