所謂“塊”,就是用{}所包含的代碼段,它們在邏輯上常常是一個整體。初始化塊主要用於對象的初始化操作,在創建對象時調用,可以用於完成初始化屬性值、加載其他類等功能。初始化塊的執行順序在構造方法之前,如果構造方法多次重載,此時可以考慮將構造方法中共通的代碼提到初始化塊中定義。
非靜態初始化塊主要用於對象的初始化操作,在每次創建對象時都要調用一次,其執行順序在構造方法之前。由於非靜態成員不能在靜態方法中使用,同樣也不能在靜態初始化塊中,因此,靜態初始化塊主要用於初始化靜態變量和靜態方法。靜態初始化塊只調用一次,是在類被第一次加載到內存時,並非要創建對象才執行。
import org.junit.Test; public class EqualsTest { @Test public void test(){ Print test1 = new Print(); Print test2 = new Print(); } } class Print{ { System.out.println("非靜態代碼塊"); } static{ System.out.println("靜態代碼塊"); } }
結果:
靜態初始化塊與非靜態初始化塊有一定的區別,靜態的初始化塊比非靜態初始化塊執行要早,而且靜態初始化塊只執行一次,非靜態的初始化塊可執行多次。靜態初始化塊的執行時機需要注意,它在類加載器第一次加載類時調用,不一定非要創建對象,例如使用類名.靜態方法名。