7

Let's say we have a class:

class Class1
{
   int i = 1;
}

and we have a variable:

Class1 ob1 = new Class1();
  • Does a reference itself stored in a variable ob1 store the information that it refers to an object of Class1?
  • Does the part of the heap where Class1 is stored store the information that it is of Class1 type?
  • How does logically looks like this information? It's a string like application1.Class1 or a reference to some reference types pool?

If you can recommend the source of such information I'll be very grateful for providing it I can't find it in the reference book.

4

4 回答 4

1

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

没有。引用变量ob1只存储它所指向的对象的引用。并且有关该对象的信息对于应用程序(或 JVM)来说是已知的。

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

没有。有关正在加载的类的信息存储在方法区中。正如此链接中所指定的,
对于它加载的每种类型,Java 虚拟机必须在方法区域中存储以下类型的信息:

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

这些信息在逻辑上看起来如何?它是像 application1.Class1 这样的字符串还是对某些引用类型池的引用?

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

于 2013-06-26T08:31:11.553 回答
1

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

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

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

(请注意,如果您的类是参数化的 as ,则由于“擦除” class1<T>,该类型T不会在运行时存储。)

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

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

于 2013-06-26T06:07:46.183 回答
1

回答你的问题:

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

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

  3. 如果你指的是它的结构,它没有被定义为它的逻辑外观:

2.7 对象的表示:

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

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

于 2013-06-26T06:35:05.473 回答
0

在此处输入图像描述

这是 JVM 可以存储类信息以在运行时使用instanceOf.

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

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

关于对象初始化的 Artima 帖子

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

于 2013-06-26T06:31:05.260 回答