天天看點

java類初始化過程

/*
測試3個内容:
類加載順序
子父類執行過程
對象初始化過程


從幾次試驗我們看到
當執行到類時,類被加載到記憶體,并初始化
靜态成員被加載到共享區
不用執行個體化對象就可以調用靜态資源

靜态成員變量,靜态成員方法,靜态代碼塊,隻初始化一次

而普通變量,普通代碼塊,構造方法,在每次執行個體化對象時都要初始化

子類對象要初始化時,
會先初始化父類靜态成員和靜态代碼塊,
再初始化子類靜态成員和靜态代碼塊,
然後是父類普通代碼塊,父類構造方法
然後是子類普通代碼塊,子類構造函數


當子類名直接調用繼承自父類的靜态成員時,子類不會初始化,而隻初始化父類(因為這已經足夠了)

補充:子類的所有構造方法中,如果未指定父類構造方法,則第一條語句是隐式的super(),即父類的空參數構造方法*/


class Fu  //父類
{
  public static String staticField = "父類-靜态變量";
  public static String extend = "父類-靜态變量extend";  //讓子類調用
  public String field = "父類-普通變量";
  public Fu() 
  {
      System.out.println("父類-構造方法");
  }
  
  static 
  {
      System.out.println("Fu_static: 父類-靜态初始化塊");
      System.out.println("Fu_static:"+staticField);     
  }
  
  {
      System.out.println("Fu_普通塊:"+field);
      System.out.println("Fu_普通塊:"+"父類-初始化塊");
  }
}


class Zi extends Fu  //子類
{
  public static String staticField = "子類 靜态變量";
  
  public String field = "子類 普通變量";

  {
      System.out.println("Zi_普通塊:"+field);
      System.out.println("Zi_普通塊:"+"子類 初始化塊");
  }
  
  public Zi() 
  {
      System.out.println("子類 子類構造方法");
  }
  
  static 
  {
      System.out.println("Zi_static:"+"子類 靜态初始化塊");
      System.out.println("Zi_static:"+staticField);
  }

}


class Demo            
{
  public static void main(String args[])  throws Exception
  {
      System.out.println("main方法");
      //Thread.sleep(2000);
      //System.out.println("Zi.staticField:"+Zi.staticField);
      
      //Thread.sleep(2000);
      //System.out.println("...");
      //Fu fu = new Fu();
      
      Thread.sleep(2000);
      System.out.println("");
      
      Zi zi = new Zi();
      System.out.println("");
      Zi zi2 = new Zi();      
      //System.out.println(Zi.extend);  //子類名調用父類靜态成員
  }
  
}  
           

  執行結果情況太多就不貼了