Java 类和静态块

2022-09-01 13:42:20
class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

在运行上面的代码时,输出为100,因为当我调用Hello类时,首先执行静态块,将b的值设置为100并显示它。但是当我写这段代码时:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

此处的输出为 10。我期望答案为100,因为一旦执行静态块,它就会给b的值为100。所以在main()中,我调用Hello.b时,它应该引用b(=100)。如何在两个代码中将内存分配给 b?


答案 1

在类的“详细初始化过程”中,JLS 的第 12.4.2 节指出:

接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。

这意味着第一个例子是:

b = 10;
b = 100;

第二个例子是:

b = 100;
b = 10;

最后一个分配“获胜”,解释您的输出。


答案 2

静态块和静态变量按它们在源代码中出现的顺序进行初始化。如果您的代码是:

class Hello12 {

  static int b = 10;
  static {
     b = 100;
  }

}

结果为 100。


推荐