Java 为什么调用静态最终变量时不首先执行静态块
输出:Java 为什么调用静态最终变量时不首先执行静态块,java,Java,输出:10 据我所知,为什么它不打印Hello,如果我们调用静态变量,那么首先加载类,当类将被加载时,它将首先执行静态块,然后发送静态变量。当包含它的类被初始化时,会执行静态初始值设定项块,这通常是类已加载 当您在classTest4中访问Hello.x时,您会说JVM应该加载并初始化classHello。然而,这在这里并没有发生,因为这是一个特例 static final常量由编译器内联-这意味着编译此代码时,main方法中的Hello.x在编译时被常量的值替换,即10。基本上,您的代码编译为
10
据我所知,为什么它不打印
Hello
,如果我们调用静态变量,那么首先加载类,当类将被加载时,它将首先执行静态块,然后发送静态变量。当包含它的类被初始化时,会执行静态初始值设定项块,这通常是类已加载
当您在classTest4
中访问Hello.x
时,您会说JVM应该加载并初始化classHello
。然而,这在这里并没有发生,因为这是一个特例
static final
常量由编译器内联-这意味着编译此代码时,main
方法中的Hello.x
在编译时被常量的值替换,即10
。基本上,您的代码编译为与编译此代码时相同的字节码:
class Test4 {
public static void main(String as[]) {
System.out.println(Hello.x);
}
}
class Hello {
final static int x=10;
static {
System.out.println("Hello");
}
}
请注意,在本例中,类
Test4
实际上并不访问类Hello
,因此在运行Test4
类Test4{public static void main(String[]args){System.out.println(10);//此处内联常量值!}时,不会加载类Hello
,也不会执行静态初始值设定项}class Hello{final static int x;static{x=10;System.out.println(“Hello”);}}a/c到您的概念,在这种情况下,编译器也将用10替换Hello.x,结果将是10。但实际结果是你好10@DEEPAKKUMAR您稍微修改了我的代码,因此我上面描述的内容不再适用。
class Test4 {
public static void main(String[] args) {
System.out.println(10); // Inlined constant value here!
}
}
class Hello {
final static int x = 10;
static {
System.out.println("Hello");
}
}