JAVA面试:类初始化顺序解析

需积分: 10 0 下载量 129 浏览量 更新于2024-10-19 收藏 573KB PDF 举报
"JAVA面试题解惑系列,主要探讨了Java语言中类的初始化顺序,特别是在继承场景下的表现。文章作者臧圩人提供了测试代码来验证初始化过程,并通过实例解释了静态变量、静态初始化块、变量、初始化块以及构造器的执行顺序。" 在Java编程中,类的初始化顺序是非常关键的概念,它涉及到程序的正确运行和理解。当一个类被加载时,其初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**:首先执行的是静态成员的初始化,包括静态变量的赋值和静态初始化块中的代码。这是因为静态成员是属于类的,而不是类的实例,所以它们在类的任何实例创建之前就被初始化。 在给定的代码示例中,`staticField` 和对应的静态初始化块先被执行,打印出 "静态变量" 和 "静态初始化块"。 2. **非静态变量与初始化块**:接着是非静态变量(实例变量)的初始化和非静态初始化块的执行。这些部分会在类的实例创建时进行,即在调用构造器之前。 在`InitialOrderTest`类中,`field` 和对应的初始化块在构造器之前执行,打印出 "变量" 和 "初始化块"。 3. **构造器**:最后执行的是构造器,用于初始化类的新实例。这是创建对象时的最后一环,用于设置对象的初始状态。 当调用 `new InitialOrderTest()` 时,构造器被调用并打印出 "构造器"。 在继承场景下,这个顺序会稍微复杂一些,但基本规则保持不变。子类会先初始化父类的部分,然后再初始化自己的部分。具体步骤如下: 1. **父类的静态成员**:首先执行父类的静态变量和静态初始化块。 在给定的父类 `Parent` 示例中,`p_StaticField` 和父类的静态初始化块首先执行,打印出 "父类--静态变量"。 2. **子类的静态成员**:接着是子类的静态变量和静态初始化块。 3. **父类的非静态成员**:然后是父类的实例变量和非静态初始化块,这部分发生在子类实例创建的早期阶段。 4. **子类的非静态成员**:接下来是子类的实例变量和非静态初始化块。 5. **父类的构造器**:紧接着是调用父类的构造器。如果父类有多个构造器,会根据子类构造器中使用的参数来决定调用哪个。 6. **子类的构造器**:最后,执行子类的构造器,完成子类实例的初始化。 了解这些初始化顺序对解决面试题和编写健壮的Java代码至关重要,因为它可以帮助开发者避免意外的初始化问题,确保程序的预期行为。在设计复杂的类结构或处理多层继承时,尤其需要关注这一概念。