为什么对象 class 有静态块?
Why Object class have static block?
我只想知道为什么 Object、String 等在 end.what 处有 static{} 块是在 Object Class.
中使用静态块
打开cmd提示符并输入
javap java.lang.Object
您看到的只是所有方法和字段声明。由于静态块有点像方法,因此您只会看到静态初始化器的空声明。
如果您查看第 40 行 java.lang.Object
的 OpenJDK 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?
我只想知道为什么 Object、String 等在 end.what 处有 static{} 块是在 Object Class.
中使用静态块打开cmd提示符并输入
javap java.lang.Object
您看到的只是所有方法和字段声明。由于静态块有点像方法,因此您只会看到静态初始化器的空声明。
如果您查看第 40 行 java.lang.Object
的 OpenJDK 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?