Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么调用静态最终变量时不首先执行静态块_Java - Fatal编程技术网

Java 为什么调用静态最终变量时不首先执行静态块

Java 为什么调用静态最终变量时不首先执行静态块,java,Java,输出:10 据我所知,为什么它不打印Hello,如果我们调用静态变量,那么首先加载类,当类将被加载时,它将首先执行静态块,然后发送静态变量。当包含它的类被初始化时,会执行静态初始值设定项块,这通常是类已加载 当您在classTest4中访问Hello.x时,您会说JVM应该加载并初始化classHello。然而,这在这里并没有发生,因为这是一个特例 static final常量由编译器内联-这意味着编译此代码时,main方法中的Hello.x在编译时被常量的值替换,即10。基本上,您的代码编译为

输出:
10


据我所知,为什么它不打印
Hello
,如果我们调用静态变量,那么首先加载类,当类将被加载时,它将首先执行静态块,然后发送静态变量。

当包含它的类被初始化时,会执行静态初始值设定项块,这通常是类已加载

当您在class
Test4
中访问
Hello.x
时,您会说JVM应该加载并初始化class
Hello
。然而,这在这里并没有发生,因为这是一个特例

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");                
    }
}