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







13 浏览量


tracyhuyan
- 粉丝: 0
最新资源
- MFC中利用settimer函数实现定时器功能
- Android手机订餐系统:便捷的移动点餐体验
- 易语言开发的水果营销系统源码解析
- 轻松在线安装.NET Framework 4.6.2正式版教程
- 掌握Create React App: Docker技术实践入门指南
- 精通SEO:揭秘网站推广的有效技巧
- 518超市播音软件v5.3:商场广播系统新体验
- 用C语言实现火车售票系统的开发与管理
- NXP LPC55S6x Cortex-M33处理器综合技术文档解析
- 实现程序子窗体控制的方法与技术
- 2011年1月信息安全动态汇总及专家访谈
- Laravel框架深度讲解与学习资源
- 全面解读Windows服务程序的实例操作
- Linux C++ Webserver:实现tcpserver、tcpclient及epoll模式
- Android activity跳转过渡动画效果详解
- Elixir中的Parser组合器:parsex工具介绍