本文重點關注靜態塊、非靜態塊、建構函式的載入順序
直接上**:
package test.staticblock;
public class a
/*父類靜態塊*/
static
/*父類非靜態塊*/
/*父類靜態方法*/
public static void printstaticmethod()
/*父類普通方法*/
public void printnormalmethod()
}class b extends a
/*子類1靜態塊*/
static
/*子類1非靜態塊*/
/*子類1靜態方法*/
public static void printstaticmethod()
/*子類1普通方法*/
public void printnormalmethod()
}class c extends a
/*子類2靜態塊*/
static
/*子類2非靜態塊*/
/*子類2靜態方法*/
public static void printstaticmethod()
/*子類2沒有override父類的普通方法*/
}
package test.staticblock;
public class test
}
執行結果:
a static block
b static block
a non-static block
a constructor
b non-static block
b constructor
c static block
a non-static block
a constructor
c non-static block
c constructor
a print static method
b print normal method
a print static method
a print normal method
根據結果分析:
順序應該是這樣的:父類
static->
子類static->
父類預設
{}->
父類建構函式
->
子類預設
{}->
子類建構函式
a static block
父類靜態塊
b static block
子類1靜態塊
a non-static block
父類非靜態塊,預設塊
a constructor
父類建構函式
b non-static block
子類1非靜態塊,預設塊
b constructor
子類1建構函式
c static block
子類2靜態塊,由此可以看出static塊僅在類載入時執行且僅執行一遍,因為a的靜態塊已經執行過了,這裡不會再執行。
a non-static block
父類非靜態塊,預設塊
a constructor
父類建構函式
c non-static block
子類2非靜態塊,預設塊
c constructor
子類2建構函式
b print static method
b print vitural method
c print static method
a print vitural method 分析
:當執行
new b()和new c()
時,它首先去看父類裡面有沒有靜態**塊,如果有,它先去執行父類裡面靜態**塊裡面的內容,當父類的靜態**塊裡面的內容執行完畢之後,接著去執行子類
(自己這個類
)裡面的靜態**塊,當子類的靜態**塊執行完畢之後,它接著又去看父類有沒有非靜態**塊,如果有就執行父類的非靜態**塊,父類的非靜態**塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態**塊,如果有就執行子類的非靜態**塊。子類的非靜態**塊執行完畢再去執行子類的構造方法,這個就是乙個物件的初始化順序。總結:
物件的初始化順序
:首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態**塊,如果有就執行父類的非靜態**塊,父類的非靜態**塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態**塊,如果有就執行子類的非靜態**塊。子類的非靜態**塊執行完畢再去執行子類的構造方法。總之一句話,靜態**塊內容先執行,接著執行父類非靜態**塊和構造方法,然後執行子類非靜態**塊和構造方法。注意:
子類的構造方法,不管這個構造方法帶不帶引數,預設的它都會先去尋找父類的不帶引數的構造方法。如果父類沒有不帶引數的構造方法,那麼子類必須用
supper
關鍵子來呼叫父類帶引數的構造方法,否則編譯不能通過。
重要一點:
static 塊僅在類載入時,並非例項化時,被執行一遍,且在整個過程中只可能被執行一遍,這也就是在例項化c時
a a2 = new c();
a的static塊沒有被執行的原因。
但非靜態塊在例項化物件時總會被執行。
靜態塊一般用於初始化類中的靜態成員;而非靜態塊一般用於初始化類中的非靜態成員;
另外,非靜態塊是在建立物件時自動執行的**。
複製去google翻譯
java模式研究
不要把簡單的事情搞複雜,設計模式用來解決複雜的問題的 1.建立模型 1.1 工廠模式 原始社會 農耕社會 小作坊 spring中beanfactory factorybean 單例模式 為了提高資源重複利用 通過技術手段保證在整個系統執行階段,只有乙個例項 場景 配置檔案 監控程式 ioc容器 日曆...
JAVA靜態塊和非靜態塊的區別
靜態塊 static block 如下所示 public class staticblock1 public static void main string args 靜態塊是在類被呼叫到記憶體後開始執行的,它和建立物件或main方法都沒有關係。如果沒有 main 方法,程式仍然編譯成功,但執行錯誤...
JAVA靜態塊和非靜態塊的區別
靜態塊是在類被呼叫到記憶體後開始執行的,它和建立物件或main方法都沒有關係。如果沒有 main 方法,程式仍然編譯成功,但執行錯誤。靜態塊一般用於初始化類中的靜態成員,而非晶態塊一般用於初始化類中的非靜態成員。另外,非靜態塊是在建立物件時自動執行的 public class staticblock...