static{}(靜態代碼塊)與{}(非靜態代碼塊)的異同點

相同點:都是在JVM加載類時且在構造方法執行以前執行,在類中均可以定義多個,通常在代碼塊中對一些static變量進行賦值。
不一樣點:靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。

靜態代碼塊只在第一次new執行一次,以後再也不執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊可在普通方法中定義(不過做用不大);而靜態代碼塊不行。

例:
//普通類
java

public class PuTong {     
        public PuTong(){ 
           System.out.print("默認構造方法!-->");    
        }
  
        //非靜態代碼塊     
        { 
            System.out.print("非靜態代碼塊!-->");     
        }
 
        //靜態代碼塊     
        static{ 
            System.out.print("靜態代碼塊!-->");     
        }
 
        public static void test(){        
            { 
                 System.out.println("普通方法中的代碼塊!");         
            }     
         } 
}

//測試類 
public class TestClass {           
     /* 區別兩次new靜態與非靜態代碼塊執行狀況 */ 
    public static void main(String[] args) {         
           PuTong c1 = new PuTong();         
           c1.test();          
           PuTong c2 = new PuTong();         
           c2.test();     
     } 
}


通常狀況下,若是有些代碼必須在項目啓動的時候就執行的時候,須要使用靜態代碼塊,這種代碼是主動執行的;須要在項目啓動的時候就初始化,在不建立對象的狀況下,其餘程序來調用的時候,須要使用靜態方法,這種代碼是被動執行的.  測試


二者的區別就是:靜態代碼塊是自動執行的; 靜態方法是被調用的時候才執行的. 
做用:靜態代碼塊可用來初始化一些項目最經常使用的變量或對象;靜態方法可用做不建立對象也可能須要執行的代碼.this

在類中,能夠將某一塊代碼聲明爲靜態的,這樣的程序塊叫靜態初始化段。靜態代碼塊的通常形式以下:
static { 語句序列 }
靜態代碼塊只能定義在類裏面,它獨立於任何方法,不能定義在方法裏面。
靜態代碼塊裏面的變量都是局部變量,只在本塊內有效。
靜態代碼塊會在類被加載時自動執行,而不管加載者是JVM仍是其餘的類。
一個類中容許定義多個靜態代碼塊,執行的順序根據定義的順序進行。
靜態代碼塊只能訪問類的靜態成員,而不容許訪問實例成員。 之因此不容許靜態方法訪問實例成員變量,是由於實例成員變量是屬於某個對象的,而靜態方法在執行時,並不必定存在對象。一樣,由於實例方法能夠訪問實例成員變量,若是容許靜態方法調用實例方法,將間接地容許它使用實例成員變量,因此它也不能調用實例方法。基於一樣的道理,靜態方法中也不能使用關鍵字this。


code

相關文章
相關標籤/搜索