1:为什么编译错误?
在 Java 中,当一个类定义了有参构造方法后,系统不会再自动生成无参构造方法。
在代码中, Foo 类定义了构造方法 public Foo(int initValue) (有参构造),而在 main 方法中创建 Foo 对象时使用的是 new Foo() (无参构造的调用方式),此时系统找不到对应的无参构造方法,因此无法通过编译。
- 方法一:在 Foo 类中显式添加无参构造方法
class Foo{
int value;
public Foo() { // 显式添加无参构造
value = 0;
}
public Foo(int initValue) {
value = initValue;
}
}
- 方法二:创建对象时传入构造方法所需的参数
Foo obj1 = new Foo(10); // 传入int类型参数,调用有参构造
2:观察输出结果
public class TestStaticInitializeBlock {
// 静态变量1
static int a;
// 静态初始化块1
static {
System.out.println("静态初始化块1 执行");
a = 10;
}
// 静态变量2(带初始化赋值)
static int b = 20;
// 静态初始化块2
static {
System.out.println("静态初始化块2 执行");
System.out.println("a = " + a + ", b = " + b);
}
public static void main(String[] args) {System.out.println("main方法执行");
}
}
结果:静态初始化块1 执行
静态初始化块2 执行
a = 10, b = 20
main方法执行
理论总结:静态初始化块的执行顺序
1. 执行时机:静态初始化块在类加载阶段执行,且只执行一次(无论创建多少个该类的对象,静态初始化块都只执行一次)。
2. 内部顺序:在同一个类中,静态初始化块和静态变量的初始化按照代码出现的先后顺序执行。
- 如上述代码中,“静态初始化块1”在“静态变量b”之前,所以先执行“静态初始化块1”,再执行“静态变量b”的初始化,最后执行“静态初始化块2”。
3. 与main方法的关系:静态初始化块的执行早于 main 方法。类加载时先完成所有静态相关的初始化(静态变量、静态初始化块),然后才会执行 main 方法