mat*_*eus 12 java static jvm final
我们的应用程序使用初始化代码,这取决于执行静态代码的顺序,我想知道这个顺序是否在所有JVM中都是一致的.
这是我的意思的样本:
public class Main {
static String staticVar = "init_value";
public static void main(String[] args) {
System.out.println(A.staticVar);
staticVar = "mainValue";
System.out.println(A.staticVar);
}
}
public class A {
static String staticVar = Main.staticVar;
}
Run Code Online (Sandbox Code Playgroud)
会给:
init_value init_value
和
public class Main {
static String staticVar = "init_value";
public static void main(String[] args) {
// System.out.println(A.staticVar);
staticVar = "mainValue";
System.out.println(A.staticVar);
}
}
public class A {
static String staticVar = Main.staticVar;
}
Run Code Online (Sandbox Code Playgroud)
会给(在我的环境):
mainValue
总而言之,在所有JVM中,当我们第一次使用类时,是否总是执行静态代码?
Jon*_*eet 18
编辑:尽管下面有所有的保证,如果你正在考虑依赖这种事情,我会努力重构你的代码,以便它不会出现.虽然它可以保证工作,但它也可能使您的代码非常脆弱.静态初始化程序被称为"不可见"的事实使得它们相对难以推理和调试.
是的,这是由语言规范保证的.从规范的第8.7节:
在类初始化时执行在类中声明的任何静态初始化程序,并且与类变量的任何字段初始值设定项(第8.3.2节)一起,可以用于初始化类的类变量(第12.4节).
StaticInitializer:
static阻止静态初始化程序能够通过检查异常(第11.2节)突然完成(第14.1节,第15.6节)是编译时错误.如果静态初始化程序无法正常完成,则为编译时错误(第14.21节).
静态初始值设定项和类变量初始值设定项以文本顺序执行.
从第12.4节开始:
类的初始化包括执行其静态初始化程序和类中声明的静态字段的初始化程序.接口的初始化包括为接口中声明的字段执行初始值设定项.
在初始化类之前,必须初始化其直接超类,但不需要初始化类实现的接口.同样,在初始化接口之前,不需要初始化接口的超接口.
类或接口类型T将在第一次出现以下任何一个之前立即初始化:
- T是一个类,并且创建了T的实例.
- T是一个类,并且调用由T声明的静态方法.
- 分配由T声明的静态字段.
- 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
- T是顶级类,并且是词法嵌套的断言语句(第14.10节)
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |