標籤:
溫故而知新,代碼塊這東西時間一長一些東西容易忘記,比如靜態代碼塊、非靜態代碼款、靜態成員變數初始化、動態成員變數初始化、構造方法調用、類載入等等的順序機制是怎麼樣的?
話不多說了,一個例子足以說明一切:
package com.collectiontest;import org.junit.Test;public class BasicTest {@Testpublic void testBlock(){System.out.println("m1:");Mimi m1=new Mimi();System.out.println("m2:");Mimi m2=new Mimi();}}class Mimi {public static int si=0; int di=si;static{si++;System.out.println("static block1: si="+si);}{//si*=2;System.out.println("block2: si="+si+", di="+di);}static{si++;System.out.println("static block2: si="+si);}public Mimi() {di=10;System.out.println("constructor: si="+si+", di="+di);}}
執行結果:
m1:
static block1: si=1
static block2: si=2
block2: si=2, di=2
constructor: si=2, di=10
m2:
block2: si=2, di=2
constructor: si=2, di=10
這說明:靜態成員變數初始化和靜態代碼塊都是在第一次載入這個類的時候被調用的(不是main方法啟動並執行時候哦)。
執行順序是:
靜態成員變數初始化
靜態代碼塊調用
動態成員變數初始化
非靜態代碼塊調用
構造方法調用
Java靜態代碼塊和非靜態代碼塊、類載入、構造對象的機制