内存中引用变量和对象的逻辑结构/细节?

时间:2013-06-26 05:51:00

标签: java memory stack heap

我们说我们有一个班级:

class Class1
{
   int i = 1;
}

我们有一个变量:

Class1 ob1 = new Class1();
  • 引用本身存储在变量ob1中是否存储了它引用Class1对象的信息?
  • 存储Class1的堆的部分是否存储了Class1类型的信息?
  • 逻辑上如何看待这些信息?它是一个像application1.Class1这样的字符串,还是对某些引用类型池的引用?

如果您可以推荐此类信息的来源,我将非常感谢您提供此信息,但我无法在参考书中找到它。

4 个答案:

答案 0 :(得分:1)

每个java对象引用都在运行时知道它的类;这个所谓的“运行时类型信息”在这样的代码中使用:

if (obj instanceof class1) {
  // true!
}

您还可以通过obj.getClass()访问对象的类。这将返回class1.class,类Class<class1>的对象。请参阅Object.getClass方法。

(请注意,如果您的类已参数化为class1<T>,则T的类型将在运行时存储,因为“擦除”。)

我不知道类信息是用指针存储还是用数据存储;它可能是jvm中特定于实现的;但从实际的角度来看,这几乎不重要。 (所以要么回答1或2,要么两者都是“是”)。

3的答案是,就java程序员而言,运行时类型信息封装在类Class的对象中。在幕后,JVM可以以这种或那种方式实现这一点。

答案 1 :(得分:1)

回答你的问题:

  1. 不,它没有。引用只是一个引用,即堆中的某个地址,其中存储了相应的对象。没有必要在引用本身中存储有关引用类型的重复信息,因为实际上包含其引用地址的实数变量可以是各种类类型。

  2. 非常奇怪的问题。当然,是的,确实。此外,这个“堆的一部分”是一个对象,它包含这个特定的类描述。任何Class对象都包含有关该类的全名的信息,由它描述。

  3. 如果你的意思是它的结构,它没有被定义为逻辑上的样子:

  4. 2.7 Representation of Objects:

      

    Java虚拟机不强制要求任何特定的内部   对象的结构。

    但是如果我们讨论的是关于类类型的信息 - 是的,它只是一个String对象,因为Class对象的“类型”(它代表它) )只是相应类的名称。

答案 2 :(得分:1)

  

存储在变量ob1中的引用本身是否存储了该信息   它指的是Class1的对象?

即可。引用变量ob1仅存储它指向的对象的引用。有关该对象的信息已为应用程序(或JVM)所知。

  

存储Class1的堆的部分是否存储信息   它是Class1类型吗?

即可。有关正在加载的类的信息存储在method area中。正如this link中所述 对于它加载的每种类型,Java虚拟机必须在方法区域中存储以下类型的信息:

  • 类型的完全限定名称
  • 类型的直接超类的完全限定名称(除非类型是接口或类java.lang.Object,它们都没有超类)
  • 类型是类还是接口
  • 类型的修饰符(“public,abstract,final”的某个子集)
  • 任何直接超接口的完全限定名称的有序列表
  

逻辑上如何看待这些信息?这是一个字符串   application1.Class1或对某些引用类型池的引用?

在Java类文件和Java虚拟机中,类型名称始终存储为完全限定名称。例如,包java.lang中的类Object的完全限定名称表示为 java / lang / Object 在方法区域中,完全限定名称可以用设计者选择的任何形式和数据结构表示。

答案 3 :(得分:0)

enter image description here

这是JVM可以使用instanceOf在运行时为检查存储类信息的方案之一。

每个Java虚拟机必须能够确定有关其类的信息,仅提供对象的引用。出于多种原因需要这样做,包括类型安全转换和instanceof运算符。

  

这是Java虚拟机实现的一种方式   将类信息与对象的实例数据相关联。在   此图是指向包含类的数据结构的本机指针   信息与对象的实例变量一起存储。   JVM可以连接对象的各种方式的详细信息   具有类信息的数据超出了本文的范围。   这里要理解的重要一点是课堂信息会   在某种程度上与对象的实例数据相关联   实例数据包括对象类及其所有类的字段   超类。

Artima post on Object initialization

因此,当您执行instanceOf检查时,通过此指针访问有关该类的信息。但请记住,关于类信息存储的确切实现可能是特定于实现的。