人工智能AI面试题-1.3 Java类初始化顺序
1.3 Java类初始化顺序 让我们以🎉🕺的方式揭示Java类的初始化顺序吧!先说结论:基类的静态代码块和静态成员字段,它们是🚀一起起飞的,谁在代码中出现得早,谁先执行。而且,只在第一次加载时执行哦!接下来是派生类的静态代码块和静态成员字段,同样也是🚀一组组合,谁在代码中先现身,谁先出场,也只有第一次加载时亮相。 接下来,我们有基类的普通代码块和普通成员字段,同样是一起来🚗驰骋,按照代码中的排队顺序执行。然后是基类的构造函数,它是整个初始化队伍的🌟明星,最后上场。然后,派生类的普通代码块和普通成员字段也是🚗一起加入比赛,按照代码中的排队顺序执行,最后是派生类的构造函数,它们是这场初始化盛宴的🍰甜点。 接下来,我们用代码👨💻来验证一下这个顺序: ```java class Log { public static String initLog(String log) { System.out.println(log); return null; } } class Base { static { System.out.println("Base Static Block 1"); } private static String staticValue = Log.initLog("Base Static Fields"); static { System.out.println("Base Static Block 2"); } { System.out.println("Base Normal Block 1"); } private String value = Log.initLog("Base Normal Field"); { System.out.println("Base Normal Block 2"); } Base() { System.out.println("Base Constructor"); } } public class Derived extends Base { static { System.out.println("Static Block 1"); } private static String staticValue = Log.initLog("Static Fields"); static { System.out.println("Static Block 2"); } { System.out.println("Normal Block 1"); } private String value = Log.initLog("Normal Field"); { System.out.println("Normal Block 2"); } Derived() { System.out.println("Derived Constructor"); } } public static void main(String[] args) { Derived derived = new Derived(); } ``` 控制台结果输出如下,彩排完毕📢: ``` Base Static Block 1 Base Static Fields Base Static Block 2 Static Block 1 Static Fields Static Block 2 Base Normal Block 1 Base Normal Field Base Normal Block 2 Base Constructor Normal Block 1 Normal Field Normal Block 2 Derived Constructor ```