为什么Object类有静态块?

时间:2016-02-05 17:23:39

标签: java static-block

我想知道为什么Object,String等最后会有static {}阻塞。在Object Class中使用静态块是什么。

打开cmd提示符并键入

javap java.lang.Object

enter image description here

1 个答案:

答案 0 :(得分:10)

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

如果您在第40行查看java.lang.Object的{​​{3}},代码实际上就是这样说的

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()的内容,可以阅读这篇文章。

OpenJDK source code