当您取消打开一个对象时,存储的对象数据类型在哪里,以便编译器可以执行强制转换?

时间:2010-01-11 15:45:44

标签: java casting jvm

在内部,当您将对象强制转换为强类型对象时,如:

User u = (User)o;

存储对象的类型在哪里?它是存储在另一个位置还是存储实际对象的内存块中?

(我对这个话题知之甚少,所以我很可能会问一个没有完全意义的问题,但我希望你能得到它的要点)

2 个答案:

答案 0 :(得分:3)

每个对象的标头包含对派生程度最高的实现类的类型的引用。很像C ++中的“vtbl”。通常,这将是“C”结构而不是Java对象。我相信Azul(64位)版本的Hotspot使用32位紧凑型指针来缩短标题大小。

答案 1 :(得分:0)

在没有详细说明你的情况下,Java类的内部表示有一个名为constant pool的东西,它存储类和方法的描述符。这些符号链接最初是按需解决的(即首次访问时)。

从JVM规范,描述链接:

  

链接是获取的过程   类或接口的二进制形式   输入并将其组合到运行时中   Java虚拟机的状态,所以   它可以被执行。一个班级或   接口类型始终加载之前   它是联系在一起的。

因此,引用类型的实际类型信息与您引用它的类分开存储。

如果您有兴趣,可以在此处找到类别信息的链接:http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#1221