java静态代码块什么时候执行
在Java中,静态代码块是在类被加载时执行的一段代码。它与类的实例化过程无关,而是与类的加载过程相关联。当类被加载到Java虚拟机中时,静态代码块将被执行一次。
具体来说,静态代码块的执行时机有两个主要情况:
类加载时执行: 当Java虚拟机第一次加载类时,会执行静态代码块。这发生在创建类的实例对象。调用类的静态方法。访问类的静态字段。
仅执行一次: 静态代码块只会在类加载时执行一次。即使有多个实例对象被创建,静态代码块也只在类加载时执行一次。
javapublic class MyClass {
// 静态代码块
static {
System.out.println("Static block is executed.");
}
// 其他类成员和方法
// ...
public static void main(String[] args) {
// 创建类的实例,调用静态方法,或访问静态字段时,静态代码块将被执行
MyClass obj = new MyClass();
MyClass.staticMethod();
System.out.println(MyClass.staticField);
}
// 静态方法
public static void staticMethod() {
// 静态方法体
}
// 静态字段
public static int staticField = 10;
}
在上述示例中,当类MyClass第一次加载时,静态代码块将执行并输出"Static block is executed."。
javapublic class Main {
public static void main(String[] args) {
// 创建两个实例对象
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
// 访问静态字段
System.out.println("Static field value from obj1: " + obj1.staticField);
System.out.println("Static field value from obj2: " + obj2.staticField);
}
}
在这个Main类中,我们创建了两个MyClass的实例对象obj1和obj2。然而,由于静态代码块只在类加载时执行一次,两个对象的静态字段staticField的值是相同的,因为它们共享相同的类级别的静态变量。
当运行Main类时,输出可能类似于
vbnetStatic block is executed.
Static block is executed.
Static field value from obj1: 10
Static field value from obj2: 10
可以看到,虽然创建了两个实例对象,但静态代码块只执行了一次,静态字段的值也是共享的。这强调了静态代码块在类加载时执行一次的特性。