相同點:都是在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