Java面试题:继承下类初始化顺序详解
下载需积分: 10 | PDF格式 | 573KB |
更新于2025-01-30
| 4 浏览量 | 举报
在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();
}
}
```
运行这段代码,你会看到父类的初始化块、静态变量、父类构造器、父类实例初始化块、子类的静态初始化块、子类实例初始化块以及子类构造器的输出,这展示了继承情况下类初始化的顺序。理解这个顺序对于正确处理类和继承问题至关重要,特别是在面试时遇到相关问题时能够准确解答。
相关推荐

tracyhuyan
- 粉丝: 0
最新资源
- PROACT预处理与数据清洁流程详解
- Struts1学生信息管理系统功能与用户操作
- C#乐器网站开发教程:代码与数据库框架完整指南
- 掌握ROS编程的完整代码包解析
- ERG小部件:基于位置的化学品泄漏危害评估工具
- 实现鼠标滚轮在图片上放缩的交互效果
- 快速安装dotfiles提升开发环境配置效率
- Activiti框架与SpringMvc+Mybatis的整合实践指南
- Unity Shader MK Glow 4.1.0 发光特效资源包
- Trixie IE扩展插件下载及安装指南
- 全面AE类库及接口使用说明文档
- AJAX无刷新技术初级教程:入门指南
- URL地址重写的实现方法与应用
- React与d3.js结合:实现动态量规车速表
- HTML项目开发:proyecto1深入解析
- Apache ActiveMQ 5.14.5版本二进制包发布