Java面试题详解:类初始化顺序及继承情况

需积分: 10 3 下载量 97 浏览量 更新于2024-12-27 收藏 573KB PDF 举报
"JAVA面试题解惑系列"是一本由臧圩人编写的Java面试指南,针对Java面试中常出现的问题进行深入解析。本书关注的一个重要知识点是类的初始化顺序,特别是在继承关系中的情况。在Java中,类的初始化遵循特定顺序,主要包括静态变量、静态初始化块、实例变量、实例初始化块和构造器。 首先,静态成员(静态变量和静态初始化块)的初始化发生在类加载时,不依赖于任何对象的创建。在"InitialOrderTest"示例中,静态变量和静态初始化块的输出顺序为1和2。 接下来是实例变量和初始化块,这些是在对象创建时发生的。在"InitialOrderTest"中,变量和初始化块的输出顺序为3和4。值得注意的是,即使构造器在类的声明末尾,它会在实例化对象时执行,因此它的输出是最后一个,即5。 然而,当涉及到继承时,子类的初始化顺序与父类有所不同。子类会先执行自己的静态部分,然后是父类的静态部分,接着是子类的实例变量和初始化块,最后是父类的实例变量和初始化块(如果有的话),再执行子类的构造器。这被称为“初始化顺序穿透”(Initialization Hierarchy)。下面的测试代码展示了这个过程: ```java class Parent { // 子类会先执行这部分 public static String p_StaticField = "父类--静态变量"; // 然后是父类的静态初始化块 static { System.out.println(p_StaticField); } // 接下来是子类的实例变量和初始化块 public String p_Field = "父类--变量"; { System.out.println(p_Field); } } class Child extends Parent { // 子类有自己的静态变量和初始化块 public static String c_StaticField = "子类--静态变量"; static { System.out.println(c_StaticField); } public String c_Field = "子类--变量"; { System.out.println(c_Field); } // 子类的构造器 public Child() { System.out.println("子类构造器"); } } public class Main { public static void main(String[] args) { new Child(); // 创建Child对象时,初始化顺序开始 } } ``` 运行这段代码,输出结果将反映出子类的初始化顺序,包括父类的静态和实例初始化,以及子类自身的相关部分。理解并掌握这个概念对于面试者来说至关重要,因为它能帮助他们正确处理复杂的类结构和初始化逻辑。