Java面试题详解:类初始化顺序及继承情况
需积分: 10 97 浏览量
更新于2024-12-27
收藏 573KB PDF 举报
"JAVA面试题解惑系列"是一本由臧圩人编写的Java面试指南,针对Java面试中常出现的问题进行深入解析。本书关注的一个重要知识点是类的初始化顺序,特别是在继承关系中的情况。在Java中,类的初始化遵循特定顺序,主要包括静态变量、静态初始化块、实例变量、实例初始化块和构造器。
首先,静态成员(静态变量和静态初始化块)的初始化发生在类加载时,不依赖于任何对象的创建。在"InitialOrderTest"示例中,静态变量和静态初始化块的输出顺序为1和2。
接下来是实例变量和初始化块,这些是在对象创建时发生的。在"InitialOrderTest"中,变量和初始化块的输出顺序为3和4。值得注意的是,即使构造器在类的声明末尾,它会在实例化对象时执行,因此它的输出是最后一个,即5。
然而,当涉及到继承时,子类的初始化顺序与父类有所不同。子类会先执行自己的静态部分,然后是父类的静态部分,接着是子类的实例变量和初始化块,最后是父类的实例变量和初始化块(如果有的话),再执行子类的构造器。这被称为“初始化顺序穿透”(Initialization Hierarchy)。下面的测试代码展示了这个过程:
```java
class Parent {
// 子类会先执行这部分
public static String p_StaticField = "父类--静态变量";
// 然后是父类的静态初始化块
static {
System.out.println(p_StaticField);
}
// 接下来是子类的实例变量和初始化块
public String p_Field = "父类--变量";
{
System.out.println(p_Field);
}
}
class Child extends Parent {
// 子类有自己的静态变量和初始化块
public static String c_StaticField = "子类--静态变量";
static {
System.out.println(c_StaticField);
}
public String c_Field = "子类--变量";
{
System.out.println(c_Field);
}
// 子类的构造器
public Child() {
System.out.println("子类构造器");
}
}
public class Main {
public static void main(String[] args) {
new Child(); // 创建Child对象时,初始化顺序开始
}
}
```
运行这段代码,输出结果将反映出子类的初始化顺序,包括父类的静态和实例初始化,以及子类自身的相关部分。理解并掌握这个概念对于面试者来说至关重要,因为它能帮助他们正确处理复杂的类结构和初始化逻辑。
2013-01-05 上传
2012-11-25 上传
2018-01-05 上传
2010-11-02 上传
2024-12-27 上传
2024-12-27 上传
2024-12-27 上传
2024-12-27 上传
晴天v1
- 粉丝: 28
- 资源: 52
最新资源
- 参考资料-基于ptr2000无线model的单片机之间无线通信的实现.zip
- 3WebDB-开源
- Unity脚本:基本的Unity游戏脚本
- fera:算法,数据结构和支持板条箱的集合
- C++编程100例源代码.rar
- RankTop.lunre7nhzg.gai4OMq
- mongodb-easy-backup:轻松将MongoDB Atlas数据库备份到您的计算机
- ywcket.rar_Windows编程_C#_
- e-commerce-organico
- kdtree:具有文件系统二进制索引PHP KD Tree实现
- scrcpy相关.7z
- GameLauncher解决方案
- CostOne.du8wx5uggr.gasmdxj
- AndroidListViewWithFixedRows:自定义Android ListView,您可以在其中设置要显示的最大行数
- Learn Japanese through Anime-crx插件
- 为Prometheus.io导出Django监控指标-Python开发