Java面试:类初始化顺序深度解析
需积分: 0 121 浏览量
更新于2024-09-23
收藏 573KB PDF 举报
"JAVA面试题解惑系列,主要讨论了类的初始化顺序,包括静态变量、静态初始化块、变量、初始化块和构造器的初始化顺序,并通过实例代码进行验证。"
在Java编程中,类的初始化顺序是一个关键知识点,特别是在面试场景中,它常被用来考察候选者对面向对象概念的理解。初始化顺序的规则如下:
1. **静态变量与静态初始化块**:首先执行的是类的静态成员,包括静态变量的初始化和静态初始化块中的代码。这些部分在类加载时执行,且只执行一次,不论创建多少个类的对象。
2. **非静态变量与初始化块**:接着是实例变量(非静态变量)的初始化和实例初始化块中的代码。这些会在创建类的实例时执行。当创建一个新对象时,会先分配内存空间,然后按照声明顺序初始化实例变量,紧接着执行初始化块。
3. **构造器**:最后是构造器,用于初始化对象的具体状态。构造器可以调用超类的构造器,然后执行自身的构造逻辑。
以下是一个简单的示例,展示了上述规则:
```java
public class InitialOrderTest {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public InitialOrderTest() {
System.out.println("构造器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
```
运行这段代码,你会看到输出顺序与上述规则一致:
1. 静态变量
2. 静态初始化块
3. 变量
4. 初始化块
5. 构造器
在继承的情况下,初始化顺序略有不同。首先,仍然会执行父类的静态成员(静态变量和静态初始化块),然后才进行子类的静态成员初始化。对于实例部分,当创建子类对象时,会先调用父类的构造器(默认调用无参构造器,如果父类没有无参构造器,则必须显式调用其他构造器),接着执行子类的实例变量初始化和初始化块,最后是子类的构造器。
例如:
```java
class Parent {
// 父类静态变量
public static String p_StaticField = "父类--静态变量";
// 父类变量
public String p_Field = "父类--变量";
// 父类静态初始化块
static {
System.out.println(p_StaticField);
}
// 父类构造器
public Parent() {
System.out.println("父类构造器");
}
}
class Child extends Parent {
// 子类静态变量
public static String c_StaticField = "子类--静态变量";
// 子类变量
public String c_Field = "子类--变量";
// 子类静态初始化块
static {
System.out.println(c_StaticField);
}
// 子类初始化块
{
System.out.println(c_Field);
System.out.println("子类初始化块");
}
// 子类构造器
public Child() {
System.out.println("子类构造器");
}
public static void main(String[] args) {
new Child();
}
}
```
在这个例子中,父类的静态成员和静态初始化块首先执行,然后是子类的静态成员和静态初始化块。创建子类对象时,先调用父类的构造器,接着执行子类的实例变量初始化、初始化块,最后是子类的构造器。
理解这些初始化顺序对于编写和调试Java代码至关重要,尤其是在处理复杂的继承结构和多线程环境时。在面试中,掌握这个知识点能够展示你对Java内存管理和对象生命周期的理解,有助于提升你的专业形象。
2019-08-14 上传
2021-10-01 上传
2023-03-04 上传
2021-03-06 上传
2023-06-15 上传
2020-04-11 上传
2021-04-29 上传
2012-01-14 上传
xlh37772
- 粉丝: 6
- 资源: 23
最新资源
- BottleJS快速入门:演示JavaScript依赖注入优势
- vConsole插件使用教程:输出与复制日志文件
- Node.js v12.7.0版本发布 - 适合高性能Web服务器与网络应用
- Android中实现图片的双指和双击缩放功能
- Anum Pinki英语至乌尔都语开源词典:23000词汇会话
- 三菱电机SLIMDIP智能功率模块在变频洗衣机的应用分析
- 用JavaScript实现的剪刀石头布游戏指南
- Node.js v12.22.1版发布 - 跨平台JavaScript环境新选择
- Infix修复发布:探索新的中缀处理方式
- 罕见疾病酶替代疗法药物非临床研究指导原则报告
- Node.js v10.20.0 版本发布,性能卓越的服务器端JavaScript
- hap-java-client:Java实现的HAP客户端库解析
- Shreyas Satish的GitHub博客自动化静态站点技术解析
- vtomole个人博客网站建设与维护经验分享
- MEAN.JS全栈解决方案:打造MongoDB、Express、AngularJS和Node.js应用
- 东南大学网络空间安全学院复试代码解析