gpt4 book ai didi

java - 在接口(interface)的常量池中包含 java.lang.Object 的目的是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:09:46 24 4
gpt4 key购买 nike

编译如下界面:

package test;

public interface MyInterface {
public void foo();
}

并使用 javap -v -s test.MyInterface 检查编译后的代码显示以下内容(-s 打印成员签名):

  Compiled from "MyInterface.java"
public interface test.MyInterface
SourceFile: "MyInterface.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
#1 = Class #7 // test/MyInterface
#2 = Class #8 // java/lang/Object
#3 = Utf8 foo
#4 = Utf8 ()V
#5 = Utf8 SourceFile
#6 = Utf8 MyInterface.java
#7 = Utf8 test/MyInterface
#8 = Utf8 java/lang/Object
{
public abstract void foo();
Signature: ()V
flags: ACC_PUBLIC, ACC_ABSTRACT
}

我的问题是:为什么会有 java.lang.Object在常量池中,知道接口(interface)继承自Object上课?

此外,如果我将接口(interface)定义更改为:

public interface MyInterface extends Comparable<MyInterface> {
public void foo();
}

然后运行javap ,我得到以下信息:

  Compiled from "MyInterface.java"
public interface test.MyInterface extends java.lang.Comparable<test.MyInterface>
Signature: #7 // Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>;
SourceFile: "MyInterface.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
...

包含 java.lang.Object 的目的究竟是什么?在签名Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>;界面的?

此外,如果我尝试使用工具(特别是 JBE)查看字节码,它会错误地显示 MyInterfacejava.lang.Object作为具有类名的父类(super class) java.lang.Object保存在常量池中:

JBE screenshot

注意:使用jdk1.7.0_75

最佳答案

常量池中的Object 类引用是类文件格式在Java VM Specification 中定义的结果。 .

一个类文件由一个类文件结构组成:

ClassFile {
u4 magic; // The Famous 0xCAFEBABE
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
...
}

关于 super_class,JVM 规范的这一部分与您的 MyInterface 接口(interface)相关:

super_class

For an interface, the value of the super_class item must always be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure representing the class Object.

所以本质上,java/lang/Object 常量只需要用有效值填充 super_class 项。所有 Java 实例始终是基本 Object 类的实例,但这次真正的答案更多地与 JVM 的构建方式和特定的实现选择有关,而不是与语言本身有关。

此外,正如@Holger 所指出的,这一段也值得一提:

If the value of the super_class item is zero, then this class file must represent the class Object, the only class or interface without a direct superclass.

关于java - 在接口(interface)的常量池中包含 java.lang.Object 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com