Java对象的初始化顺序?

2023-06-03 0 532

看那个范例就确切了。提过珍藏出来,忘掉了能拿出看一看。

范例里一共试验了动态标识符块,一般标识符块,动态核心成员表达式,一般核心成员 表达式,内部结构器。依次在基类和基类里各有一套。

范例里每部份结尾的位数,由大到小代表者前述继续执行次序。

/** * 控制台列印 */ 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步。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务