java静态代码块什么时候执行

在Java中,静态代码块是在类被加载时执行的一段代码。它与类的实例化过程无关,而是与类的加载过程相关联。当类被加载到Java虚拟机中时,静态代码块将被执行一次。

具体来说,静态代码块的执行时机有两个主要情况:

类加载时执行: 当Java虚拟机第一次加载类时,会执行静态代码块。这发生在创建类的实例对象。调用类的静态方法。访问类的静态字段。

仅执行一次: 静态代码块只会在类加载时执行一次。即使有多个实例对象被创建,静态代码块也只在类加载时执行一次。

java
public 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."。

java
public 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的实例对象obj1obj2。然而,由于静态代码块只在类加载时执行一次,两个对象的静态字段staticField的值是相同的,因为它们共享相同的类级别的静态变量。

当运行Main类时,输出可能类似于

vbnet
Static block is executed. Static block is executed. Static field value from obj1: 10 Static field value from obj2: 10

可以看到,虽然创建了两个实例对象,但静态代码块只执行了一次,静态字段的值也是共享的。这强调了静态代码块在类加载时执行一次的特性。