为什么对象 class 有静态块?

Why Object class have static block?

我只想知道为什么 Object、String 等在 end.what 处有 static{} 块是在 Object Class.

中使用静态块

打开cmd提示符并输入

javap java.lang.Object

您看到的只是所有方法和字段声明。由于静态块有点像方法,因此您只会看到静态初始化器的空声明。

如果您查看第 40 行 java.lang.ObjectOpenJDK source code,代码实际上是这样说的

public class Object {

     private static native void registerNatives();
     static {
         registerNatives();
     }

静态块的一个简单解释是该块只被调用一次,无论您创建了多少该类型的对象。


如果你想从命令行获得更多信息,javap -verbose java.lang.Object输出这个

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=0, locals=0, args_size=0
         0: invokestatic  #16                 // Method registerNatives:()V
         3: return
      LineNumberTable:
        line 41: 0
        line 42: 3
}

或者,不那么冗长 javap -c java.lang.Object

  static {};
    Code:
       0: invokestatic  #16                 // Method registerNatives:()V
       3: return

如果您想了解 registerNatives() 的作用,可以阅读这篇 post。

What does the registerNatives() method do?