总结类初始化时的代码执行顺序
代码块
在Java中,使用{}括起来的代码被称为代码块。
分类
根据其位置和声明的不同,可以分为:
- 局部代码块:局部位置,用于限定变量的生命周期。
- 构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。
- 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。作用:一般是对类进行初始化。
上结论
- 单个类中初始化过程:
- 初始化静态成员变量和静态代码块(按次序)
- 执行main方法
- 初始化普通成员变量和构造代码块(按次序)
- 执行构造方法
注意
静态代码块:只执行一次
构造代码块:在每一次创建对象时执行
- 涉及父类和子类的初始化过程:
- 初始化父类中的静态成员变量和静态代码块(按次序)
- 初始化子类中的静态成员变量和静态代码块(按次序)
- 执行子类main方法
- 初始化父类的普通成员变量和构造代码块(按次序)
- 执行父类的构造方法(注意父类构造方法中的子类方法覆盖)
- 初始化子类的普通成员变量和构造代码块(按次序)
- 执行子类的构造方法
上代码
class Test {
static {
System.out.println("Test 静态代码块");
}
{
System.out.println("Test 构造代码块");
}
public Test() {
System.out.println("Test 构造方法");
}
}
public class TestDemo {
static {
System.out.println("TestDemo 静态代码块");
}
{
System.out.println("TestDemo 构造代码块");
}
public static void main(String[] args) {
System.out.println("TestDemo main方法");
Test t1 = new Test();
Test t2 = new Test();
}
}
其运行结果是:
TestDemo 静态代码块
TestDemo main方法
Test 静态代码块
Test 构造代码块
Test 构造方法
Test 构造代码块
Test 构造方法
public class Test extends MyClass {
static {
System.out.println("Test 静态代码块");
}
Person person = new Person("Test");
{
System.out.println("Test 构造代码块");
}
public Test() {
System.out.println("Test 构造方法");
}
public static void main(String[] args) {
System.out.println("Test main方法");
new Test();
}
}
class Person {
static {
System.out.println("Person 静态代码块");
}
{
System.out.println("Person 构造代码块");
}
public Person(String str) {
System.out.println("Person 构造方法,参数是" + str);
}
}
class MyClass {
static Person person = new Person("MyClass");
static {
System.out.println("MyClass 静态代码块");
}
{
System.out.println("MyClass 构造代码块");
}
public MyClass() {
System.out.println("MyClass 构造方法");
}
}
其运行结果是:
Person 静态代码块
Person 构造代码块
Person 构造方法,参数是MyClass
MyClass 静态代码块
Test 静态代码块
Test main方法
MyClass 构造代码块
MyClass 构造方法
Test 构造代码块
Person 构造代码块
Person 构造方法,参数是Test
Test 构造方法
© 版权声明
文章版权归作者所有,欢迎转载,但必须给出原文链接,否则保留追究法律责任的权利
THE END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2017-12-20 Linux服务器上安装JDK小白教程
2017-12-20 request和response中文乱码问题后台处理办法