Java static變數、作用域、建構函式初始化順序

文戲那瞥發表於2019-01-19
/**
 *
 * 
 * @author wxy
 * @date 2018年10月30日 下午1:45:02 
 */
public class StaticTest {

  public static void main(String[] args) {
    SubClazz sub = new SubClazz();

  }
  
}
class SupClazz {
  private static String supStaticStr = "父類-靜態-變數";
  
  private String supNormnalStr = "父類-普通-變數";
  
  static {
    System.out.println(supStaticStr);
    System.out.println("父類-靜態-域");
  }
  
  {
    System.out.println(supNormnalStr);
    System.out.println("父類-普通-域");
  }
  
  public SupClazz() {
    System.out.println("父類-建構函式");
  }
}

class SubClazz extends SupClazz {
  private static String subStaticStr = "子類-靜態-變數";
  
  private String subNormnalStr = "子類-普通-變數";
  
  static {
    System.out.println(subStaticStr);
    System.out.println("子類-靜態-域");
  }
  
  {
    System.out.println(subNormnalStr);
    System.out.println("子類-普通-域");
  }
  
  public SubClazz() {
    System.out.println("子類-建構函式");
  }
}

輸出:

父類-靜態-變數
父類-靜態-域
子類-靜態-變數
子類-靜態-域

父類-普通-變數
父類-普通-域
父類-建構函式

子類-普通-變數
子類-普通-域
子類-建構函式

備註:「靜態變數和靜態作用域」,「常規變數和常規作用域」的先後順序等同於程式碼出現的先後順序。

相關文章