http://ilexes.blog.51cto.com/705330/268868
//JAVA初始化分兩大步
//A、類的加載
//
// 先加載父類,在加載子類
// 加載父類後,完成靜态動作【靜态變量、靜态代碼塊(主動執行僅一次)】(按代碼順序)、【靜态方法(被動執行)】
// 加載子類後,完成靜态動作【靜态變量、靜态代碼塊(主動執行僅一次)】(按代碼順序)、【靜态方法(被動執行)】
//B、類的執行個體化
// 先執行個體化父類,在執行個體化子類
//
// 執行個體化父類,完成執行個體化【成員變量、初始化塊】(按代碼順序)、【父類構造方法】、【成員方法(被動執行)】
//
// 執行個體化子類,完成執行個體化【成員變量、初始化塊】(按代碼順序)、【子類構造方法】、【成員方法(被動執行)】
//注:類裝載步驟(詳解A步驟)
// 在Java中,類裝載器把一個類裝入Java虛拟機中,要經過三個步驟來完成:裝載、連結和初始化,其中連結又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
//裝載:查找和導入類或接口的二進制資料;
//連結:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
//校驗:檢查導入類或接口的二進制資料的正确性;
//準備:給類的靜态變量配置設定并初始化存儲空間;
//解析:将符号引用轉成直接引用;
//初始化:激活類的靜态變量的初始化Java代碼和靜态Java代碼塊。
//初始化類中屬性是靜态代碼塊的常用用途,但隻能使用一次。
package cn.ilex;
public class InitClass2 extends Parent2 {
// 初始化塊
{
new PrintStr2("子類--初始化塊");
}
// 靜态變量
public static PrintStr2 a=new PrintStr2("子類--靜态變量");
// 變量
public PrintStr2 b=new PrintStr2("子類--執行個體變量");
// 靜态初始化塊
static {
new PrintStr2("子類--靜态初始化塊(主動執行)");
}
// 構造器
public InitClass2() {
new PrintStr2("子類--構造器");
public void callParentStaticMethod(){
Parent2.printString(this.getClass().getName()+"callParentStaticMethod()方法 ");
}
// 程式入口
public static void main(String[] args) {
Parent2.printString(" InitClass類 main() 方法");
new PrintStr2("子類--進入程式入口 (靜态方法) InitClass main()");
new PrintStr2("子類--開始執行個體化 new InitClass()");
new InitClass2().callParentStaticMethod();
}
class Parent2 {
// 靜态初始化塊
new PrintStr2("父類--靜态初始化塊(主動執行)");
public static String str="父類--靜态方法被調用前加載完成的靜态變量";
// 靜态變量
public static PrintStr2 c=new PrintStr2("父類--靜态變量");
// 變量
public PrintStr2 d=new PrintStr2("父類--執行個體變量");
new PrintStr2("父類--初始化塊");
public Parent2() {
new PrintStr2("父類--構造器");
public static void printString(String s){
new PrintStr2("父類--靜态方法(被"+s+"調用執行)." );
new PrintStr2( "父類--靜态方法調用自己的靜态變量:str="+Parent2.str );
}
class PrintStr2{
private static int i=0;
static {
Parent2.printString("PrintStr2 類靜态塊");
}
public static int getCount(){
return i++;
}
public PrintStr2(String s){
System.out.println(PrintStr2.getCount()+"."+s);
public String toString(){
return " PrintStr2 類型的";