java - Java 中的静态 block 未执行

标签 java static access-modifiers

class Test {
    public static void main(String arg[]) {    
        System.out.println("**MAIN METHOD");
        System.out.println(Mno.VAL); // SOP(9090);
        System.out.println(Mno.VAL + 100); // SOP(9190);
    }

}

class Mno {
    final static int VAL = 9090;
    static {
        System.out.println("**STATIC BLOCK OF Mno\t: " + VAL);
    }
}

我知道加载类时会执行一个static block 。但在这种情况下,类 Mno 中的实例变量是 final,因此 static block 没有执行。

为什么会这样?如果我删除 final,它能正常工作吗?

哪个内存将首先分配,static final 变量还是 static block ?

如果由于 final 访问修饰符没有加载类,那么变量如何获得内存?

最佳答案

  1. static final int 字段是一个编译时常量,它的值被硬编码到目标类中而不引用其来源;
  2. 因此您的主类不会触发包含该字段的类的加载;
  3. 因此不执行该类中的静态初始值设定项。

具体的细节,编译后的字节码是这样对应的:

public static void main(String arg[]){    
    System.out.println("**MAIN METHOD");
    System.out.println(9090)
    System.out.println(9190)
}

一旦删除 final,它就不再是编译时常量,并且上述特殊行为不再适用。 Mno 类按预期方式加载,并执行其静态初始化程序。

关于java - Java 中的静态 block 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200353/

相关文章:

c++ - 在类定义中定义静态常量整数成员

c# - 我可以将 C# 扩展方法的可见性限制为同一程序集中的类吗?

java - 我可以在公共(public)方法中声明私有(private)变量吗?

java - JPA @ManyToOne 映射指向同一列的多个字段

java - IllegalArgumentException : com. sun.xml.internal.messaging.saaj.soap.LocalStrings != com.sun.xml.messaging.saaj.soap.LocalStrings

php - 静态变量 PHP 的问题

java - 单例类的优势是什么?

java - 使用 protected 构造函数实例化一个类

java - 参数化方法的动态多态性

java - 更改 netbeans 中的 list (Trusted-Library=true 属性)