Clinit
一個類要創建實例需要先加載並初始化該類
main方法所在的類需要先加載和初始化
一個子類要初始化需要先初始化父類
一個類初始化就是執行clinit()方法
clinit() 方法由靜態類變量顯示賦值代碼和靜態代碼塊組成
類變量顯示賦值代碼和靜態代碼塊代碼從上到下順序執行
()方法只執行一次
父類靜態常量==》父類靜態代碼塊==》子類靜態常量==》子類靜態代碼塊
init
init()方法可能重載有多個,有幾個構造器就有幾個init方法
init()方法由非靜態實例變量顯示賦值代碼和非靜態代碼塊組成
非靜態實例變量顯示賦值代碼和非靜態代碼塊從上往下順序執行
每次創建實例對象,調用對應構造器,執行的就是對應的init()方法
init 方法的首行是supper() 或者supper(實參列表),即對應父類的init()方法
package com.evan.springboot.study;
/**
* @author evanYang
* @version 1.0
* @date 2020/05/24 21:52
*/
public class Father {
private int i=test();
private static int j=method();
private int test() {
System.out.println("4");
return 1;
}
private static int method() {
System.out.println("5");
return 1;
}
static {
System.out.println("Father Static 1");
}
Father(){
System.out.println("Father Constructor 2");
}
{
System.out.println("代碼塊 3");
}
}
package com.evan.springboot.study;
/**
* @author evanYang
* @version 1.0
* @date 2020/05/24 21:55
*/
public class Son extends Father {
private int i=test();
private static int j=method();
private int test() {
System.out.println("9");
return 1;
}
private static int method() {
System.out.println("10");
return 1;
}
static {
System.out.println("Son Static 6");
}
Son(){
System.out.println("Son Constructor 7");
}
{
System.out.println("代碼塊 8");
}
public static void main(String[] args) {
Son son = new Son();
}
}