Java中变量,代码块,构造器之间执行顺序是怎么样的?
在 Java 中,类的初始化和实例化是有一定顺序的。总结如下:
1. **父类的静态成员变量**(如果是第一次加载类)
2. **父类的静态代码块**(如果是第一次加载类)
3. **子类的静态成员变量**(如果是第一次加载类)
4. **子类的静态代码块**(如果是第一次加载类)
5. **父类的普通成员变量**
6. **父类的动态代码块**
7. **父类的构造器方法**
8. **子类的普通成员变量**
9. **子类的动态代码块**
10. **子类的构造器方法**
这个顺序可以通过以下代码和输出结果进行验证:
```java
public class Base {
static Instance staticInstance = new Instance("1---Base类的静态成员变量staticInstance");
static {
System.out.println("2---Base类的静态代码块执行了");
}
Instance instance = new Instance("5---Base类的普通成员变量instance");
{
System.out.println("6---Base类的动态代码块执行了");
}
Base() {
System.out.println("7---Base类的构造器方法执行了");
}
}
public class Child extends Base {
static Instance staticInstance = new Instance("3---Child类的静态成员变量staticInstance");
static {
System.out.println("4---Child类的静态代码块执行了");
}
Instance instance = new Instance("8---Child类的普通成员变量instance");
{
System.out.println("9---Child类的动态代码块执行了");
}
Child() {
System.out.println("10---Child类的构造器方法执行了");
}
public static void main(String[] args) {
Child child = new Child();
}
}
```
运行此代码的输出结果如下:
```java
1---Base类的静态成员变量staticInstance进行了初始化
2---Base类的静态代码块执行了
3---Child类的静态成员变量staticInstance进行了初始化
4---Child类的静态代码块执行了
5---Base类的普通成员变量instance进行了初始化
6---Base类的动态代码块执行了
7---Base类的构造器方法执行了
8---Child类的普通成员变量instance进行了初始化
9---Child类的动态代码块执行了
10---Child类的构造器方法执行了
```
通过这个输出结果,可以看到各个部分的初始化顺序如下所示:
1. **Base 类的静态成员变量初始化**
2. **Base 类的静态代码块执行**
3. **Child 类的静态成员变量初始化**
4. **Child 类的静态代码块执行**
5. **Base 类的普通成员变量初始化**
6. **Base 类的动态代码块执行**
7. **Base 类的构造器方法执行**
8. **Child 类的普通成员变量初始化**
9. **Child 类的动态代码块执行**
10. **Child 类的构造器方法执行**
公众号进入网站体验更佳

