首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在接口常量池中包含java.lang.Object的目的是什么?

在接口常量池中包含java.lang.Object的目的是什么?
EN

Stack Overflow用户
提问于 2015-06-01 14:03:08
回答 2查看 432关注 0票数 13

编译以下接口:

代码语言:javascript
复制
package test;

public interface MyInterface {
    public void foo();
}

使用javap -v -s test.MyInterface检查编译后的代码如下(-s打印成员签名):

代码语言:javascript
复制
  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,因为知道而不是继承了Object类的接口?

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

代码语言:javascript
复制
public interface MyInterface extends Comparable<MyInterface> {
    public void foo();
}

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

代码语言:javascript
复制
  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作为超类保存在常量池中,类名为java.lang.Object

注:使用jdk1.7.0_75

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-01 14:35:42

常量池中的Object类引用是如何在Java规范中定义类文件格式的结果。

类文件由单个ClassFile结构组成:

代码语言:javascript
复制
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接口相关:

super_class 对于接口,super_class项的值必须始终是constant_pool表的有效索引。该索引处的constant_pool条目必须是表示类ObjectCONSTANT_Class_info结构。

因此,从本质上说,只需要java/lang/Object常量就可以用有效值填充super_class项。所有的Object实例都是基本Java类的实例,但这一次真正的答案更多的是关于JVM是如何构建的,以及具体的实现选择,而不是语言本身。

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

如果super_class项的值为零,则该类文件必须表示类Object,这是唯一没有直接超类的类或接口。

票数 9
EN

Stack Overflow用户

发布于 2015-06-01 14:35:00

实际上,所有的Java语言都是Object。在Java中,每个构造都是对象。

代码语言:javascript
复制
Class IS Object
Interface IS Object
Enum IS Object.

所以当您构建程序时,Object会自动打包。因为*.class可以在另一个JVM上使用。

@user43250937在本例中是正确的也是

代码语言:javascript
复制
JVM Spec :

由Java虚拟机执行的编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在文件中,称为类文件格式。类文件格式精确地定义了类或接口的表示形式,包括一些细节,例如在特定于平台的对象文件格式中可能被视为理所当然的字节排序。

可能是这个链接授予您更多的信息。

Java-bytecode-fundamentals-using-objects-and-calling-methods

代码语言:javascript
复制
4:  invokeinterface #5,  1; //InterfaceMethod Job.execute:()Ljava/lang/Object;

JVM规范

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30575597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档