Java面试题:继承下类初始化顺序详解
下载需积分: 10 | PDF格式 | 573KB |
更新于2025-01-30
| 28 浏览量 | 举报
在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
最新资源
- 江西理工通用毕业论文答辩PPT模板赏析
- 模拟实现androidpn-client的基本通信功能
- Spring3.0.5完整源码及库文件包
- 提升数据库操作技巧:SQL Server 2008实战实践指南
- SSM框架整合与数据库操作教程代码包
- 构建电影信息Web应用服务器端组件
- MacOS下Oracle数据库连接解决方案:instantclient-basic-macos.zip安装指南
- 掌握VC++多窗口多视图编程技巧
- 实现中文拼音首字母排序的jQuery插件技术解析
- 基于JAVA JSP技术的在线个人书签收藏夹实现
- SSD-Z V15.03.22汉化版:固态硬盘检测及健康监控工具
- 西门子1200PLC与组态王6.55通讯实战教程
- Greedygoblin:POD战利品过滤器深度评测
- 摄像头物体颜色识别与边缘处理算法应用
- EGIT 1.3.0.201202151440-r版本安装指南
- LCD1602液晶显示屏的中文资料教程