我们说我们有一个班级:
class Class1
{
int i = 1;
}
我们有一个变量:
Class1 ob1 = new Class1();
ob1
中是否存储了它引用Class1
对象的信息? Class1
的堆的部分是否存储了Class1
类型的信息? 如果您可以推荐此类信息的来源,我将非常感谢您提供此信息,但我无法在参考书中找到它。
答案 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)
回答你的问题:
不,它没有。引用只是一个引用,即堆中的某个地址,其中存储了相应的对象。没有必要在引用本身中存储有关引用类型的重复信息,因为实际上包含其引用地址的实数变量可以是各种类类型。
非常奇怪的问题。当然,是的,确实。此外,这个“堆的一部分”是一个对象,它包含这个特定的类描述。任何Class
对象都包含有关该类的全名的信息,由它描述。
如果你的意思是它的结构,它没有被定义为逻辑上的样子:
2.7 Representation of Objects:
Java虚拟机不强制要求任何特定的内部 对象的结构。
但是如果我们讨论的是关于类类型的信息 - 是的,它只是一个String
对象,因为Class
对象的“类型”(它代表它) )只是相应类的名称。
答案 2 :(得分:1)
存储在变量ob1中的引用本身是否存储了该信息 它指的是Class1的对象?
否即可。引用变量ob1
仅存储它指向的对象的引用。有关该对象的信息已为应用程序(或JVM)所知。
存储Class1的堆的部分是否存储信息 它是Class1类型吗?
否即可。有关正在加载的类的信息存储在method area中。正如this link中所述 对于它加载的每种类型,Java虚拟机必须在方法区域中存储以下类型的信息:
逻辑上如何看待这些信息?这是一个字符串 application1.Class1或对某些引用类型池的引用?
在Java类文件和Java虚拟机中,类型名称始终存储为完全限定名称。例如,包java.lang中的类Object的完全限定名称表示为 java / lang / Object 。 在方法区域中,完全限定名称可以用设计者选择的任何形式和数据结构表示。
答案 3 :(得分:0)
这是JVM可以使用instanceOf
在运行时为检查存储类信息的方案之一。
每个Java虚拟机必须能够确定有关其类的信息,仅提供对象的引用。出于多种原因需要这样做,包括类型安全转换和instanceof运算符。
这是Java虚拟机实现的一种方式 将类信息与对象的实例数据相关联。在 此图是指向包含类的数据结构的本机指针 信息与对象的实例变量一起存储。 JVM可以连接对象的各种方式的详细信息 具有类信息的数据超出了本文的范围。 这里要理解的重要一点是课堂信息会 在某种程度上与对象的实例数据相关联 实例数据包括对象类及其所有类的字段 超类。
Artima post on Object initialization
因此,当您执行instanceOf
检查时,通过此指针访问有关该类的信息。但请记住,关于类信息存储的确切实现可能是特定于实现的。