如果一个类中有 static 代码段、static 方法、static 数据成员,还有对非 static 数据进行初始化的构造方法,那么这些初始化的顺序是怎样的?编写一段代码验证你的结论。
时间: 2024-11-24 19:40:07 浏览: 14
在Java中,当涉及到静态(static)元素和非静态(non-static)元素时,它们的初始化顺序如下:
1. **静态数据成员**(static final变量或静态字段):首先被初始化,无论是否在类的实例化之前还是之后。
2. **静态代码块**(static initialization block):紧接着静态数据成员后执行。静态代码块只执行一次,即使类有多个实例。
3. **静态方法**:静态方法可以在静态代码块之后立即执行,但不会影响到非静态成员的初始化。
4. **构造方法**:然后是非静态构造方法的执行。如果类有无参构造方法,它会在静态元素都完成后被调用。如果有参数的构造方法,它的执行可能晚于静态元素。
5. **非静态数据成员**(实例变量):最后,实例变量在各自的构造方法中初始化。每个新创建的类实例都会独立地执行这个步骤。
以下是一个简单的示例代码来验证上述顺序:
```java
public class StaticInitializationExample {
// 静态数据成员
static int staticVar = 0;
// 静态代码块
static {
System.out.println("Static code block executed.");
}
// 静态方法
public static void printStaticMethod() {
System.out.println("Static method executed.");
}
// 构造方法
public StaticInitializationExample(int nonStaticVar) {
// 实例变量
this.nonStaticVar = nonStaticVar;
System.out.println("Constructor executed with " + nonStaticVar);
}
// 实例方法
public void printNonStaticMethod() {
System.out.println("Instance method executed.");
}
public static void main(String[] args) {
StaticInitializationExample obj1 = new StaticInitializationExample(10);
StaticInitializationExample obj2 = new StaticInitializationExample(20);
}
}
```
当你运行这段代码,你会看到输出按照初始化顺序:
1. "Static code block executed."
2. "Static method executed."
3. 对于两个`StaticInitializationExample`实例,分别执行构造方法中的"Constructor executed with 10" 和 "Constructor executed with 20"。
4. "Instance method executed."(这取决于何时实际调用`printNonStaticMethod()`)
阅读全文