逻辑结构/参考变量和内存中的对象的细节?
假设我们有一堂课:
class Class1
{
int i = 1;
}
我们有一个变量:
Class1 ob1 = new Class1();
ob1
存储它引用Class1
对象的信息? Class1
存储的堆的部分是否存储Class1
类型的信息? 如果您能推荐这些信息的来源,我将非常感谢您提供该信息,我无法在参考书中找到它。
引用本身存储在变量ob1中是否存储它引用Class1对象的信息?
NO 。 引用变量ob1
只存储它指向的对象的引用。 并且有关该对象的信息已为应用程序(或JVM)所知。
Class1存储的堆的部分是否存储Class1类型的信息?
NO 。 有关正在加载的类的信息存储在方法区域中。 如此链接中所述
对于它加载的每种类型,Java虚拟机必须在方法区域中存储以下类型的信息:
在逻辑上如何看起来像这样的信息? 它是一个像application1.Class1的字符串或对某些引用类型池的引用?
在Java类文件和Java虚拟机中,类型名称始终以完全限定名称存储。 例如,包java.lang中的Object类的完全限定名称表示为java / lang / Object。 在方法领域中,完全限定名可以用设计者选择的任何形式和数据结构表示。
每个java对象引用在运行时都知道它的类; 这个所谓的“运行时类型信息”用于这样的代码中:
if (obj instanceof class1) {
// true!
}
你也可以通过obj.getClass()
来访问对象的类。 这将返回类Class<class1>
的对象class1.class
。 请参阅Object.getClass方法。
(请注意,如果您的类被参数化为class1<T>
,则由于“擦除”, T
的类型将不会在运行时存储。)
我不知道班级信息是与指针一起存储还是与数据一起存储; 它可能在jvm中是特定于实现的; 但从实际角度来看,这并不重要。 (所以答案1或2,或者两者都是“是”)。
对于3的答案是,就Java程序员而言,运行时类型信息被封装在Class
的对象中。 在封面之下,JVM可以以这种或那种方式实现这一点。
回答你的问题:
不,它没有 。 引用只是一个引用,即堆中的某个地址,其中存储了相应的对象。 没有必要在引用本身中存储关于引用类型的重复信息,因为实际上包含引用地址的实变量可以是不同的类类型。
非常奇怪的问题。 当然, 是的,它的确如此 。 而且,这个“堆的一部分”是一个包含这个特定类描述的对象。 任何Class
对象都包含该类所描述的全名。
如果你的意思是它的结构,它没有被定义为逻辑上的外观:
2.7对象的表示:
Java虚拟机不会为对象指定任何特定的内部结构。
但是如果我们正在谈论有关类类型的信息 - 是的,它只是一个String
对象,因为Class
对象(它所表示的)的“类型”只是对应类的名称。
上一篇: logical structure/details of a reference variable and object in the memory?
下一篇: Window.print Issues