Java面试题:类初始化顺序详解

需积分: 10 0 下载量 40 浏览量 更新于2024-07-23 收藏 573KB PDF 举报
在Java面试题中,经常会有关于类初始化顺序的问题,尤其是在考察继承关系时。本文档主要讨论了在类的生命周期中,静态变量、静态初始化块、实例变量、实例初始化块和构造器的初始化顺序,并通过示例代码进行阐述。 首先,我们回顾一下非继承情况下的初始化顺序: 1. 静态变量(Static Field):在整个类加载时被初始化。 2. 静态初始化块(Static Initializer Block):在静态变量初始化前执行,只执行一次。 3. 变量(Instance Field):在对象创建时,即构造器执行时初始化。 4. 实例初始化块(Instance Initializer Block):位于变量声明之前,但只在构造器调用时执行。 5. 构造器(Constructor):对象创建时,按照构造器定义的顺序执行。 当涉及到继承时,子类的初始化过程与父类有关。在Java中,子类会先执行自己的静态成员初始化,然后执行父类的静态成员初始化,接着是子类自身的实例变量和初始化块。最后,才会调用子类的构造器。 以下是针对继承关系的测试代码示例: ```java class Parent { // 父类静态变量 public static String p_StaticField = "父类--静态变量"; // 父类变量 public String p_Field = "父类--变量"; // 父类静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类静态初始化块"); } } class Child extends Parent { // 子类静态变量 public static String c_StaticField = "子类--静态变量"; // 子类变量 public String c_Field = "子类--变量"; // 子类初始化块 { System.out.println(c_Field); System.out.println("子类初始化块"); } // 子类构造器 public Child() { System.out.println("子类构造器"); } } public class Main { public static void main(String[] args) { new Child(); // 创建子类对象 } } ``` 当你运行这段代码,预期的输出结果将会是: 1. 父类--静态变量 2. 父类静态初始化块 3. 子类--静态变量 4. 子类变量 5. 子类初始化块 6. 子类构造器 总结来说,理解Java中类和对象的初始化顺序对于解决面试中的这类问题至关重要。记住,当继承时,子类会先执行自己的静态部分,然后才是父类的,接着是子类的实例成员,最后执行构造器。通过实际编写和测试代码,能够更好地掌握这个知识点并应用于面试场景。