【问题标题】:Why Object class have static block?为什么对象类有静态块?
【发布时间】:2016-05-15 18:34:45
【问题描述】:

我只想知道为什么Object,String等在末尾有static{}块。在Object Class中静态块的用途是什么。

打开cmd提示符并输入

javap java.lang.Object

【问题讨论】:

  • 能否请您用相关代码的实际文本替换该图像?
  • 那只是一个静态初始化器,基本上...
  • @MUSTKEEMMANSURI 你刚刚在你的问题中问了这个问题。没有必要发表评论说同样的话。

标签: java static-block


【解决方案1】:

您正在查看的只是所有方法和字段声明。由于静态块有点像一个方法,你只会看到静态初始化器的空声明。

如果你在第 40 行查看 OpenJDK source codejava.lang.Object,代码实际上是这样写的

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

What does the registerNatives() method do?

【讨论】:

  • 我相信这应该添加到javap命令描述中。 Doc 说“当不使用任何选项时,javap 命令打印包、受保护和公共字段以及传递给它的类的方法。javap 命令将其输出打印到标准输出。” docs.oracle.com/javase/8/docs/technotes/tools/windows/… 或者它们是否包含在上述项目之一中?
  • @ShireResident - 我相信静态块是包私有范围定义的。 (因为上面没有 public/private/protected 修饰符)
  • 我实际上更关注“领域”和“方法”。我不认为静态块被认为是其中之一。
  • @ShireResident - 不确定我是否理解。静态块就像一个在类初始化时运行一次的方法。 java.lang.Object 中没有字段
  • 我只是询问有关术语的问题,因为 Oracle 文档通常非常具体 - 只是为了加深我的理解。方法docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4 单独定义为“静态块”docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.7,但构造函数也是如此。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2015-04-03
  • 1970-01-01
  • 2023-03-06
  • 2011-01-24
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多