看那个范例就确切了。提过珍藏出来,忘掉了能拿出看一看。
范例里一共试验了动态标识符块,一般标识符块,动态核心成员表达式,一般核心成员 表达式,内部结构器。依次在基类和基类里各有一套。
范例里每部份结尾的位数,由大到小代表者前述继续执行次序。
/**
* 控制台列印
*/
class Log{
public static String baseFieldInit(){System.out.println(“Base Normal Field”);return “”;}
public static String baseStaticFieldInit(){System.out.println(“Base Static Field”);return “”;}
public static String fieldInit(){System.out.println(“Normal Field”);return “”;}
public static String staticFieldInit(){System.out.println(“Static Field”);return “”;}
}
/**
* 基类
*/
class Base {
/*1*/ static {System.out.println(“Base Static Block 1”);}
/*1*/ private static String staticValue=Log.baseStaticFieldInit();
/*1*/ static {System.out.println(“Base Static Block 2”);}
/*3*/ {System.out.println(“Base Normal Block 1”);}
/*3*/ private String value=Log.baseFieldInit();
/*3*/ {System.out.println(“Base Normal Block 2”);}
/*4*/ Base(){System.out.println(“Base Constructor”);}
}
/**
* 基类
*/
public class Derived extends Base{
/*2*/ static {System.out.println(“Static Block 1”);}
/*2*/ private static String staticValue=Log.staticFieldInit();
/*2*/ static {System.out.println(“Static Block 2”);}
/*5*/ {System.out.println(“Normal Block 1”);}
/*5*/ private String value=Log.fieldInit();
/*5*/ {System.out.println(“Normal Block 2”);}
/*6*/ Derived(){System.out.println(“Derived Constructor”);}
/**
* MAIN 主线程
*/
public static void main(String[] args){
Derived d=new Derived();
}
}
实验输出结果:
Base Static Block 1
Base Static Field
Base Static Block 2
Static Block 1Static Field
Static Block2
Base Normal Block 1Base Normal Field
Base Normal Block2
Base Constructor
Normal Block 1
Normal Field
Normal Block 2Derived Constructor
结果证明:
第一类在class文件加载完毕,以及为各核心成员在方法区开辟好内存空间之后,就开始所谓“调用”的步骤:
1. 基类动态标识符块,基类动态核心成员字段 (并列优先级,按标识符中出现先后次序继续执行)(只有第一次加载类时继续执行)
2. 基类动态标识符块,基类动态核心成员字段 (并列优先级,按标识符中出现先后次序继续执行)(只有第一次加载类时继续执行)
3. 基类一般标识符块,基类一般核心成员字段 (并列优先级,按标识符中出现先后次序继续执行)
4. 基类内部结构函数
5. 基类一般标识符块,基类一般核心成员字段 (并列优先级,按标识符中出现先后次序继续执行)
6. 基类内部结构函数
注意,第1,2步的动态过程,只在那个类第一次被加载的时候才运行。如果创建两个第一类,
Derived d1=new Derived();
Derived d2=new Derived();
第二次创建d2就只继续执行3,4,5,6步。