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

下载需积分: 10 | PDF格式 | 573KB | 更新于2025-01-30 | 28 浏览量 | 9 下载量 举报
收藏
在JAVA面试题解惑系列中,面试者常常会考察关于类的初始化顺序的理解。类的初始化涉及多个元素,包括静态变量、静态初始化块、实例变量、初始化块和构造器。这些元素的初始化顺序遵循一定的规则: 1. **静态变量** - 在类加载时被初始化,不依赖于任何实例的创建。 2. **静态初始化块** - 在类第一次被加载时执行,通常用于共享资源的初始化。 3. **变量(实例变量)** - 没有特定的初始化顺序,但它们会在创建类的第一个对象时被初始化。 4. **初始化块** - 位于类或构造器内部,根据定义位置,可以是类初始化块(static)或实例初始化块。实例初始化块在构造器之前执行,每个实例都会执行。 5. **构造器** - 当创建一个类的新对象时,构造器会被调用,负责设置对象的状态。 当你面对继承的情况时,类的初始化顺序会有所不同。假设有一个父类`Parent`和子类`Child`继承自`Parent`,初始化顺序会按照以下步骤: - 父类的静态变量和静态初始化块(`p_StaticField`和`p_StaticBlock`)会被首先执行。 - 然后,子类会初始化父类的所有静态成员,接着是子类自己的静态变量和静态初始化块。 - 接下来,当创建子类的对象时,会先执行父类的实例初始化块(如果有),然后是子类的实例初始化块。 - 最后,构造器被调用,子类的构造器会先执行父类的构造器,然后再执行子类自身的构造器。 为了验证这一顺序,你可以编写测试代码,例如: ```java class Parent { public static String p_StaticField = "父类--静态变量"; public String p_Field = "父类--变量"; static { System.out.println(p_StaticField); System.out.println("父类静态初始化块"); } { System.out.println(p_Field); System.out.println("父类实例初始化块"); } // 子类继承父类,构造器会先调用父类的构造器 Parent() { System.out.println("父类构造器"); } } class Child extends Parent { public String c_Field = "子类--变量"; static { System.out.println(c_StaticField); // 子类没有静态变量,所以这里不会输出 System.out.println("子类静态初始化块"); } { System.out.println(c_Field); System.out.println("子类实例初始化块"); } public Child() { super(); // 调用父类构造器 System.out.println("子类构造器"); } } public class Main { public static void main(String[] args) { new Child(); } } ``` 运行这段代码,你会看到父类的初始化块、静态变量、父类构造器、父类实例初始化块、子类的静态初始化块、子类实例初始化块以及子类构造器的输出,这展示了继承情况下类初始化的顺序。理解这个顺序对于正确处理类和继承问题至关重要,特别是在面试时遇到相关问题时能够准确解答。

相关推荐

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部