我有以下场景 包 com.example.test;
public class StaticTest {
public static final String STATIC_VAR="Static Var";
static{
System.out.println("Static Block Called....");
}
public static void init(){}
}
package com.example.test;
public class MainClass {
public static void main(String[] args) {
System.out.println("Test static initialization");
String staticvar =StaticTest.STATIC_VAR;
System.out.println("Referred static variable--> "+ staticvar);
System.out.println("Calling static method");
StaticTest.init();
System.out.println("Static method invoked");
}
}
我得到的输出是
Test static initialization
Referred static variable--> Static Var
Calling static method
**Static Block Called....**
Static method invoked
我期待的输出是
Test static initialization
**Static Block Called....**
Referred static variable--> Static Var
Calling static method
Static method invoked
我在想,只要我引用静态变量,静态 block 就会被执行。
有什么解释吗?
最佳答案
因为变量是public static final
,所以它被编译器内联了。
所有对它的引用都被替换为实际值,因为它不能改变,这被称为编译时间常量。
您的代码实际上被编译为:
System.out.println("Test static initialization");
String staticvar = "Static Var";
如果将值赋给方法的返回值——
public static final String STATIC_VAR=getStaticVar();
private static String getStaticVar() {
return "Static Var";
}
你会得到你期望的结果。
有一个good SO answer解释内联和 JLS 对编译时间常量的保证。
关于java - 执行顺序,静态 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15965883/