Java 为什么静态块中的代码不执行?
在这里,当我在Java 为什么静态块中的代码不执行?,java,Java,在这里,当我在mainstatic块中打印常量时,我执行了一个程序。。 但是当我打印执行的stat时,java中的static final有什么重要性吗。。? 请解释一下 package com.test.doubt;` class Doubt { public static final int constant = 123; public static int stat = 123; static { System.out.println("Static Block"
main
static
块中打印常量时,我执行了一个程序。。
但是当我打印执行的stat
时,java中的static final
有什么重要性吗。。?
请解释一下
package com.test.doubt;`
class Doubt {
public static final int constant = 123;
public static int stat = 123;
static {
System.out.println("Static Block");
}
}
public class MyProgram {
public static void main(String[] args) {
System.out.println(Doubt.constant);
}
}
您的代码没有初始化怀疑
类,正是因为怀疑.constant
是一个常量。它的值在编译时被烘焙到MyProgram
中,您甚至可以在编译后删除dis疑。class
,您的程序仍将运行
跑
查看编译后代码的外观
有关构成常量表达式的内容,请参见。例如,这仍然是一个常数:
public static final String FOO = "Foo";
所有这些都是如此:
public static final String FOO = "Foo";
public static final String BAR = "Bar";
public static final String FOOBAR = FOO + BAR;
。。。但这不可能
public static final String NOT_A_CONSTANT = "Foo".substring(0, 1);
static final int
将作为其值直接编译到代码中。也就是说,JVM看到并正在执行:
System.out.println(123);
而且你根本没有触及你恰当命名的怀疑
类(这是一个不以这种方式指定常量的参数,顺便说一句。如果你更改了该值,你必须重新编译每个引用类)+1换句话说,javac
编译器优化了对怀疑
类的需求。@Thilo:不,只要字符串是编译时常量,它也会发生。详见JLS第15.28节。package com.test.com;类怀疑{public static final int constant=123;public static int stat=123;static{System.out.println(“static Block”);}}}}公共类MyProgram{public static void main(String[]args){//System.out.println(怀疑.constant);System.out.println(怀疑.stat);}
但此代码打印静态块,因此,我感到困惑,我只是尝试了一下,并且假设编译时已知的任何常量都会发生这种情况。还要注意,当您试图通过更新引用的类文件来更改常量时,会产生副作用。不起作用,因为定义仅在编译时(使用它的类)使用。
System.out.println(123);